使用Timer定时C#代码

时间:2012-05-30 06:30:45

标签: c# algorithm time code-analysis

即使在算法分析和Big-Oh方面检查代码的性能也很好!符号我想看看代码在我的电脑中执行需要多少。我已经将List初始化为9999count并从中删除了偶数元素。遗憾的是,执行此操作的时间似乎是0:0:0。对结果感到惊讶,我执行时间的方式肯定有问题。 有人可以帮我解释代码的正确性吗?

        IList<int> source = new List<int>(100);
        for (int i = 0; i < 9999; i++)
        {
            source.Add(i);
        }

        TimeSpan startTime, duration;
        startTime = Process.GetCurrentProcess().Threads[0].UserProcessorTime;

        RemoveEven(ref source);
        duration = Process.GetCurrentProcess().Threads[0].UserProcessorTime.Subtract(startTime);

        Console.WriteLine(duration.Milliseconds);
        Console.Read();

3 个答案:

答案 0 :(得分:6)

最适合使用的内容是Stopwatch - 任何涉及TimeSpan的内容都无法接近足够精确:

var watch = Stopwatch.StartNew();
// something to time
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds);

然而,现代CPU非常快,如果可以在那段时间内删除它们,我也不会感到惊讶。通常,对于计时,您需要重复操作很多次才能获得合理的测量。

除此之外:ref中的RemoveEven(ref source)几乎肯定不需要。

答案 1 :(得分:4)

在.Net 2.0中,您可以使用Stopwatch

IList<int> source = new List<int>(100);
for (int i = 0; i < 9999; i++)
{
    source.Add(i);
}

Stopwatch watch = new Stopwatch();

watch.Start();
RemoveEven(ref source);
//watch.ElapsedMilliseconds contains the execution time in ms
watch.Stop()

答案 2 :(得分:0)

添加到之前的答案:

var sw = Stopwatch.StartNew();

// instructions to time

sw.Stop();

sw.ElapsedMilliseconds返回一个long,其分辨率为:

1毫秒= 1000000纳秒

sw.Elapsed.TotalMilliseconds返回一个double,其分辨率等于Stopwatch.Frequency的倒数。例如,在我的电脑上Stopwatch.Frequency的值为2939541每秒刻度,这使得sw.Elapsed.TotalMilliseconds的分辨率为:

1/2939541秒= 3,401891655874165e-7秒= 340纳秒