我感兴趣的是比较两个不同函数的速度,两个函数使用相同的输入数据 (BMP)。
当我们测量一个函数的执行时间(始终使用相同的输入)时,即使我们应该得到相同的结果(时间),我们也不会得到相同的结果(时间),因为程序在多任务环境中运行。即使我们以“高优先级”运行我们的程序,来自其他程序的一些干扰也会减慢我们的程序(为简化起见,让我们考虑单核计算机)。
因此,大多数人会对函数进行多次计时并取平均值。我的问题是为什么我们不记录最小执行时间而不是平均时间?最小执行时间应该比平均执行时间更接近真实情况。
最佳答案
你应该始终以最短时间为目标。
因为如果你这样做,你确定你只是在为你自己的代码计时,而不是其他任何东西。
以最短时间为目标
如果您的代码只有一个执行路径,那么您应该始终将最短时间(在多次重复中)作为实际花费的时间。
通过这种方式,您可以获得精确到一两个 CPU 周期内的计时。
需要明确的是,您将代码片段运行数百万次,并将该次运行中的最低样本作为计时。
然后你将这数百万次运行包装在一个运行 10 倍或 100 倍的循环中,并再次采用最低时间。像这样:
Lowest = MaxInt;
loop 100x
loop million times
Clock.Start;
DoTest;
Timing = Clock.Time;
if (timing < Lowest) {Lowest = timing}
另一个循环重置上下文有时会有所帮助。这很重要,例如如果 JIT 编译器启动晚了。外循环给它一个更改以重置。
如果代码片段特别快,您还可以在外循环中计时,然后除以一百万。在这种情况下,您将运行一个额外的空定时循环,并从繁忙循环中花费的时间中减去空循环花费的时间。
你必须变得聪明,以防止代码优化消除空循环:-)。
如果您的代码有多个可能的路径,那么您就无法真正计算其执行时间。只运行一个带有固定输入的简单循环,因为这只会给你一个代码路径的部分时间。这可能不代表现实世界的表现。
让您的运行具有确定性
始终尝试修复代码,使代码只有一条路径。
或者尝试设置测试,以便连续采用所有可能的路径,然后计算每件事所花费的最短时间,然后除以测试的代码路径数。
一切和厨房水槽分析
如果这不可能,您将不得不取平均值,但请注意,在这种情况下,您实际上不再只是为代码计时,您还要考虑系统开销、HDD 中断和后台进程。
关于c++ - 我们应该测量函数的平均执行时间还是最小执行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43939345/