我需要找到两个函数执行相同操作但用不同算法编写的时间。我需要在两个中找到最快的
这是我的代码段
Stopwatch sw = new Stopwatch();
sw.Start();
Console.WriteLine(sample.palindrome()); // algorithm 1
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);//tried sw.elapsed and sw.elapsedticks
sw.Reset(); //tried with and without reset
sw.Start();
Console.WriteLine(sample.isPalindrome()); //algorithm 2
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
从技术上讲,这应该给两个算法花费的时间。这使得算法2更快。但是如果我交换两个函数的调用,它会给出不同的时间。就像我先调用algorithm2而第二次调用algorithm1一样,它表示algorithm1更快。
我不知道我做错了什么。
答案 0 :(得分:20)
我认为你的回文方法在这个例子中运行非常快,因此为了获得真实的结果,你需要运行它们几次然后决定哪个更快。
像这样:
int numberOfIterations = 1000; // you decide on a reasonable threshold.
sample.palindrome(); // Call this the first time and avoid measuring the JIT compile time
Stopwatch sw = new Stopwatch();
sw.Start();
for(int i = 0 ; i < numberOfIterations ; i++)
{
sample.palindrome(); // why console write?
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds); // or sw.ElapsedMilliseconds/numberOfIterations
现在对第二种方法执行相同操作,您将获得更多逼真结果。
答案 1 :(得分:8)
您必须做的是在实际计算的测试之前执行两种方法,以使编译的代码为JIT'd
。然后尝试多次尝试。这是一个代码模型。
CIL格式的编译代码首次执行时将被JIT,它将被翻译成机器代码。因此,首先测试它是不准确的。所以在实际测试之前让代码进行JIT。
sample.palindrome();
sample.isPalindrome();
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < 1000; i++)
{
sample.palindrome();
Console.WriteLine("palindrome test #{0} result: {1}", i, sw.ElapsedMilliseconds);
}
sw.Stop();
Console.WriteLine("palindrome test Final result: {0}", sw.ElapsedMilliseconds);
sw.Restart();
for (int i = 0; i < 1000; i++)
{
sample.isPalindrome();
Console.WriteLine("isPalindrome test #{0} result: {1}", i, sw.ElapsedMilliseconds);
}
sw.Stop();
Console.WriteLine("isPalindrome test Final result: {0}", sw.ElapsedMilliseconds);
详细了解CIL and JIT
答案 2 :(得分:4)
除非你提供回文和isPalindrome函数的代码以及样本类,否则除了推测之外,我做不了多少。
我猜这个最可能的原因是你的两个函数都使用相同的类变量和其他数据。因此,当您第一次调用该函数时,它必须为变量分配内存,而下次调用其他函数时,这些一次性开销已经发生。如果不是变量,它可能是一些其他问题,但沿着相同的路线。
我建议你两次调用这两个函数,并且仅在第二次调用函数时注意持续时间,这样他们需要使用的任何资源可能已被分配一次,并且可能的概率较小。幕后的东西弄乱了结果。
如果有效,请告诉我。这仅仅是我的猜测,我可能是错的。