加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

更快的rubyFixnum乘法?

发布时间:2020-12-17 03:28:53 所属栏目:百科 来源:网络整理
导读:使用 ruby 1.9.2p290(2011-07-09修订版32553)[x86_64-linux] 我一直在进行大量的分析,并且我注意到ruby Fixnum乘法非常慢. 通过一些分析,我已经了解到这是(部分)因为每次调用Fixnum#*都涉及6次调用Kernel#kind_of. 我知道你可以写C扩展,但这些乘法遍布整个代
使用 ruby 1.9.2p290(2011-07-09修订版32553)[x86_64-linux]

我一直在进行大量的分析,并且我注意到ruby Fixnum乘法非常慢.

通过一些分析,我已经了解到这是(部分)因为每次调用Fixnum#*都涉及6次调用Kernel#kind_of.

我知道你可以写C扩展,但这些乘法遍布整个代码.那么,无论如何都要避免Ruby中的这种开销吗?

谢谢

解决方法

我严重怀疑这些测量是否准确,原因如下:

>您没有说明您正在使用哪种Ruby实现,但ruby-prof是一个Ruby分析器.它描述了Ruby代码.没有Ruby实现,我知道Fixnum#*是Ruby代码.在MRI,YARV,MRuby和tinyrb中它是C代码,在Rubinius中它是C代码,在MacRuby中它是Objective-C代码,在JRuby和XRuby中它是Java代码,在RubyGoLightly它是Go代码,在IronRuby和Ruby中. NET是C#代码,在MagLev和SmallRuby中它是Smalltalk代码,在Cardinal中它是PASM代码. ruby-prof可以配置Ruby代码,它不能分析C,C,Objective-C,Java,C#,Go,Smalltalk或PASM.只有Ruby.因此,它根本无法分析Fixnum#*.
> Fixnum#*不需要多次检查课程.它知道self是一个Fixnum,因为否则调用首先不会调度到Fixnum#*方法,所以它只需要检查参数.它还需要检查结果是否适合Fixnum,但它会在内部执行,而不是通过调用kind_of? (事实上??,这甚至没有意义:为了能够在乘法结果上调用方法,它首先必须构造结果对象,并且为了构造结果对象,它已经必须知道它是否适合Fixnum).
>通过调用kind_of不会进行类检查?并通过整个Ruby方法查找和方法调度机制.它是Ruby实现的内部函数,它可以访问所有私有内部实现细节,它只是直接检查类或调用一些内部解释函数,而不是Ruby方法kind_of?
>我在各种流行的Ruby实现中检查了Fixnum#*的实现,并没有找到对kind_of的任何调用?不幸的是,您没有说明您正在使用哪个Ruby实现.

> Rubinius:Fixnum::mul in vm/builtin/fixnum.cpp l. 78–89
> YARV:fix_mul in numeric.c l. 2596–2640
> JRuby:org.jruby.RubyFixnum.{op_mul,multiplyFixnum,multiplyOther} in src/org/jruby/RubyFixnum.java l. 472–520(例如,您可以清楚地看到该方法如何使用Java instanceof运算符而不是Ruby的kind_of?方法来检查类.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读