在许多应用程序中,对于文件下载、压缩任务、搜索等,我们都有一些进度条。我们都经常使用进度条来让用户知道正在发生的事情。如果我们知道一些细节,比如已经完成了多少工作,还有多少工作要做,我们甚至可以给出一个时间估计,通常是通过推断需要多少时间才能达到目前的进度水平。
(来源: Jameslao.com)
但是我们也看到这个节目的时间左“ ETA”显示只是滑稽的坏。它声称一个文件的复制将在20秒内完成,然后一秒钟后,它说这将需要4天,然后它再次闪烁为20分钟。这不仅没有帮助,还让人困惑! 预计到达时间变化如此之大的原因是进度速度本身可能会变化,程序员的数学可能过于敏感。
苹果回避这一点,只是避免任何准确的预测,只是给出模糊的估计!
(来源: Autodesk. com)
这也很烦人,我有时间休息一下吗,还是我的任务要在两秒钟内完成?如果预测过于模糊,那么做任何预测都是毫无意义的。
简单但错误的方法
作为第一个通过 ETA 计算的函数,可能我们只需要写一个函数,如果 p 是已经完成的分数百分比,而 t 是目前为止所用的时间,我们输出 t * (1-p)/p 作为完成时间的估计值。这个简单的比例工作“ OK”,但它也很糟糕,特别是在计算结束时。如果你的缓慢下载速度让一个副本在一夜之间缓慢前进,最终在早上,某些东西开始发挥作用,副本开始以100倍的速度全速前进,你完成90% 的预计时间可能会说“1小时”,10秒钟后你会达到95% ,预计时间会说“30分钟”,这显然是一个令人尴尬的糟糕猜测。.在这种情况下“10秒”是一个非常,非常,非常好的估计。
当这种情况发生时,您可能会想到改变计算使用 最近速度,而不是平均速度,以估计 ETA。您取过去10秒内的平均下载速率或完成速率,并使用该速率来预测完成时间。这在前一个隔夜下载的示例中表现得非常好,因为它将在最后给出非常好的最终完成估计。但这仍然存在很大的问题。.当你的速率在短时间内快速变化时,它会导致你的预计到达时间(ETA)大幅反弹,你会得到“20秒内完成,2小时内完成,2秒内完成,30分钟内完成”的编程羞愧的快速显示。
真正的问题是:
考虑到计算的时间历史,计算完成任务的估计时间的最佳方法是什么?我不寻找到 GUI 工具箱或 Qt 库的链接。我要求关于 算法产生最理智和准确的完成时间估计。
你数学公式学得好吗?某种平均值,也许用速率超过10秒的平均值,和速率超过1分钟的平均值,和速率超过1小时的平均值?某种类型的人工过滤,比如“如果我的新估计与以前的估计相差太多,那么调低它,不要让它反弹太多”?某种奇特的历史分析,你把进度和时间推移结合起来,找到标准差,给出完成时的统计误差指标?
你试过哪些方法,哪些最有效?