我有一个算法,我正在使用 System.Diagonstics 计时 - 通过秒表。
它的效果很好但是我注意到的一件事是我第一次运行算法时需要大约52毫秒,这很棒。
第二次运行算法时,只需要一小部分时间。
这是由于 .NET 的性质吗?
每次我使用一组新数据运行算法时,我都会重新初始化它。换句话说,我创建一个新对象,而不是重新使用旧的引用,所以我不知道为什么这仍然会发生。通常我不会关心这样的事情,但对于这项任务,我必须衡量算法的效率和速度,因此了解为什么会发生这种情况对我自己很重要。
我如何使用计时器的伪代码如下:
Algorithm class
Stopwatch get/set
Method A
Start stopwatch
// Do work.
Stop stopwatch
End
Method B
Start stopwatch
// Do work.
Stop stopwatch
End
End
在我的跑步者中调用这两种方法之后,我会拿到秒表并检查时间。
算法
该算法是计算机控制的A.I指令的战术航路点推理。我试图在上面的例子中尽可能简单。
结果
19.7847
0.0443
0.0102
0.0159
0.0091
0.0073
0.0079
0.0079
0.0079
0.0079
0.0079
0.0079
0.0136
0.0079
0.0073
0.0079
0.0079
0.0079
0.0079
0.0073
...
我应该在第一次运行算法时忽略它吗?否则,我最终得到的平均值与第一次运行时的值基本相同。
答案 0 :(得分:5)
如果你的时间只有52毫秒,那么任何事情都可能发生 - 这只是一个非常短的时间来衡量。
很可能是因为JIT编译了该方法及其触及的所有内容,例如。
通常,为了获得有用的测量结果,您应该多次迭代以获得更长的时间 - 这可以减少由于(例如)操作系统中的某些其他事件导致CPU短暂消失而产生的噪声。
答案 1 :(得分:2)
在循环中重复测试数千次以获得平均值。在执行此操作时,应尽量不要分配和取消分配对象,这样可以减少垃圾回收的可能性。
答案 2 :(得分:1)
第一次运行时,必须对CLR字节码进行JIT,这会产生开销。后续执行不会产生此费用。