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

度量ruby脚本的估计完成时间,ruby,Ruby,我最近运行了很多脚本,这些脚本迭代了10k-300k对象,我正在考虑编写一些代码来估计脚本的完成时间(它们需要20-180分钟)。我不得不想象,虽然有某种东西已经在做这件事了。有吗 澄清(编辑): 如果我编写代码来实现这一点,它将通过测量在单个对象上执行“操作”所需的时间,将该时间量乘以剩余对象的数量,并将其添加到当前时间来工作 诚然,这只适用于脚本涉及单个循环的情况,该循环占脚本总运行时间的99%,并且您可以合理地期望能够计算该循环每次迭代的半精确平均值。这是真实的脚本,我想估计完成时间 您可

我最近运行了很多脚本,这些脚本迭代了10k-300k对象,我正在考虑编写一些代码来估计脚本的完成时间(它们需要20-180分钟)。我不得不想象,虽然有某种东西已经在做这件事了。有吗

澄清(编辑):

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


诚然,这只适用于脚本涉及单个循环的情况,该循环占脚本总运行时间的99%,并且您可以合理地期望能够计算该循环每次迭代的半精确平均值。这是真实的脚本,我想估计完成时间

您可以粒度测量脚本中每个方法的时间,然后按说明对组件进行求和。

您可以粒度测量脚本中每个方法的时间,然后按说明对组件进行求和。

查看
ruby progressbar
gem:

它生成一个漂亮的进度条并估计完成时间(ETA):


请查看
ruby进度条
gem:

它生成一个漂亮的进度条并估计完成时间(ETA):


您让流程运行,并在设定的迭代时间后,测量所用时间。然后使用该值作为剩余时间的估计值。这样可以确保始终根据当前任务动态估计时间

这个例子非常冗长,就像是一个代码双重whoper和三重奶酪:

#此测试的一些变量
迭代次数=1000
探测_at=(迭代次数*0.1)。到_i
总时间=0
#======================================
迭代次数是多少|
time\u start=time.now
#如果这是一个函数,你可以在这里让步
五千倍
计算sqrt(兰特(200000))
完#
总时间+=所用时间=时间。现在-开始时间
如果i==probe_在
迭代成本=(总时间/探测时间)
剩余时间=迭代成本*(迭代-探测时间)
放置“花费的时间(实际):#{Time_total}|迭代:#{i}”
放置“剩余时间(估计):#{Time_left}|迭代:#{i}”
放置“估计总数:#{time_total+time_left}|迭代:#{i}”
结束
如果i==999
放置“花费的时间(实际):#{Time_total}|迭代:#{i}”
结束
结束

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

您让流程运行,并在设定的迭代时间后,测量所用时间。然后使用该值作为剩余时间的估计值。这样可以确保始终根据当前任务动态估计时间

这个例子非常冗长,就像是一个代码双重whoper和三重奶酪:

#此测试的一些变量
迭代次数=1000
探测_at=(迭代次数*0.1)。到_i
总时间=0
#======================================
迭代次数是多少|
time\u start=time.now
#如果这是一个函数,你可以在这里让步
五千倍
计算sqrt(兰特(200000))
完#
总时间+=所用时间=时间。现在-开始时间
如果i==probe_在
迭代成本=(总时间/探测时间)
剩余时间=迭代成本*(迭代-探测时间)
放置“花费的时间(实际):#{Time_total}|迭代:#{i}”
放置“剩余时间(估计):#{Time_left}|迭代:#{i}”
放置“估计总数:#{time_total+time_left}|迭代:#{i}”
结束
如果i==999
放置“花费的时间(实际):#{Time_total}|迭代:#{i}”
结束
结束

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

我认为您需要某种“基本执行时间”,可以从中推断。我会这样说:在一个小的代表性子集上执行100或1000次迭代,测量平均执行时间,然后从这一点开始推断未来每次执行需要多少时间。我认为您需要某种“基本执行时间”,可以从中推断。我会这样说:在一个小的代表性子集上执行100或1000次迭代,测量平均执行时间,然后从这里开始推断未来每次执行需要多少时间。这看起来像我想要的,虽然我不清楚在运行的代码生成大量输出的情况下它将如何工作。我将尝试实施此功能,并接受它是否适合。谢谢如果脚本也向控制台生成输出,则无法正常工作。但我认为您应该将输出写入日志文件(或将STDERR管道写入文件)。这个库做得非常好,可以进行广泛定制。肯定是要走的路。查看一下处理大量记录的格式:
ProgressBar.create(格式:“%a |%b>>%i |%p%%%c/%c%e”,total:total)
这看起来像是我想要的,但我不清楚在运行的代码生成大量输出的情况下它将如何工作。我将尝试实施此功能,并接受它是否适合。谢谢如果脚本也向控制台生成输出,则无法正常工作。但我认为您应该将输出写入日志文件(或将STDERR管道写入文件)。这个库做得非常好,可以进行广泛定制。肯定是要走的路。查看此格式以处理大量记录:
ProgressBar.create(格式:“%a |%b>>%i |%p%%%c/%c%e”,总计:总计)
example task:     67% |oooooooooooooooooooooo         | ETA:  00:01:15