哪个更快:计算还是赋值

Which is faster: calculation or 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 的内部运作方式,而不是开发过程。

您可以使用 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 的重复计算导致的。