秒表给出随机结果
StopWatch gives random results
这是我第一次尝试使用 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是fastets,其他时候是AverageDouble或AverageDouble2。我使用 diff 变量名,但看起来没关系。
我错过了什么?
PS。使用两个整数作为输入计算平均值的最佳方法是什么?
测试了您的代码,是的,结果有时非常随机。请记住 Stopwatch
只是从 sw.start()
到 sw.stop()
所经过的时间。它没有考虑 .Net 的即时编译、操作系统进程调度、cpu 加载等
这在具有如此小的运行时间的方法中会更加值得注意。这些噪音在哪里,可以使运行时间增加一倍。
下面SO question.
中写了一个详细和更好的解释
这是我第一次尝试使用 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是fastets,其他时候是AverageDouble或AverageDouble2。我使用 diff 变量名,但看起来没关系。
我错过了什么?
PS。使用两个整数作为输入计算平均值的最佳方法是什么?
测试了您的代码,是的,结果有时非常随机。请记住 Stopwatch
只是从 sw.start()
到 sw.stop()
所经过的时间。它没有考虑 .Net 的即时编译、操作系统进程调度、cpu 加载等
这在具有如此小的运行时间的方法中会更加值得注意。这些噪音在哪里,可以使运行时间增加一倍。
下面SO question.
中写了一个详细和更好的解释