bp什么意思| 什么是假性自闭症| 儿童受凉咳嗽吃什么药| vogue什么意思| 天堂是什么意思| 烟卡是什么| 男生学什么技术吃香| 眼睛突然红了是什么原因| 哪吒长什么样子| 三伏吃什么| 登对是什么意思| 血小板是干什么用的| 梦见女尸是什么预兆| 褥疮用什么药最好| 鸡蛋花的花语是什么| 梦见吃葡萄是什么意思| 气滞是什么意思| 慈爱是什么意思| 神器积分换什么最划算| 1936年属什么生肖| 鸟字旁有什么字| 肿瘤是什么样子的| 凉皮加什么才柔软筋道| 蚕除了吃桑叶还能吃什么| 鳄鱼的尾巴有什么作用| 尿微量白蛋白高吃什么药| 五粮液是什么香型的酒| 六月初二是什么星座| 郑州有什么好吃的| 矢量是什么意思| 机能是什么意思| 右手无名指戴戒指是什么意思| 农历5月17日是什么星座| 裂变是什么意思| 什么酒不能喝打一生肖| 在什么什么后面的英文| 孕妇吃什么最好| 谷朊粉是什么| 为什么会缺铁性贫血| 防腐剂是什么| 骨质疏松吃什么药| 视线模糊是什么原因| 河汉是什么意思| xswl是什么意思| 股票融是什么意思| 什么是鼻炎| 早上起床口苦口干是什么原因| left什么意思| 医生为什么喜欢开地塞米松| 艾草长什么样| 球蛋白是什么| 白介素8升高说明什么| 为什么闭眼单脚站不稳| 血压下午高是什么原因| 青春永驻是什么意思| ad是补什么的| 老公梦见老婆出轨是什么意思| 前列腺增生有什么症状| 梦到捡钱是什么意思| 舌头发硬是什么原因| 男人头发硬说明什么| 尚可什么意思| 人体缺硒会有什么症状| 颈椎病用什么药| 麦粒肿是什么原因引起的| 照影是什么检查| 眼皮有点肿是什么原因| 地奥司明片治疗什么病| 麻腮风疫苗是预防什么| 左肾钙乳症是什么病| 血糖忽高忽低是什么原因| 心字底的字有什么| 羊的守护神是什么菩萨| 查询电话号码拨打什么| 看情况是什么意思| 变应性鼻炎是什么意思| 胆囊壁稍毛糙是什么意思| 什么叫扁平疣长什么样| 乌鸦兄弟告诉我们什么道理| 高血压挂号要挂什么科| 心肌酶高有什么危害| 口腔溃疡吃什么菜| 无纺布是什么材料做的| 慈禧属什么生肖| 留个念想是什么意思| 盆腔炎吃什么药最有效| 无痛人流后需要注意什么| 枣红色配什么颜色好看| 夫妻都是a型血孩子是什么血型| 红参有什么作用| 什么瓜不能吃脑筋急转弯| 劫富济贫是什么意思| 吃什么去湿气最快| 蜂蜜不能和什么一起吃| 乌龟喜欢吃什么| 为什么感冒会全身酸痛| 破伤风伤口有什么症状| 1月13日什么星座| 心脏跳动过快吃什么药| 深圳市长是什么级别| 超管是什么| 甲状腺看什么科| 一直发低烧是什么原因| 狮子座什么性格| 单纯是什么意思| 胆固醇高吃什么最好| 尿液中有泡沫是什么原因| 子宫瘢痕是什么意思| 吃b族维生素有什么好处| 甲减不能吃什么东西| 有点尿血是什么原因| 什么的东风填词语| 弄璋之喜是什么意思| 阴唇痒是什么原因| 市监狱长是什么级别| 晚上七点多是什么时辰| 晞字五行属什么| 贝字旁与什么有关| 膝关节退行性改变是什么意思| 半胱氨酸是什么| heineken是什么啤酒| 自残是什么心理| 背疼是什么原因| 耳鸣是什么原因引起的嗡嗡的响| 非虫念什么| 什么叫留守儿童| 大便不成型吃什么药| 女人吃桑葚有什么好处| 月抛什么意思| 三门代表什么生肖| 吃大枣有什么好处| 什么是青光眼| 血便是什么原因引起的| 埃及法老是什么意思| 肺部疼痛是什么原因| 甲胎蛋白是什么| 辛弃疾字什么号什么| 胃一阵一阵的疼是什么原因| 鸡蛋壳薄是什么原因| 什么是危险期| 男性解脲支原体是什么病| 系统b超主要检查什么| perry是什么意思| 肠粉是用什么粉做的| 区级以上医院是什么意思| 三七植物长什么样子| 尿隐血弱阳性什么意思| 四个口是什么字| 孕妇吃海参对胎儿有什么好处| 钉钉是什么| 牙龈炎吃什么药最有效| 喉咙痛吃什么药效果最好| 台湾高山茶属于什么茶| 布谷鸟长什么样| 望尘莫及的及是什么意思| simon是什么意思| 耳洞发炎用什么药| 什么是脂蛋白a| 肝部有阴影一般都是什么病| 鱼豆腐是用什么做的| 眼睛飞蚊症吃什么药| 一什么珍珠| 骨头坏死是什么感觉| sjb什么意思| 督邮相当于现在什么官| 健康的舌苔是什么样的| 11月29是什么星座| 肾阴虚有什么症状| 吃激素有什么副作用| 什么治便秘| 什么布料最凉快| 旗舰是什么意思| 安眠药有什么副作用| 诛心是什么意思| 房速与房颤有什么区别| 人性的弱点是什么| 水瓶是什么象星座| 深呼吸有什么好处| cd8高是什么原因| 坐飞机要什么证件| 好男儿志在四方是什么生肖| 脸上突然长痣是什么原因| 桑葚有什么作用| geneva是什么牌子手表| 黑眼圈是什么原因| 小孩记忆力差是什么原因| 边字是什么结构| 粤菜是什么口味| 红脸代表什么| 7月8日什么星座| 什么男什么女的成语| 连续放屁是什么原因呢| 上火是什么症状| 扁桃体肥大吃什么药好得快| 喝啤酒头疼是什么原因| 鳘鱼是什么鱼| 梦见和老公结婚是什么意思| 宝字五行属什么| 羽五行属什么| 什么是阴虚火旺| 负利率是什么意思| 泡打粉是什么东西| 味精和鸡精有什么区别| 多尔衮是什么意思| 属猴的跟什么属相最配| 出库是什么意思| 上颌窦炎是什么症状| 6月30日什么星座| 番茄什么时候种植| 过期不候是什么意思| 臭虫怕什么| 洁身自好什么意思| 一月十八号是什么星座| 袋鼠是什么动物| 什么值得买| 魔芋粉是什么做的| 秦始皇为什么叫祖龙| 我方了是什么意思| 男人阴茎硬不起来是什么原因| 茄子不能和什么一起吃| 圆是什么图形| oem贴牌是什么意思| 孕早期是什么时候| 毛泽东什么时候死的| 梦见爆炸是什么意思| 七月一日是什么节日| 摩尔每升是什么单位| 公开遴选公务员是什么意思| 看乳腺挂什么科| 手脚肿胀是什么原因引起的| ddp是什么化疗药| 预防水痘吃什么药| 产后抑郁症有什么表现症状| 下作是什么意思| 无功无过是什么意思| 心电图诊断窦性心律什么意思| 阴历7月22什么日子| 阑尾炎是什么原因引起的| 细胞骨架是由什么构成| 小孩牙疼有什么办法| 白蛋白低是什么意思| 腰疼吃什么药| 排暖期是什么时候| 什么是月经| 手表五行属什么| 孕妇梦见坟墓是什么预兆| 火龙果有什么好处| 英国全称是什么| 病退需要什么条件| 什么样的毛刺是良性的| 查钙含量做什么检查| 睡觉小腿抽筋是什么原因| 社保局是干什么的| 迷糊是什么意思| 高五行属什么| 菡什么意思| 确幸是什么意思| 反刍什么意思| 玻璃人是什么意思| 牙齿出血是什么病| 缺钾是什么原因造成的| 680分能上什么大学| 河南的特产是什么| 胃肠性感冒吃什么药| 百度
Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[Feature #20425] Speeding up delegate methods

乙肝表面抗原是什么意思

百度 新时期统战工作实践也需要统战理论给以科学指导,因此加强统一战线科学问题的研究被重新提上议事日程。

Slides for the Ruby core dev meeting on speeding up delegates

Avatar for Aaron Patterson

Aaron Patterson

May 14, 2024
Tweet

More Decks by Aaron Patterson

Other Decks in Programming

Transcript

  1. Targeted methods def recv(a, b) a + b end def

    call(...) recv(...) end … receivers … call sites
  2. Targeted methods ISEQs and call sites are tagged def recv(a,

    b) a + b end def call(...) recv(...) end call(1, 2) ISEQs tagged as forwardable Call sites tagged as forwarding
  3. Targeted methods ISEQs and call sites are tagged def recv(a,

    b) a + b end def call(...) recv(...) end call(1, 2) Stack self 1 2 ME BH TYPE self 1 2 CALL_INFO memcpy( ) ISEQs tagged as forwardable Call sites tagged as forwarding CALL_INFO
  4. All Forwardable Callers Supported All … forms are supported (callers

    and callees) def call(...) recv(...) end call(a: 1, b: 2) call(**foo) call(1, 2) { } # etc
  5. All Forwarding Callers Supported Forwarding allows more parameters def call(...)

    recv("hello", ...) end def call2(...) x = [3, 4, 5] recv(*x, ...) end
  6. Stack Escape Works No GC Modi fi cations Required def

    recv(a, b) a + b end def call(...) lambda { |x| recv(x, ...) } end call(1).call(2) Stack self 1 CALL_INFO Escapes with lambda
  7. Benchmark Test calling in to a … method (positional parameters)

    def recv(a, b) a + b end def call(...) recv(...) end # def run # call(1, 2) # call(1, 2) # call(1, 2) # ... eval "def run; " + 200.times.map { "call(1, 2)" }.join("; ") + "; end" 200000.times do run end
  8. Benchmark Results (~ 2x faster) $ hyperfine 'fwd/miniruby -v test2.rb'

    'master/miniruby -v test2.rb' Benchmark 1: fwd/miniruby -v test2.rb Time (mean ± σ): 1.237 s ± 0.018 s [User: 1.233 s, System: 0.002 s] Range (min … max): 1.223 s … 1.286 s 10 runs Benchmark 2: master/miniruby -v test2.rb Time (mean ± σ): 2.791 s ± 0.010 s [User: 2.779 s, System: 0.008 s] Range (min … max): 2.770 s … 2.803 s 10 runs Summary fwd/miniruby -v test2.rb ran 2.26 ± 0.03 times faster than master/miniruby -v test2.rb
  9. Benchmark Test calling in to a … method (keyword parameters)

    def recv(a:, b:) a + b end def call(...) recv(...) end # def run # call(a: 1, b: 2) # call(a: 1, b: 2) # call(a: 1, b: 2) # call(a: 1, b: 2) # ... eval "def run; " + 200.times.map { "call(a: 1, b: 2)" }.join("; ") + "; end" 200000.times do run end
  10. Benchmark Results (~3x faster) Keyword Arguments $ hyperfine 'fwd/miniruby -v

    test2.rb' 'master/miniruby -v test2.rb' Benchmark 1: fwd/miniruby -v test2.rb Time (mean ± σ): 1.531 s ± 0.021 s [User: 1.527 s, System: 0.002 s] Range (min … max): 1.502 s … 1.577 s 10 runs Benchmark 2: master/miniruby -v test2.rb Time (mean ± σ): 4.863 s ± 0.021 s [User: 4.845 s, System: 0.011 s] Range (min … max): 4.846 s … 4.909 s 10 runs Summary fwd/miniruby -v test2.rb ran 3.18 ± 0.05 times faster than master/miniruby -v test2.rb
  11. Benchmark Inline cache misses class A def a; end end

    class B < A; end a = A.new b = B.new def call_method(obj) obj.a # never hits inline cache end # def run(a, b) # call_method(a) # call_method(b) # call_method(a) # call_method(b) # ... eval "def run(a, b); " + 200.times.map { "call_method(a); call_method(b)" }.join("; ") + "; end" 200000.times do run(a, b) end opt_send_without_block Never hits inline cache
  12. Benchmark results Inline cache misses $ hyperfine 'fwd/miniruby -v test.rb'

    'master/miniruby -v test.rb' Benchmark 1: fwd/miniruby -v test.rb Time (mean ± σ): 1.694 s ± 0.020 s [User: 1.690 s, System: 0.002 s] Range (min … max): 1.665 s … 1.719 s 10 runs Benchmark 2: master/miniruby -v test.rb Time (mean ± σ): 1.703 s ± 0.015 s [User: 1.698 s, System: 0.002 s] Range (min … max): 1.679 s … 1.723 s 10 runs Summary fwd/miniruby -v test.rb ran 1.00 ± 0.02 times faster than master/miniruby -v test.rb
  13. Benchmark Inline cache misses with block class A def a;

    end end class B < A; end a = A.new b = B.new def call_method(obj) obj.a { } # Always send instruction end # def run(a, b) # call_method(a) # call_method(b) # call_method(a) # call_method(b) # ... eval "def run(a, b); " + 200.times.map { "call_method(a); call_method(b)" }.join("; ") + "; end" 200000.times do run(a, b) end send Never hits inline cache
  14. Benchmark results Inline cache misses with block $ hyperfine 'fwd/miniruby

    -v test.rb' 'master/miniruby -v test.rb' Benchmark 1: fwd/miniruby -v test.rb Time (mean ± σ): 1.871 s ± 0.015 s [User: 1.866 s, System: 0.002 s] Range (min … max): 1.852 s … 1.898 s 10 runs Benchmark 2: master/miniruby -v test.rb Time (mean ± σ): 1.723 s ± 0.007 s [User: 1.719 s, System: 0.002 s] Range (min … max): 1.710 s … 1.734 s 10 runs Summary master/miniruby -v test.rb ran 1.09 ± 0.01 times faster than fwd/miniruby -v test.rb
  15. Benchmark Super calls (no cache) class A def a; end

    end class B < A; def a; super; end end b = B.new def call_method(obj) obj.a # Calls invoke_super end # def run(b) # call_method(b) # call_method(b) # ... eval "def run(b); " + 400.times.map { "call_method(b)" }.join("; ") + "; end" 200000.times do run(b) end invokesuper Never hits inline cache
  16. Benchmark results Super calls (no cache) $ hyperfine 'fwd/miniruby -v

    test.rb' 'master/miniruby -v test.rb' Benchmark 1: fwd/miniruby -v test.rb Time (mean ± σ): 2.553 s ± 0.127 s [User: 2.547 s, System: 0.002 s] Range (min … max): 2.397 s … 2.747 s 10 runs Benchmark 2: master/miniruby -v test.rb Time (mean ± σ): 2.240 s ± 0.055 s [User: 2.234 s, System: 0.002 s] Range (min … max): 2.170 s … 2.310 s 10 runs Summary master/miniruby -v test.rb ran 1.14 ± 0.06 times faster than fwd/miniruby -v test.rb
  17. Initialize with Keyword Args Benchmark class Foo def initialize(a:, b:)

    @a = a @b = a end end def call(a, b) Foo.new(a:, b:) end # def run # call(1, 2) # call(1, 2) # ... eval "def run; " + 200.times.map { "call(1, 2)" }.join("; ") + "; end" 200000.times do run end
  18. Benchmark results: 40% faster Initialize can be faster in Ruby

    $ hyperfine 'fwd/miniruby -v test2.rb' 'master/miniruby -v test2.rb' Benchmark 1: fwd/miniruby -v test2.rb Time (mean ± σ): 3.737 s ± 0.070 s [User: 3.724 s, System: 0.008 s] Range (min … max): 3.651 s … 3.816 s 10 runs Benchmark 2: master/miniruby -v test2.rb Time (mean ± σ): 5.276 s ± 0.028 s [User: 5.257 s, System: 0.012 s] Range (min … max): 5.235 s … 5.314 s 10 runs Summary fwd/miniruby -v test2.rb ran 1.41 ± 0.03 times faster than master/miniruby -v test2.rb
感想是什么意思 1208是什么星座 见血封喉什么意思 欧派什么意思 早上吃玉米有什么好处
烤乳扇是什么 ab型血和b型血生的孩子是什么血型 产妇吃什么下奶快又多又营养 夏朝前面是什么朝代 什么是劣药
维生素b4又叫什么 哆啦a梦的寓意是什么 支原体吃什么药最有效 五指毛桃有什么用 自渡是什么意思
一诺千金是什么生肖 北京有什么好吃的美食 脾囊肿是什么原因引起的 考核是什么意思 c1是什么意思
五月二十四号是什么星座creativexi.com 牛头马面指什么生肖hcv9jop0ns5r.cn playboy是什么牌子adwl56.com 肚脐下面是什么部位hcv7jop4ns7r.cn 滑膜炎用什么膏药好hcv8jop6ns1r.cn
吉士粉是什么东西xinmaowt.com 忌入宅是什么意思hcv7jop9ns3r.cn beams是什么品牌hkuteam.com 嘴角疱疹用什么药膏hcv8jop1ns3r.cn 家字是什么结构hcv7jop9ns8r.cn
十二月七号是什么星座hcv8jop2ns6r.cn 酥油是什么油hcv9jop5ns4r.cn 诸葛亮发明了什么hcv8jop8ns8r.cn 牛骨煲汤搭配什么最好hcv8jop1ns6r.cn 长期喝饮料对身体有什么危害hcv9jop7ns1r.cn
血小板压积偏低是什么原因hcv9jop5ns1r.cn 女人左下眼皮跳是什么预兆luyiluode.com 女人为什么会阳虚hcv8jop4ns9r.cn 天肖是什么生肖hcv9jop6ns7r.cn kipling是什么牌子onlinewuye.com
百度 技术支持:克隆侠蜘蛛池 www.kelongchi.com