我的目标是比较同一事物的许多不同C#实现的性能。最后,我想了解整体上最快的实现。我正在使用StopWatch
来衡量每次运行的时间,并且我正在使用足够大的输入,以使实现能够运行更长的时间,并发现两次运行之间的时间之间存在显着差异,并确保它们不在裕度范围内错误。问题是,即使运行完全相同的代码,我也会发现很大的波动。有时,如果我对测试用例进行重新排序,它将影响特定测试用例的结果,使时间增加50%,这超出了误差范围,并且完全改变了实现速度更快的结论。这是在测试用例本身和时间测量之前运行以下代码:
Thread.Sleep(500);
GC.Collect(2, GCCollectionMode.Forced, true, true);
GC.Collect(2, GCCollectionMode.Forced, true, true);
Thread.Sleep(500);
我知道我不能完全排除GC,但是时间的50%波动仍然太大。除了排除尽可能多的变量以找到更一致和准确的代码运行时间度量之外,您还能提出什么建议?
波动是由于操作系统的后台工作。 换句话说,如果打开Task Manager
,即使没有任何活动程序,但CPU usage
会在2%至3%之间不断变化,您会看到。 因此,没有固定的情况。它看起来像海上的浮船。
因此,对于您的测试,不仅您应该依赖您的代码,而且还应收集一些系统数据并减少Error系数。并提供一个类似于下表的表格。
Execution cycle | CPU usage %| RAM Usage GB| Hard Usage|
-----------------------------------------------------------
100 | 2 | 1 | 2 |
1000 | 5 | 0.75 | 1 |
10000 | 10 | 0.5 | 2 |
100000 | 11 | 1.5 | 4 |
1000000 | 3 | 0.6 | 3 |
您必须达到如下等式:
Real Execution Performance = (g(CPU,RAM,Hard))*N mili-seconds
N:= Nominal Execution Performance
Error coefficient `g(CPU,RAM,Hard)` related to CPU related to RAM related to Hard
例如:Real Execution Performance = 0.7*(20,000) =14,000 mili-seconds
老实说:我无法达到误差系数,而我正在寻找它。