预测C ++程序的运行时间

时间:2009-12-22 17:26:41

标签: c++

如果程序执行不同的函数(使用数据库,读取文件,解析xml等),如何预测C ++程序的运行时间?安装人员如何做到这一点?

11 个答案:

答案 0 :(得分:8)

他们无法预测时间。他们计算了总计操作的操作次数。

答案 1 :(得分:6)

可以使用测量和估算来预测时间。当然,预测的质量会有所不同。而BTW:“预测”这个词是正确的。

您将工作负载拆分为小任务,并为每个任务创建一个估算规则,例如:如果将文件一到十次复制需要10秒,那么剩下的90个文件可能需要另外90秒。测量这些任务在运行时所用的时间,并更新您的估算。

每次新测量都会使预测更精确。

答案 2 :(得分:5)

实际上没有办法以任何可靠的方式做到这一点,因为它取决于成千上万的因素。

进度条通常以两种方式之一来衡量:

  • 总体进展 - 我有 n 字节数/文件/要传输的内容,到目前为止我已经完成 m
  • 总体工作除以当前速度 - 我有 n 字节要传输,到目前为止我已经完成 m 并且 t 秒,如果事情按此速率继续进行,则需要 u 秒才能完成。

答案 3 :(得分:4)

简答:

不,你不能。对于进度条等,大多数应用程序只需根据完成的总任务以百分比增加条形长度。一些伪代码:

for(int i=0; i<num_files_to_load; ++i){
    files.push_back(File(filepath[i]));
    SetProgressBarLength((float)i/((float)num_files_to_load) - 1.0f);
}

这是一个非常简化的例子。像这样制作一个for循环肯定会阻止窗口系统的事件/消息队列。你可能会添加一个定时事件或类似的东西。

更长的回答:

给定N个已知参数,发现程序是否完全完成的问题是不可判定的。这称为Halting problem.但是,您可以找到执行单个指令所需的时间。一些非常老的游戏实际上依赖于确切的周期时间,并且由于运行时的微妙差异而导致的竞争条件导致无法在新计算机上正确执行。此外,在具有数据和指令缓存的体系结构上,指令消耗的周期不再是常量。因此,缓存使循环计数变得不可预测。

答案 4 :(得分:4)

Raymond Chen discussed this issue in his blog.

  

为什么复制对话框会提供   可怕的估计?

     

因为复制对话框只是   猜测。它无法预测未来,   但它被迫尝试。并在   副本的开头,那里   这是一个很少的历史   预测真的很糟糕。

答案 5 :(得分:2)

通常,无法预测程序的运行时间。甚至不可能预测一个程序是否会停止。这是不可判定的。

http://en.wikipedia.org/wiki/Halting_problem

答案 6 :(得分:1)

正如其他人所说,你无法预测时间。 Partial和rmn建议的方法是有效的解决方案。

您可以做的更多是为某些操作分配权重(例如,如果您知道数据库调用大约需要一些处理步骤的两倍,则可以相应调整)。

答案 7 :(得分:1)

一个很酷的安装程序编译器会执行一次虚假安装,对每个操作进行计时,然后将其保存到磁盘中以备将来使用。

我曾经在3D应用程序中使用过这样一种技术,在你运行几次之后,它有一个非常复杂的进度条用于加载和混合数据。这并不难,它使开发更好。 (因为我们必须看到10-15次/天,启动时间为10-20秒)

答案 8 :(得分:0)

你无法完全预测它。

你可以做的就是等到工作的一小部分完成,比如1%,然后估算剩下的时间 - 例如,花费多长时间为1%并乘以100。如果您可以提前列举所有必须做的事情,或者正在进行某种循环,那么这很容易做到。

答案 9 :(得分:0)

正如我在之前的回答中所提到的,通常不可能预测运行时间。

然而,根据经验,可以准确地预测。

通常所有这些程序在某些输入中都是近似线性的。

但是如果你想要一种更复杂的方法,你可以定义大量的功能(数据库大小,文件大小,操作系统等等),并将这些特征值+运行时间输入神经网络。如果您有数百万个示例(显然您将拥有一种自动收集数据的方法,例如一些发现程序),您可能会提出一种非常灵活且智能的预测算法。

当然这只是值得为了好玩而做,因为我确信贵公司对某些原始猜测算法的价值可能是零:)

答案 10 :(得分:-1)

您应该估算该计划不同阶段所需的时间。例如:读取文件 - 50,使用数据库 - 30,使用网络 - 20.理想情况下,如果在所有这些阶段中进行一些进度回调会很好,但它需要将进度计算编码到算法的迭代中。