用C#衡量执行时间

Jak*_*ake 37 c# datetime execution-time measure

我想测量一段代码的执行情况,我想知道最好的方法是什么?

选项1:

DateTime StartTime = DateTime.Now;

//Code

TimeSpan ts = DateTime.Now.Subtract(StartTime);
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
        ts.Hours, ts.Minutes, ts.Seconds,
        ts.Milliseconds / 10);
Console.WriteLine(elapsedTime, "RunTime");
Run Code Online (Sandbox Code Playgroud)

选项2:使用System.Diagnostics;

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

    //Code

    stopWatch.Stop();
    // Get the elapsed time as a TimeSpan value.
    TimeSpan ts = stopWatch.Elapsed;

    // Format and display the TimeSpan value.
    string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
        ts.Hours, ts.Minutes, ts.Seconds,
        ts.Milliseconds / 10);
    Console.WriteLine(elapsedTime, "RunTime");
Run Code Online (Sandbox Code Playgroud)

这不仅仅是基准测试,它实际上是应用程序的一部分.函数执行的时间是相关数据.然而,它不需要是原子的或超精确的.

哪个选项更适合生产代码,还是其他人使用不同的东西,也许更好?

Ste*_*end 28

所述Stopwatch类被专门用于测量经过的时间,并且可以(如果可用于硬件)提供使用的底层高频硬件定时器良好粒度/精度.所以这似乎是最好的选择.

所述IsHighResolution属性可以被用来确定高分辨率定时是否可用.根据文档,该类提供了"最佳可用"Win32 API的包装器,以实现准确的计时:

具体地,Frequency字段和 GetTimestamp方法可用来代替非托管的Win32 API的使用 QueryPerformanceFrequencyQueryPerformanceCounter.

有关Win32 API [此处]和链接的MSDN文档2的详细背景信息.

高分辨率计时器

计数器是编程中用于指代递增变量的通用术语.某些系统包括一个高分辨率性能计数器,可提供高分辨率的经过时间.

如果系统上存在高分辨率性能计数器,则可以使用QueryPerformanceFrequency 函数以每秒计数表示频率.计数值取决于处理器.例如,在某些处理器上,计数可能是处理器时钟的循环速率.

QueryPerformanceCounter的函数获取高分辨率的性能计数器的当前值.通过在代码段的开头和结尾调用此函数,应用程序实际上将计数器用作高分辨率计时器.例如,假设 QueryPerformanceFrequency指示高分辨率性能计数器的频率为每秒50,000个计数.如果应用程序在要定时的代码段之前和之后立即调用 QueryPerformanceCounter,则计数器值可能分别为1500计数和3500计数.这些值表示执行代码时经过了0.04秒(2000个计数).


por*_*ges 13

这不仅仅是StopWatch更准确,而且DateTime.Now在某些情况下会产生不正确的结果.

考虑在夏令时切换期间发生的事情,例如 - 使用DateTime.Now实际上可以给出否定答案!


Len*_*rri 6

我通常StopWatch用于这种情况.

来自MSDN页面:

跑表

提供一组方法和属性,可用于准确测量经过的时间.

在以下文章中,我用它来比较LINQ与PLINQ的执行时间:

与Visual Studio 2010并行LINQ(PLINQ)


Ham*_*jan 5

也不会损害性能,因为你说这不是那么重要.StopWatch似乎更合适 - 你只是从时间减去时间而不是从另一个减去一个日期.日期内容需要更多的内存和CPU时间来处理.如果您计划在多个地方重复使用,还有一些方法可以使代码更清晰.using想到重载.我会搜索一个例子.好的,代码被盗:

http://stevesmithblog.com/blog/great-uses-of-using-statement-in-c/

public class ConsoleAutoStopWatch : IDisposable
{
    private readonly Stopwatch _stopWatch;

    public ConsoleAutoStopWatch()
    {
        _stopWatch = new Stopwatch();
        _stopWatch.Start();
    }

    public void Dispose()
    {
        _stopWatch.Stop();
        TimeSpan ts = _stopWatch.Elapsed;

        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                                           ts.Hours, ts.Minutes, ts.Seconds,
                                           ts.Milliseconds / 10);
        Console.WriteLine(elapsedTime, "RunTime");
    }
}

private static void UsingStopWatchUsage()
{
    Console.WriteLine("ConsoleAutoStopWatch Used: ");
    using (new ConsoleAutoStopWatch())
    {
        Thread.Sleep(3000);
    }
}
Run Code Online (Sandbox Code Playgroud)