微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Ruby Map / Reduce功能是否必须高效?

b1 = Time.Now
puts (1..100000).inject(0) { |x,y| x + y }
a1 = Time.Now
puts "Time for inject: #{a1 - b1}"

b2 = Time.Now
sum = 0
(1..100000).each do |value|
    sum += value
end
puts sum
a2 = Time.Now
puts "Time for each: #{a2 - b2}"

上面的Ruby代码比较了两种求和整数的方法.令我惊讶的是,更优雅的注入或减少方法胜过另一方.为什么会这样?人们为什么要使用低效注入或减少?只是因为它很优雅?

PS:感谢所有鼓舞人心的答案.我的目的是询问导致这些差异的幕后情况.

解决方法

在这种情况下我会用一点点数学:

require "benchmark"

N = 5_000_000

Benchmark.bmbm do |bm|
  bm.report "inject 1" do
    (1..N).inject(0) { |x,y| x + y }
  end

  bm.report "inject 2" do
    (1..N).inject(:+)
  end

  bm.report "each" do
    sum = 0
    (1..N).each do |value|
      sum += value
    end
  end

  bm.report "sum of finite arithmetic progression" do
    ((1 + N) * N) / 2
  end
end

结果是:

% ruby sum.rb
Rehearsal ------------------------------------------------------------------------
inject 1                               0.500000   0.000000   0.500000 (  0.507497)
inject 2                               0.320000   0.000000   0.320000 (  0.322675)
each                                   0.370000   0.000000   0.370000 (  0.380504)
sum of finite arithmetic progression   0.000000   0.000000   0.000000 (  0.000005)
--------------------------------------------------------------- total: 1.190000sec

                                           user     system      total        real
inject 1                               0.500000   0.000000   0.500000 (  0.507697)
inject 2                               0.320000   0.000000   0.320000 (  0.322323)
each                                   0.370000   0.000000   0.370000 (  0.380307)
sum of finite arithmetic progression   0.000000   0.000000   0.000000 (  0.000004)
%

更好的数学总是更快:)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐