ruby - Ruby 2 中的惰性求值

标签 ruby lazy-evaluation

我最近安装了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/

相关文章:

ruby - 在 ruby​​193 上安装 watir gem 时出错

ruby - 在 Mac 上通过 export http_proxy 使用 Ruby 和 Charles Proxy

ruby - 如何使用 Ruby 生成 WSDL?

ruby-on-rails - View 中的反向链接应根据 Controller 更改

haskell - 是否存在具有未装箱矢量性能的无限列表?

haskell - haskell 中的惰性 IO : How to return a lazy list that is generated by some blocked IO?

ruby - yield 递归

haskell - 为什么没有 fold' 方法?

scala - 惰性val如何解决前向引用扩展了scala中值的定义

exception - 如何使用 unsafeInterleaveIO 处理异常?