加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 01:53:07 所属栏目:百科 来源:网络整理
导读:b1 = Time.nowputs (1..100000).inject(0) { |x,y| x + y }a1 = Time.nowputs "Time for inject: #{a1 - b1}"b2 = Time.nowsum = 0(1..100000).each do |value| sum += valueendputs suma2 = Time.nowputs "Time for each: #{a2 - b2}" 上面的Ruby代码比较了
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)
%

更好的数学总是更快:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读