.net 计算方法的执行时间

oogrdqng  于 2023-04-22  发布在  .NET
关注(0)|答案(8)|浏览(279)

可能重复:

How do I measure how long a function is running?
我有一个I/O耗时方法,它将数据从一个位置复制到另一个位置。计算执行时间的最佳和最真实的的方法是什么?ThreadTimerStopwatch?任何其他解决方案?我想要最准确的一个,尽可能简单。

arknldoa

arknldoa1#

Stopwatch就是为此目的而设计的,它是测量. NET中执行时间的最佳方法之一。

var watch = System.Diagnostics.Stopwatch.StartNew();
// the code that you want to measure comes here
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;

Do not use DateTime用于测量. NET中的执行时间。
更新:
正如@series0ne在评论部分所指出的:如果你想对某些代码的执行进行真实的精确的测量,你将不得不使用操作系统中内置的性能计数器。

ivqmmu1c

ivqmmu1c2#

根据个人经验,System.Diagnostics.Stopwatch类可以用来度量方法的执行时间,但是注意:这并不完全准确!

考虑以下示例:

Stopwatch sw;

for(int index = 0; index < 10; index++)
{
    sw = Stopwatch.StartNew();
    DoSomething();
    Console.WriteLine(sw.ElapsedMilliseconds);
}

sw.Stop();

示例结果

132ms
4ms
3ms
3ms
2ms
3ms
34ms
2ms
1ms
1ms

现在你想知道;* “为什么第一次花了132毫秒,而其余时间明显更少?"*
答案是Stopwatch不会补偿.NET中的“背景噪声”活动,例如JIT。因此,第一次运行方法时,.NET JIT首先执行。执行此操作所需的时间将添加到执行时间中。同样,其他因素也会导致执行时间发生变化。
您真正需要的是性能分析的绝对准确性!

请看以下内容:

RedGate ANTS Performance Profiler是一个商业产品,但产生非常准确的结果。
下面是一篇关于性能分析的StackOverflow文章:- What Are Some Good .NET Profilers?
我还写了一篇关于使用秒表进行性能分析的文章,您可能想看看-Performance profiling in .NET

vhipe2zx

vhipe2zx3#

StopWatch类寻找您的最佳解决方案。

Stopwatch sw = Stopwatch.StartNew();
DoSomeWork();
sw.Stop();

Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);

它还有一个名为Stopwatch.IsHighResolution的静态字段。当然,这是硬件和操作系统的问题。
指示计时器是否基于高分辨率性能计数器。

tjjdgumg

tjjdgumg4#

如果您有兴趣了解性能,最好的答案是使用分析器。
否则,System.Diagnostics.StopWatch提供高分辨率定时器。

qvk1mo1f

qvk1mo1f5#

以下是Microsoft Doc

using System;
using System.Diagnostics;
using System.Threading;
class Program
{
    static void Main(string[] args)
    {
        Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();
        Thread.Sleep(10000);
        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("RunTime " + elapsedTime);
    }
}

输出:RunTime 00:00:09.94

axkjgtzd

axkjgtzd6#

StopWatch将使用高分辨率计数器
Stopwatch通过对基础计时器机制中的计时器滴答计数来测量运行时间。如果安装的硬件和操作系统支持高分辨率性能计数器,则Stopwatch类使用该计数器来测量运行时间。否则,Stopwatch类使用系统计时器来测量运行时间。使用Frequency和IsHighResolution字段可确定Stopwatch计时实现的精度和分辨率。
如果你在测量IO,那么你的数字可能会受到外部事件的影响,我会担心太多的re.xacutness *(正如你上面所指出的)。相反,我会采取一系列测量,并考虑这些数字的平均值和分布。

eh57zj3b

eh57zj3b7#

您还可以使用此“获取自系统启动以来经过的毫秒数”。

System.Environment.TickCount

举个例子

static void method1()
{
    for (int i = 1; i <= 100; i++)
    {
        Console.WriteLine("Test1 " + i);
    }
}
static void Main(string[] args)
{
    var startTime = Environment.TickCount;
    method1();
    var endTime = Environment.TickCount;
    Console.WriteLine("RunTime " + (endTime - startTime));
}
of1yzvn4

of1yzvn48#

using System.Diagnostics;
 class Program
 {
    static void Test1()
    {
        for (int i = 1; i <= 100; i++)
        {
            Console.WriteLine("Test1 " + i);
        }
    }
  static void Main(string[] args)
    {

        Stopwatch sw = new Stopwatch();
        sw.Start();
        Test1();
        sw.Stop();
        Console.WriteLine("Time Taken-->{0}",sw.ElapsedMilliseconds);
   }
 }

相关问题