编辑:我已经解决了我的问题。原因是测试过程中的一个错误,一旦我被允许回答我自己的问题,就会详细说明。
我知道通常应该避免这种类型的问题,但是我遇到了一个我无法理解的非常奇怪的情况。我一直在尝试实现 PRNG,并且一直在针对 System.Random 测试它的性能。我发现我的代码慢了约 50 倍,但问题不是算法,而只是调用方法。即使我只是返回一个常数,它仍然会慢很多倍。
所以我写了一个简单的测试程序,比较调用一个包装了random.NextDouble()的方法,一个返回-1的方法,和直接调用random.NextDouble()。我在 Ideone 中进行了测试,它给出了预期的结果;所有的时间都是相似的,返回一个常数是最快的。时间都在0.1秒左右。
但是,在 Visual Studio 2011 Beta 或 2010 C# Express 中编译的相同代码将分别导致每种情况下的 4 秒、4 秒和 0.1 秒。我肯定是在发布模式下运行,优化代码复选框被勾选,从 Visual Studio 外部启动会得到相同的结果。那么为什么在 Visual Studio 中如此简单的方法调用比 Ideone 慢得多?这是我用来基准测试的代码:
using System;
using System.Diagnostics;
public class Test{
static Random random = new Random();
public static Double Random() {
return random.NextDouble();
}
public static Double Random2() {
return -1;
}
public static void Main() {
{
Stopwatch s = new Stopwatch();
Double a = 0;
s.Start();
for (Int32 i = 0; i < 5000000; i++)
a += Random();
s.Stop();
Console.WriteLine(s.ElapsedMilliseconds);
}
{
Stopwatch s = new Stopwatch();
Double a = 0;
s.Start();
for (Int32 i = 0; i < 5000000; i++)
a += Random2();
s.Stop();
Console.WriteLine(s.ElapsedMilliseconds);
}
{
Stopwatch s = new Stopwatch();
Double a = 0;
s.Start();
for (Int32 i = 0; i < 5000000; i++)
a += random.NextDouble();
s.Stop();
Console.WriteLine(s.ElapsedMilliseconds);
}
}
}