测量ruby脚本的估计完成时间

时间:2014-07-29 21:27:50

标签: ruby

我最近运行了很多脚本,迭代了超过10k-300k的对象,我想写一些估算脚本完成时间的代码(需要20-180分钟) 。我已经想象,虽然那里已经有了这样的东西。有吗?

澄清(编辑):

如果我要编写代码来执行此操作,它将通过测量执行"操作"所需的时间来工作。在单个对象上,将该时间量乘以剩余的对象数,并将其添加到当前时间。

当然,这只适用于你有一个涉及单个循环的脚本占用脚本总运行时间的99%的情况,并且你可以合理地期望能够计算半个 - 该循环的每次迭代的准确平均值。对于我喜欢估计完成时间的脚本,情况也是如此。

3 个答案:

答案 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

您可以轻松地将其重写为类或方法。