用于估计具有异构迭代的时间密集循环的剩余时间的算法

我有一个循环的指令,如(伪代码):

for i = 1 to 1000000
    // Process the ith input
    doSomething(input[i])
end

这需要很长时间才能完成.我想输出一些进展,更重要的是剩余的时间估计给用户,这样他们就可以决定是否应该坐在那里摆弄他们的拇指,去喝咖啡,散步,或者去度过一个星期的假期在算法处理其数字的同时到欧洲.

为简化问题,您可以假设迭代次数很多(例如,大于100,因此您可以在每个百分位数处打印进度).

一种常见的算法是简单地测量最后一次迭代所花费的时间,然后将其乘以剩余的迭代次数并将其作为输出.如果每次迭代在执行所需的时间内变化很大,则会发生故障.

另一种方法是将自第一次迭代以来经过的时间除以完成的迭代次数,然后将其乘以剩余的迭代次数.如果迭代的持续时间不均匀分布,则会发生故障.例如,如果前几个输入是“困难的”并且在输入数组的末尾变得更容易,则算法将高估剩余时间直到它几乎完成(此时它将略微过高估计).

那么,当每次迭代所花费的时间是一个非直接的,任意的函数(这样,只需要分析地推导和实现每次迭代的完成时间是不切实际的)迭代纵坐标时,如何更好地估计剩余时间?

我能想象的两个想法可能是富有成效的研究途径,但我现在无法完全探索自己:

>完成每个过去迭代的时间的指数平均值乘以剩余的迭代次数.
>跟踪用于完成每次迭代的时间,然后拟合函数并进行外推.

为什么计算密集型解决方案(如拟合方程式)没问题:

首先,对于值得讨论的真正大型任务,运行时间可以以小时或天为单位进行测量.这些天复杂的数学运算需要几毫秒,所以增加的负担也不会很大 – 在我上面的例子中,很明显doSomething需要花费很长时间来做一些数学的成本,否则我不会那么关心精确估计剩余时间第一名.

其次,例如,可以将迭代迭代到百分位数.然后,不是对“迭代完成与所花费的时间”的数据集进行操作,而是估计器将对“完成百分比与所花费的时间”的数据集进行操作,该数据集具有至多100个数据点.这提供了进一步的复杂性:假设您的任务需要一天或更长时间才能完成.仅在每个百分比完成时估计剩余时间意味着对估计器函数的100个评估.当你已经花了一天时间,估计剩余时间一分半钟并不是什么大不了的事,但这已经给你一个1秒的窗口来拟合方程式而不是 – 1秒是很多时间来做数学在现代系统上.因此,我欢迎计算密集型解决方案.

tl; dr:如何为非常冗长的任务过度设计精确的剩余时间估计函数.

最佳答案 除了Penguino的算法:你可能想要拟合log(n)和log(f(n)),而不是拟合n和f(n).只要你的复杂性是多项式,这就行了.

点赞