我优化了一些代码。我需要a+b+c
和x+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的内部运作感到好奇,而不仅仅是我的开发过程。
答案 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 + c
和x + y + z
的重复计算造成的。