c# - 如何从我的 "jitter"(和 ETA)计算中消除 "estimated time remaining"?

标签 c# .net progress

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

计算此 ETA 的算法基本上采用随时间推移的“滚动平均值”:
1. 每个进度事件都被添加到具有当前时间的队列中。
2. 一定时间后(如10s),元素从队列中移除。
3. ETA 是从队列中的第一个和最后一个项目推断出来的。
如果您愿意,可以使用源代码:ETACalculator.cs

但是,存在一个抖动问题。随着每个进度事件被添加到计算中,ETA 将略有更新。假设 ETA 仅变化 0.1s。这种微小的抖动很容易导致 ETA 发生“抖动”。例如,我看到的不是从 5s、4s、3s 等开始的平滑进展,而是 5-5-5-4-5-4-5-4-5-4-4-4。

我正在考虑将更新减少到每秒 1 次,但这样进度条就不那么流畅了,而且我真的很想实时显示“实际”减速。

我很难想出一个简单的算法来减少这种跳跃性抖动。如何消除抖动?

最佳答案

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

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

以固定(相对较快)的时间间隔,更新显示的进度以接近实际进度。

一个简单的方法算法是对两个值取平均值

display_progress = (display_progress + actual_progress) / 2 

这会抑制值(value)以反射(reflect)过去的值(value),而不仅仅是当前的值(value)。

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

display_progress = (P) * display_progress + (1.0-P) * actual_progress 

其中 P0.01.0 之间的常数值。

编辑:

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

但是,获得完美的输出并不是一种选择,因为缺陷存在于您的输入中。 “抖动”和“实际减速”之间的差异只有在发生后才能观察到。

关于c# - 如何从我的 "jitter"(和 ETA)计算中消除 "estimated time remaining"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8871225/

相关文章:

c# - Raspberry Pi+MonoDevelop如何从串口读取数据?

c# - ContactManager.RequestStoreAsync() 抛出 System.UnauthorizedAccessException

c# - 反序列化包含无效数据类型的 xml

javascript - 如何制作一个简单的改变颜色的进度按钮

c# - 在 C# 中设置进程名称

c# - 如何得到一个合理的CRC的CRC

c# - 如何替换 LinkedList 中的元素?

c# - 遗留代码以某种方式对 ThreadAbortException 使用react的单元测试

WPF 在进行中不更新文本框

java - 使用 HTTPClient 4 监控下载进度?