【发布时间】:2016-05-31 09:10:25
【问题描述】:
此代码的执行时间约为 1 秒:
start_time = Time.now
prev = 1
(1..1000).each do |i|
(1..10000).each do |j|
result = j * prev
result = result + prev
result = result - prev
result = result / prev
prev = j
end
end
end_time = Time.now
printf('%f sec', end_time - start_time)
但是当我使用一个循环进行 10000000 次迭代(而不是上面写的 2 个循环、1000 和 10000 次迭代)时,它变得慢得多(大约 4.5 秒):
start_time = Time.now
prev = 1
(1..10000000).each do |j|
result = j * prev
result = result + prev
result = result - prev
result = result / prev
prev = j
end
end_time = Time.now
printf('%f sec', end_time - start_time)
为什么会这样?总迭代次数还是一样的。
【问题讨论】:
-
尝试在每种情况下调查
result的值。我认为10_000_000 * 9_999_999大于10_000 * 9_999。 -
第一个代码有 1.35 秒,第二个代码有 1.24 秒。变量
result不会过度增长,因为它每次都会重置。 -
所以基本上,第一个代码的迭代是 1.35 秒,第二个是 1.24 秒?奇怪的。尝试以较小的块记录执行,例如每 20% 的块。通过简单的检查,总负载应该会增加,因此不会明显影响测试。
-
无法重现:第一个是
1.288465 sec,第二个是1.219005 sec在我的电脑上。你想通过这些例子达到什么目的? -
@spickermann 我只是在控制台中运行这些脚本 :) Ruby 2.3 x64,Windows 10 x64。也许是操作系统导致了问题?
标签: ruby loops execution-time