哪个更快:计算还是赋值
Which is faster: calculation or assignment
我正在优化一些代码。我需要 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 的内部运作方式,而不是开发过程。
您可以使用 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
的重复计算导致的。
我正在优化一些代码。我需要 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 的内部运作方式,而不是开发过程。
您可以使用 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
的重复计算导致的。