当我们测量一个例程的执行时间时(总是使用相同的输入),我们不会得到相同的结果(时间),即使我们应该这样做,因为程序运行在多任务环境中。即使我们运行我们的程序作为“高优先级”的一些干扰,从其他程序在CPU上运行,当然会影响结果略有。测量的目的是在代码优化之前和之后对例程计时。大多数人会多次计算函数的时间并求平均值。为什么我们不看最小的执行时间而不是平均值呢?
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的轮廓
如果这不可能,您将不得不采取平均值,但请注意,在这种情况下,您不再真正只为代码计时,您还需要考虑系统开销、硬盘中断和后台进程。
1条答案
按热度按时间esbemjvw1#
你应该总是以最短的时间为目标。
因为如果你这样做了,你可以确定你只是在为自己的代码计时,而不是其他。
争取最短时间
如果你的代码只有一个执行路径,那么你应该总是把最短的时间(从许多重复中)作为实际花费的时间。
这样你就可以在一个或两个CPU周期内得到精确的计时。为了清楚起见,您运行了数百万次代码片段,并将该运行的最低样本作为计时。
然后,将这数百万次运行 Package 在一个循环中,该循环运行10倍或100倍,并再次采用最低计时。像这样:
字符串
另一个循环重置上下文,这有时会有所帮助。这很重要,例如。如果JIT编译器晚了外部循环给它一个重置的改变。
如果代码段特别快,你也可以在外部循环中计算计时,然后除以一百万。在这种情况下,您将运行一个额外的空定时循环,并从忙碌循环中的时间中减去空循环所花费的时间。
但是,你必须变得聪明,以防止代码优化消除空循环:-)。
如果你的代码有多个可能的路径,那么你就不能真正确定它的执行时间。只运行一个带有固定输入的简单循环,因为这只会给予你一个代码路径的部分时间。这可能不代表真实的世界的表现。
使您的跑步具有确定性
始终尝试修复代码,以便代码只能采用一条路径。
或者尝试设置测试,使所有可能的路径都连续地进行,然后计算每一条路径所需的最短时间,并除以测试的代码路径的数量。
所有的东西还有厨房Flume的轮廓
如果这不可能,您将不得不采取平均值,但请注意,在这种情况下,您不再真正只为代码计时,您还需要考虑系统开销、硬盘中断和后台进程。