delphi 我们应该测量一个例程的平均执行时间还是最小执行时间?

zpf6vheq  于 2023-08-04  发布在  其他
关注(0)|答案(1)|浏览(144)

当我们测量一个例程的执行时间时(总是使用相同的输入),我们不会得到相同的结果(时间),即使我们应该这样做,因为程序运行在多任务环境中。即使我们运行我们的程序作为“高优先级”的一些干扰,从其他程序在CPU上运行,当然会影响结果略有。
测量的目的是在代码优化之前和之后对例程计时。
大多数人会多次计算函数的时间并求平均值。为什么我们不看最小的执行时间而不是平均值呢?

esbemjvw

esbemjvw1#

你应该总是以最短的时间为目标。
因为如果你这样做了,你可以确定你只是在为自己的代码计时,而不是其他。

争取最短时间

如果你的代码只有一个执行路径,那么你应该总是把最短的时间(从许多重复中)作为实际花费的时间。
这样你就可以在一个或两个CPU周期内得到精确的计时。为了清楚起见,您运行了数百万次代码片段,并将该运行的最低样本作为计时。
然后,将这数百万次运行 Package 在一个循环中,该循环运行10倍或100倍,并再次采用最低计时。像这样:

Lowest = MaxInt;
loop 100x 
  loop million times
     Clock.Start;
     DoTest;
     Timing = Clock.Time;
     if (timing < Lowest) {Lowest = timing}

字符串
另一个循环重置上下文,这有时会有所帮助。这很重要,例如。如果JIT编译器晚了外部循环给它一个重置的改变。
如果代码段特别快,你也可以在外部循环中计算计时,然后除以一百万。在这种情况下,您将运行一个额外的空定时循环,并从忙碌循环中的时间中减去空循环所花费的时间。
但是,你必须变得聪明,以防止代码优化消除空循环:-)。
如果你的代码有多个可能的路径,那么你就不能真正确定它的执行时间。只运行一个带有固定输入的简单循环,因为这只会给予你一个代码路径的部分时间。这可能不代表真实的世界的表现。

使您的跑步具有确定性

始终尝试修复代码,以便代码只能采用一条路径。
或者尝试设置测试,使所有可能的路径都连续地进行,然后计算每一条路径所需的最短时间,并除以测试的代码路径的数量。

所有的东西还有厨房Flume的轮廓

如果这不可能,您将不得不采取平均值,但请注意,在这种情况下,您不再真正只为代码计时,您还需要考虑系统开销、硬盘中断和后台进程。

相关问题