这是我第一次尝试使用StopWatch来测试代码性能而我不知道出了什么问题。我想检查在转换为double时是否存在差异,以便用整数计算平均值。
public static double Avarage(int a, int b)
{
return (a + b + 0.0) / 2;
}
public static double AvarageDouble(int s, int d)
{
return (double)(s + d) / 2;
}
public static double AvarageDouble2(int x, int v)
{
return ((double)x + v) / 2;
}
使用StopWatch测试这3种方法的代码:
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000000; i++)
{
var ret = Avarage(2, 3);
}
sw.Stop();
Console.Write("Using 0.0: " + sw.ElapsedTicks + "\n");
sw.Reset();
sw.Start();
for (int i = 0; i < 1000000; i++)
{
var ret2 = AvarageDouble(2, 3);
}
sw.Stop();
Console.Write("Using Double(s+d): " + sw.ElapsedTicks + "\n");
sw.Reset();
sw.Start();
for (int i = 0; i < 1000000; i++)
{
var ret3 = AvarageDouble2(2, 3);
}
sw.Stop();
Console.Write("Using double (x): " + sw.ElapsedTicks + "\n");
它显示随机结果,一旦Average为紧固,其他时间为AverageDouble或AverageDouble2。我使用diff变量名,但看起来没关系。
我错过了什么?
PS。以两个整数作为输入计算平均值的最佳方法是什么?
答案 0 :(得分:2)
测试了您的代码,是的,结果有时非常随机。请注意,Stopwatch
仅是从sw.start()
到sw.stop()
的时间。它没有考虑.Net的及时编译,操作系统进程调度,CPU负载等。
在具有如此小的运行时间的方法中,这将更加值得注意。这些噪音可以使运行时间增加一倍。
在以下SO问题Calculate the execution time of a method中写了详细而更好的解释。看看那里。