Language agnostic 进度条等的实际时间估计

Language agnostic 进度条等的实际时间估计,language-agnostic,statistics,progress-bar,machine-learning,estimation,Language Agnostic,Statistics,Progress Bar,Machine Learning,Estimation,我知道我不是唯一一个不喜欢进度条或时间估算的人,因为进度条或时间估算在软件中给出了不切实际的估算。最好的例子是安装人员,他们在10秒内从0%跳到90%,然后花一小时完成最后的10% 大多数时候程序员只是估计完成任务的步骤,然后以百分比的形式显示currentstep/totalsteps,忽略了每个步骤可能需要不同的时间来完成这一事实。例如,如果将行插入到数据库中,插入时间可能会随着插入行的数量而增加(简单示例),或者复制文件的时间不仅取决于文件的大小,还取决于磁盘上的位置及其碎片程度 今天,我

我知道我不是唯一一个不喜欢进度条或时间估算的人,因为进度条或时间估算在软件中给出了不切实际的估算。最好的例子是安装人员,他们在10秒内从0%跳到90%,然后花一小时完成最后的10%

大多数时候程序员只是估计完成任务的步骤,然后以百分比的形式显示currentstep/totalsteps,忽略了每个步骤可能需要不同的时间来完成这一事实。例如,如果将行插入到数据库中,插入时间可能会随着插入行的数量而增加(简单示例),或者复制文件的时间不仅取决于文件的大小,还取决于磁盘上的位置及其碎片程度

今天,我问自己,是否有人已经尝试过对此进行建模,并可能创建了一个带有可配置鲁棒估计器的库。我知道很难给出可靠的估计,因为外部因素(网络连接、用户运行其他程序等)发挥了作用

也许还有一种解决方案可以使用评测来建立更好的估计器,或者可以使用机器学习方法

有人知道这个问题的高级解决方案吗


关于这一点,我觉得这篇文章很有趣。它展示了进度条如何改变对时间的感知,以及您如何利用这些洞察力创建速度更快的进度条


编辑: 我可以想办法手动调整时间估计,即使有“估计器库”,我也必须对算法进行微调。但我认为这个问题可以用统计工具来解决。当然,估计员会在过程中收集数据,为下一步做出更好的估计

我现在要做的是取上一步中的平均时间(按类型分组并按文件大小、事务大小等标准化的步骤),并将此平均值作为下一步的估计值(同样:按不同类型和大小计数)


现在,我知道有更好的统计工具来创建估计器,我想知道是否有人将这些工具应用于这个问题。

谢天谢地,我不是唯一一个

我不知道有哪一个库可以处理估算,但我个人可以担保你的评测想法。我曾经实现过一个进度条,用于报告长而复杂的文件操作的进度(读取、处理几个小文件,然后合并成一个较大的文件)。我让软件记录读取、写入和处理所花费的时间,然后相应地调整进度条。程序运行几次后,进度条就会像丝绸一样平滑地移动。没有停顿,也没有快速闪烁


只要您的操作所花费的时间易于测量,这种方法就可以工作。由于网络的速度是完全不确定的,所以我对在下载进度指示器之类的东西上使用这种方法持谨慎态度。

正如你所说,你可能有100个步骤,但每个步骤都需要不同的时间,这取决于它们所做的事情

一种方法是根据任务正在执行的操作(删除、更改注册表值、下载、复制文件等)对任务进行分组,并为每个组分配一些键属性:

  • 哪些可监控指标适用(拷贝速度、解包速度等)
  • 该过程的平均最坏情况率是多少
然后你需要建立一个清单,列出你在整个工作中要做的事情,例如:

  • 解包一个100meg文件(组:解包,值:100)
  • 复制120MEG(组:复制,值:120)
  • 设置注册表值(组:注册表,值:25)
  • 清理(组:删除,值:100)
  • 因此,您可以根据预设的平均最坏情况值计算出总体“估计”,但准确度的关键是在您了解系统完成每个任务的速度时更新每个度量乘数


    微软花了十年时间才把它做好,所以如果它一开始不起作用,不要太难过。=)

    我认为问题不在于他们估计的步骤太多,而在于经常使用错误的“步骤”定义。在您的示例中,安装程序在10秒内从0%变为9%,然后在剩下的时间内从1小时变为0%,我看到当程序员决定计算要复制的文件数,而不是字节数时,会发生这种情况

    假设有10个文件,其中9个文件每个都是5K(自述文件、许可证、图标等),最后一个是2Gig ISO,那么,前9个文件的复制速度非常快,最后一个文件的复制速度非常慢!计算文件是错误的,应该计算字节。问题是,如果要计算字节数,则需要实现自己的复制例程,以便在复制大文件期间提供状态更新。实现自己的复制例程真的值得吗

    另一个问题是,一个安装(和许多其他事情一样)是由一堆非常深的例程组成的。这些例程可以做很多事情,但它们很可能是通用例程,并且没有任何能够在更高级别上更新某些进度表的功能。您需要重新实现一些常见的例程以获得良好的进度信息

    至于稳健估计,我认为这真的很难。可以在配置文件中定义特定步骤,但您需要在安装过程的每个部分进行进度更新。此外,做这些事情的时间显然会因机器而异,所以无论如何,你可能会有很大的差距。当然,一旦你在一台特定的机器上完成了安装,你可能会估计下次在该机器上的安装情况。;-)

    在读大学期间,我做了一个与哈里森等人的论文相似的实验。正如你对课堂项目的期望,我们没有