3

在 Ruby 中,经常说这yield比将块转换为Proc.

例如:

def method
  yield
end

def method &block
  block.call
end

但是,如果需要将一个块作为参数传递几层深怎么办?yield无论您向下传递多少层,总是更快?它取决于多少层,还是取决于每个闭包中的变量数量?

我问的原因是因为yield多层深度涉及多次将其包装成一个块,而将其转换为 aProc可能只需执行一次即可节省时间。我也想知道是否取决于to_proc方法中需要打包多少变量。

因此,哪个更快:

嵌套收益率?

def method1;method2 {yield};end
def method2;method3 {yield};end
  ...
def methodn;yield;end

还是&block

def method1 █method2 █end
def method2 █method3 █end
  ...
def methodn █block.call;end
4

1 回答 1

0
require "benchmark"

def test_yield
    yield
end

def test_block(&block)
    block.call
end

Benchmark.bm do |b|

    b.report("test_yield") {
        10000.times{ test_yield {1+1} }
    }

    b.report("test_block") {
        10000.times{ test_block {1+1} }
    }

end



      user     system      total        real
test_yield  0.000000   0.000000   0.000000 (  0.002623)
test_block  0.000000   0.000000   0.000000 (  0.009497)

似乎 Yield 比 block.call 更快。我很想知道为什么。

于 2013-04-18T20:37:28.207 回答