计算运营的ETA的最佳方法是什么?

Mag*_*his 14 math progress time-estimation

我正在寻找使用线性进度信息计算操作的ETA(IE:文件下载)的最佳方法.

让我们说我有以下方法被调用:

void ReportProgress(double position, double total)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

我有几个想法:

  • 计算一段时间内的进度(如最后10秒),并将该速度用作操作的平均速度
  • 保留一组已报告的最后x个进度,计算每个增量的速度并使用平均值

pax*_*blo 7

我实际上鄙视这两个想法,因为他们以前都是我的开发人员.

第一个没有考虑到操作实际上变得更快的情况,它说有10分钟的时间我会在3点之后回来并且它已经完成了.

第二个没有考虑到操作变慢 - 我认为Windows资源管理器必须使用这种方法,因为它总是花费90%的时间复制90%的文件,然后另外90%的时间复制最后10个文件%的文件:-).

我很早就开始计算这些数字并对它们求平均值.客户不关心(他们也不关心其他两个选项,他们只是想看到一些进展)但它让我感觉更好,而这一切都是我在一天结束时所关心的; - )


e.J*_*mes 6

像这样的东西应该做的伎俩:

void ReportProgress(double position, double total)
{
    static TimeType startTime;

    if (position == 0)
    {
        startTime = GetTime();
        return; // to avoid a divide-by-zero error
    }

    TimeType elapsedTime = GetTime() - startTime;
    TimeType estimatedRemaining = elapsedTime * total / position;
    TimeType estimatedEndTime = GetTime() + estimatedRemaining;

    // Print the results here
}
Run Code Online (Sandbox Code Playgroud)

随着进度接近100%,估计更接近事实

  • 我认为你对`estimatedRemaining`的计算实际上是给你估计的_total_时间.你可能想要`TimeType estimatedRemaining =(elapsedTime*(总/位置)) - elapsedTime`. (4认同)

Jac*_*yan 5

我认为这个问题几乎无法解决,但是可以通过对正在执行的过程的更多了解来创建一些准确的估计。在存在大量未知数的情况下,最好将这些未知数告知用户,以便他们将其考虑在内。

以下载一批文件的简单示例为例,您有两个已知变量:

  • 文件数
  • 文件的大小

对于每个文件,都有一个恒定的开销(建立连接所需的时间,以及在文件系统上打开文件所需的时间)。还有与文件大小相关的明显下载时间。创建一个可以将其表示为当前下载速度的剩余时间的函数很容易,而且只要下载速度不会波动太大就准确。但问题就在这里。

使用您正在执行的操作的准确模型,很容易预测需要多长时间,前提是没有外部影响。而这几乎是不可能的。

但是,您可以寻求一种尝试理解和解释这些外部影响的解决方案。用户可能会发现在速度发生显着变化时收到警报很有帮助,因为他们可以调整计划以适应新的 ETA。解释影响当前操作的因素也可能会有所帮助。例如

Your download will complete in 6 minutes, if the download speed stays at 50k/s
Run Code Online (Sandbox Code Playgroud)

如果用户知道速度可能会改变,这允许用户进行一些有根据的猜测。并最终导致更少的挫折。


Tho*_*mas 5

布拉姆·科恩(Bram Cohen)对此进行了一些讨论。他在 BitTorrent 中的 ETA 计算上投入了大量精力(但在一次演讲中,他提到还没有人对他说“嘿!BitTorrent 中的 ETA 计算很棒!”)。这不是一个简单的问题。

一些相关链接: