我最近安装了Ruby 2.0.0,发现它现在有一个lazy Enumerable mixin 的方法。根据以前使用函数式语言的经验,我知道这可以提高代码效率。
我做了一个惰性与渴望的基准测试(不确定它是否有实际意义),发现惰性总是更快。为什么是这样?是什么让惰性评估对于大输入更好?
基准代码:
#!/usr/bin/env ruby
require 'benchmark'
num = 1000
arr = (1..50000).to_a
Benchmark.bm do |rep|
rep.report('lazy') { num.times do ; arr.lazy.map { |x| x * 2 }; end }
rep.report('eager') { num.times do ; arr.map { |x| x * 2}; end }
end
基准报告示例:
user system total real
lazy 0.000000 0.000000 0.000000 ( 0.009502)
eager 5.550000 0.480000 6.030000 ( 6.231269)
最佳答案
它太懒了,甚至不做这项工作 - 可能是因为您实际上没有使用操作的结果。在其中放入 sleep()
进行确认:
> Benchmark.bm do |rep|
rep.report('lazy') { num.times do ; arr.lazy.map { |x| sleep(5) }; end }
rep.report('notlazy') { 1.times do ; [0,1].map { |x| sleep(5) } ; end }
end
user system total real
lazy 0.010000 0.000000 0.010000 ( 0.007130)
notlazy 0.000000 0.000000 0.000000 ( 10.001788)
关于ruby - Ruby 2 中的惰性求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16972184/