我正在尝试测量两个功能的运行时间,我在两个功能中都设置了计时器。但是,如果我连续第二次运行这些返回0ms,那为什么呢?
using System;
using System.Collections.Generic;
namespace TestParallelLoops
{
class Program
{
static void Main(string[] args)
{
first();
second();
}
static void first()
{
var watch = new System.Diagnostics.Stopwatch();
watch.Start();
Console.WriteLine(fibonacci(50));
watch.Stop();
Console.WriteLine($"Execution Time: {watch.ElapsedMilliseconds} ms");
}
static void second()
{
var watch1 = new System.Diagnostics.Stopwatch();
watch1.Start();
Console.WriteLine(fibonacciRecursive(50));
watch1.Stop();
Console.WriteLine($"Execution Time: {watch1.ElapsedMilliseconds} ms");
}
static long fibonacci(int n)
{
Dictionary<int, long> last = new Dictionary<int, long>();
last[0] = 0;
last[1] = 1;
int next = 2;
while (next<=n)
{
last[next] = last[next-1] + last[next-2];
next++;
}
return last[n];
}
static long fibonacciRecursive (int n)
{
if (n == 0) return 1;
if (n == 1) return 1;
return fibonacciRecursive(n - 1) + fibonacci(n - 2);
}
}
}
如果我只执行第一次,我会看到〜100毫秒,如果我只执行第二次,我会看到〜100毫秒,但是如果我同时执行,我会看到〜100毫秒和0毫秒。
非常感谢
答案 0 :(得分:3)
Dustin S.可能会赚钱,第一个Console.WriteLine
会导致最初的100ms命中。将main更改为
static void Main(string[] args)
{
Console.WriteLine("Here we go!");
first();
second();
}
给定机器运行的速度以及秒表的基本精度,两者的结果都为0 ms。
您的fibanacciResursive
调用不是完全递归的,它应该具有以下return
:
return fibonacciRecursive(n - 1) + fibonacciRecursive(n - 2);
花了〜2s(我将值降低到45)的时间比我想等待在我的计算机上评估值为50的时间长,因为这不会缓存中介结果并付出很多努力。
您执行的撤消实现的确存在另一个与警卫有关的问题,该问题导致它实际上返回第n + 1
个斐波那契数,但我将其保留为练习。
在任何情况下,考虑到fibonacci
和fibonacciRecursive
的当前实现(没有上述修复),对于大多数机器而言,两者的结果均为0ms,而其值只有50个声音。< / p>
答案 1 :(得分:2)
我认为您100毫秒可能是解锁控制台所需的时间。保存该值,并在定时块之外编写控制台,如下所示(对first()方法执行相同操作):
static void second()
{
var watch1 = new System.Diagnostics.Stopwatch();
watch1.Start();
var a = fibonacciRecursive(50);
watch1.Stop();
Console.WriteLine(a);
Console.WriteLine($"Execution Time: {watch1.ElapsedMilliseconds} ms");
}