哪个更快:计算或分配

时间:2017-03-17 11:52:49

标签: ruby time variable-assignment

我优化了一些代码。我需要a+b+cx+y+z之和,我将计算这些变量的最小值和最大值。使用minmax不是一种选择。我将分别进行这些计算。

以下哪个代码块更快?

min, max = 0, 0
max = [max, a + b + c, x + y + z].max
min = [min, a + b + c, x + y + z].min

或者我可以这样做:

min, max = 0, 0
sum, sum2 = a + b + c,  x + y + z

max = [max, sum, sum2].max
min = [min, sum, sum2].min

这些变量的赋值然后调用比仅仅根据需要计算它们更快吗?如果我稍后在同一范围内需要这些总和,则为可读性分配变量更为清晰。

我只是对Ruby的内部运作感到好奇,而不仅仅是我的开发过程。

1 个答案:

答案 0 :(得分:2)

您可以使用Benchmark轻松测试此内容。

require 'benchmark'

a, b, c, x, y, z = [1,3,5,7,9,11]

n = 1000000
Benchmark.bm do |bench|
  bench.report("1") { 
    n.times do 
      min, max = 0, 0;
      max = [max, a + b + c, x + y + z].max;
      min = [min, a + b + c, x + y + z].min;
    end
  }
  bench.report("2") { 
    n.times do
      min, max = 0, 0;
      sum, sum2 = a + b + c,  x + y + z;
      max = [max, sum, sum2].max;
      min = [min, sum, sum2].min;
    end
  }
end

导致

bash-3.2$ ruby rubyspeed.rb
       user     system      total        real
1  0.160000   0.000000   0.160000 (  0.154085)
2  0.120000   0.000000   0.120000 (  0.119762)
bash-3.2$

所以第二个会更快。这可能是a + b + cx + y + z的重复计算造成的。