[c#] DateTime.Now是衡量函数性能的最佳方法吗?


Answers

如果你想快速和肮脏的东西,我会建议使用秒表,而不是更高的精度。

Stopwatch sw = new Stopwatch();
sw.Start();
// Do Work
sw.Stop();

Console.WriteLine("Elapsed time: {0}", sw.Elapsed.TotalMilliseconds);

另外,如果你需要更复杂一点的东西,你应该考虑使用第三方分析器,比如ANTS

Question

我需要找到一个瓶颈,并且需要尽可能准确地衡量时间。

下面的代码片段是衡量性能的最佳方式吗?

DateTime startTime = DateTime.Now;

// Some execution process

DateTime endTime = DateTime.Now;
TimeSpan totalTimeTaken = endTime.Subtract(startTime);



这些都是测量时间的好方法,但这只是一个非常间接的找到瓶颈的方法。

在线程中找到瓶颈的最直接的方法是让它运行,当它在做任何让你等待的事情时,用暂停或休息键来停止它。 多次这样做。 如果您的瓶颈需要X%的时间,则X%是您在每个快照上的行为中捕捉它的概率。

这里有一个更完整的解释,说明它是如何工作的,以及它为什么工作




使用System.Diagnostics.Stopwatch类。

Stopwatch sw = new Stopwatch();
sw.Start();

// Do some code.

sw.Stop();

// sw.ElapsedMilliseconds = the time your "do some code" took.



我在程序中使用的方式是使用StopWatch类,如下所示。

Stopwatch sw = new Stopwatch();
sw.Start();


// Critical lines of code

long elapsedMs = sw.Elapsed.TotalMilliseconds;



这是正确的方法:

using System;
using System.Diagnostics;

class Program
{
    public static void Main()
    {
        Stopwatch stopWatch = Stopwatch.StartNew();

            // some other code

        stopWatch.Stop();

        // this not correct to get full timer resolution
        Console.WriteLine("{0} ms", stopWatch.ElapsedMilliseconds);

        // Correct way to get accurate high precision timing
        Console.WriteLine("{0} ms", stopWatch.Elapsed.TotalMilliseconds);
    }
}

有关更多信息,请通过使用秒表而不是DataTime来获取准确的性能计数器




将基准代码推入实用程序类/方法很有用。 StopWatch类不需要在出错时DisposedStopped 。 所以,最简单的时间码是

public partial class With
{
    public static long Benchmark(Action action)
    {
        var stopwatch = Stopwatch.StartNew();
        action();
        stopwatch.Stop();
        return stopwatch.ElapsedMilliseconds;
    }
}

示例调用代码

public void Execute(Action action)
{
    var time = With.Benchmark(action);
    log.DebugFormat(“Did action in {0} ms.”, time);
}

这是扩展方法版本

public static class Extensions
{
    public static long Benchmark(this Action action)
    {
        return With.Benchmark(action);
    }
}

和示例调用代码

public void Execute(Action action)
{
    var time = action.Benchmark()
    log.DebugFormat(“Did action in {0} ms.”, time);
}



我刚刚在Vance Morrison的博客中发现了一篇关于他编写的CodeTimer类的文章, 该类使得使用StopWatch更简单,并且在一边做了一些简洁的东西。




Related