2

我最近安装了 Ruby 2.0.0,发现它现在有一个用于 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)
4

1 回答 1

5

它太懒了,甚至没有做这项工作——可能是因为你实际上并没有使用操作的结果。放一个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)
于 2013-06-06T21:16:58.170 回答