我有一个应用程序,在执行后台任务时,显示带有“估计剩余时间”计算(例如“剩余5秒”)和“估计完成时间”(例如“在12:59:59完成”)的进度栏”),也就是我所说的ETA。
用于计算该ETA的算法基本上采用随时间变化的“滚动平均值”:
1.每个进度事件都会与当前时间一起添加到队列中。
2.在一定的持续时间(例如10s)之后,将项目从队列中删除。
3.根据队列中的第一项和最后一项推算出ETA。
如果您愿意,可以使用源代码:ETACalculator.cs
但是,存在抖动问题。随着每个进度事件添加到计算中,预计到达时间将略有更新。假设ETA仅更改0.1s
。这种小的抖动很容易导致ETA“波动”。例如,我看不到5s,4s,3s等的平稳发展,而是看到5-5-5-4-5-4-5-4-5-4-5-4-4。
我本来只是想将更新速度降低到每秒1次,但是进度条不太流畅,而且我也很想实时显示“实际”的运行速度。
我在想出一种简单的算法来减少这种 transient 抖动时遇到了麻烦。如何消除抖动?
最佳答案
将实际抖动进度和显示的进度分为两个单独的变量。
像现在一样更新紧张的进度。
以固定的(相对较快的)时间间隔,更新显示的进度以接近实际进度。
一种简单的算法是将两个值取平均值
display_progress = (display_progress + actual_progress) / 2
这将抑制该值以反射(reflect)过去的值,而不仅仅是即时值。
您还可以使用以下方法来改善平滑度:
display_progress = (P) * display_progress + (1.0-P) * actual_progress
其中
P
是0.0
和1.0
之间的常数。编辑:
这是可以使用的许多过滤器之一。这个很好,因为它不需要很多簿记。
但是,获得完美输出并不是一个选择,因为缺陷在于您的输入。 “抖动”和“实际减速”之间的差异只有在发生后才能观察到。
关于c# - 如何从 "jitter"(和ETA)计算中消除 "estimated time remaining"?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8871225/