如何消除"估计剩余时间"(和ETA)计算中的"抖动"?

Sco*_*pey 8 .net c# progress

我有一个应用程序,在执行后台任务时,显示一个进度条,其中包含"估计剩余时间"计算(例如"剩余5秒")和"估计完成时间"(例如"在12:59:59完成" "),或者我称之为ETA.

用于计算此ETA的算法基本上采用随时间推移的"滚动平均值":
1.每个进度事件被添加到具有当前时间的队列中.
2.在一定持续时间(例如10秒)之后,从队列中移除项目.
3. ETA是从队列中的第一个和最后一个项目推断出来的.
如果您关心,源代码可用:ETACalculator.cs

但是,存在抖动问题.随着每个进度事件被添加到计算中,ETA将稍微更新.让我们说ETA只是改变了0.1s.这种小抖动很容易导致ETA"颤动".例如,我没有看到5s,4s,3s等的平滑进展,而是看到了5-5-5-4-5-4-5-4-4-4-4-4.

我只想把更新减少到每秒1次,但是进度条不太顺畅,而且我真的希望"实际"减速能够实时显示.

我遇到了一个简单的算法,可以减少这种跳跃的抖动.如何消除抖动?

Dre*_*ann 11

实际的抖动进度显示的进度分成两个单独的变量.

像现在一样更新紧张的进度.

在定期(相对快速)的时间间隔内,更新显示的进度以接近实际进度.

一种简单的方法算法是平均这两个值

display_progress = (display_progress + actual_progress) / 2 
Run Code Online (Sandbox Code Playgroud)

这将抑制价值以反映过去的价值而不仅仅是直接价值.

您还可以使用以下方法优化平滑度:

display_progress = (P) * display_progress + (1.0-P) * actual_progress 
Run Code Online (Sandbox Code Playgroud)

P之间的常数值在哪里.0.01.0

编辑:

这是可以使用的许多过滤器之一.这个很好,因为它不需要太多的簿记.

然而,获得完美的输出并不是一种选择,因为缺陷在你的输入中."抖动"和"实际减速"之间的差异只有发生之后才能观察到.