ruby - 是 &method( :method_name) idiom bad for performance in Ruby?

标签 ruby performance

我最近遇到了 &method(:method_name) 语法。 (这使用 Object#method 方法 - RDoc link)例如,

[5, 7, 8, 1].each(&method(:puts))

相当于

[5, 7, 8, 1].each{|number| puts number}

在 Ruby 的各种实现中,与前者相比,后者是否存在性能损失?如果是,实现者是否正在努力提高其性能?

最佳答案

是的,这似乎对性能不利。

def time
  start = Time.now
  yield
  "%.6f" % (Time.now - start)
end

def do_nothing(arg)
end


RUBY_VERSION # => "1.9.2"

# small
ary = *1..10
time { ary.each(&method(:do_nothing)) }     # => "0.000019"
time { ary.each { |arg| do_nothing arg } }  # => "0.000003"


# large
ary = *1..10_000
time { ary.each(&method(:do_nothing)) }     # => "0.002787"
time { ary.each { |arg| do_nothing arg } }  # => "0.001810"


# huge
ary = *1..10_000_000
time { ary.each(&method(:do_nothing)) }     # => "37.901283"
time { ary.each { |arg| do_nothing arg } }  # => "1.754063"

看起来这在 JRuby 中得到了解决:

$ rvm use jruby
Using /Users/joshuajcheek/.rvm/gems/jruby-1.6.3

$ xmpfilter f.rb 
def time
  start = Time.now
  yield
  "%.6f" % (Time.now - start)
end

def do_nothing(arg)
end


RUBY_VERSION # => "1.8.7"

# small
ary = *1..10
time { ary.each(&method(:do_nothing)) }     # => "0.009000"
time { ary.each { |arg| do_nothing arg } }  # => "0.001000"


# large
ary = *1..10_000
time { ary.each(&method(:do_nothing)) }     # => "0.043000"
time { ary.each { |arg| do_nothing arg } }  # => "0.055000"


# huge
ary = *1..10_000_000
time { ary.each(&method(:do_nothing)) }     # => "0.427000"
time { ary.each { |arg| do_nothing arg } }  # => "0.634000"

关于ruby - 是 &method( :method_name) idiom bad for performance in Ruby?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6976629/

相关文章:

ruby-on-rails - 在 Rails 3 应用程序中使用 require_dependency 对性能有何影响?

performance - 当我每帧写入单个顶点缓冲区数千次时,如何提高 Direct3D 的性能?

performance - W3 Total Cache Wordpress 插件的等效 Drupal 7 模块是什么?

ruby - 在 Ruby 中请求类常量值返回此类中的所有定义值

ruby-on-rails - 为什么 Bundle Install 在 vendor/bundle 中安装 gem?

ruby - 如何从循环中捕获每个值并将其分配给数组? [ ruby ]

ruby - 按可能为 nil 的属性对对象的 ruby​​ 数组进行排序

ruby - 出于可移植性原因,在本地将 gems 安装到项目文件夹

linux - 我可以获得比/dev/null 更快的输出管道吗?

jquery 性能 td 替换