我最近运行了很多脚本,迭代了超过10k-300k的对象,我想写一些估算脚本完成时间的代码(需要20-180分钟) 。我已经想象,虽然那里已经有了这样的东西。有吗?
澄清(编辑):
如果我要编写代码来执行此操作,它将通过测量执行"操作"所需的时间来工作。在单个对象上,将该时间量乘以剩余的对象数,并将其添加到当前时间。
当然,这只适用于你有一个涉及单个循环的脚本占用脚本总运行时间的99%的情况,并且你可以合理地期望能够计算半个 - 该循环的每次迭代的准确平均值。对于我喜欢估计完成时间的脚本,情况也是如此。
答案 0 :(得分:4)
查看progressbar
gem:https://github.com/peleteiro/progressbar
它会生成一个很好的进度条并估计完成时间(ETA):
example task: 67% |oooooooooooooooooooooo | ETA: 00:01:15
答案 1 :(得分:1)
您可以粒度测量脚本中每个方法的时间,然后按照here所述对组件求和。
答案 2 :(得分:1)
让您的流程运行,经过一段时间的迭代后,您可以测量经过的时间。然后,您可以使用该值作为剩余时间的估计值。这可确保始终根据当前任务动态估计时间。
这个例子非常详细,就像一个带有三重干酪的代码双倍大小:
# Some variables for this test
iterations = 1000
probe_at = (iterations * 0.1).to_i
time_total = 0
#======================================
iterations.times do |i|
time_start = Time.now
#you could yield here if this were a function
5000.times do # <tedius task simulation>
Math.sqrt(rand(200000))
end # <end of tedious task simulation>
time_total += time_taken = Time.now - time_start
if i == probe_at
iteration_cost = (time_total / probe_at)
time_left = iteration_cost * (iterations - probe_at)
puts "Time taken (ACTUAL): #{time_total} | iteration: #{i}"
puts "Time left (ESTIMATE): #{time_left} | iteration: #{i}"
puts "Estimated total: #{time_total + time_left} | iteration: #{i}"
end
if i == 999
puts "Time taken (ACTUAL): #{time_total} | iteration: #{i}"
end
end
您可以轻松地将其重写为类或方法。