提问人:Mahdi Tahsildari 提问时间:12/24/2012 最后编辑:CommunityMahdi Tahsildari 更新时间:4/17/2023 访问量:688944
计算方法的执行时间
Calculate the execution time of a method
问:
可能的重复:
如何测量函数的运行时间?
我有一个 I/O 耗时方法,可以将数据从一个位置复制到另一个位置。计算执行时间的最佳和最真实的方法是什么???????还有其他解决方案吗?我想要最准确的,尽可能简短。Thread
Timer
Stopwatch
答:
秒表
是为此目的而设计的,是在 .NET 中测量时间执行的最佳方法之一。
var watch = System.Diagnostics.Stopwatch.StartNew();
// the code that you want to measure comes here
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
不要使用 DateTime 来度量 .NET 中的时间执行。
更新:
正如 @series0ne 在评论部分所指出的那样:如果你想真正精确地测量某些代码的执行,你将不得不使用操作系统中内置的性能计数器。以下答案包含一个很好的概述。
评论
ThreadPool.QueueUserWorkItem(delegate { CopyFiles(folder, dest); });
如果您有兴趣了解性能,最好的答案是使用探查器。
否则,System.Diagnostics.StopWatch 将提供高分辨率计时器。
评论
StopWatch
类寻找您的最佳解决方案。
Stopwatch sw = Stopwatch.StartNew();
DoSomeWork();
sw.Stop();
Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);
此外,它还有一个名为 Stopwatch.IsHighResolution
的静态字段。当然,这是硬件和操作系统的问题。
指示计时器是否基于高分辨率性能 计数器。
StopWatch 将使用高分辨率计数器
秒表通过计算计时器滴答声来测量经过的时间 底层计时器机制。如果已安装硬件并运行 系统支持高分辨率性能计数器,然后 秒表类使用该计数器来测量经过的时间。否则 Stopwatch 类使用系统计时器来测量经过的时间。用 用于确定精度的 Frequency 和 IsHighResolution 字段 以及秒表计时实现的分辨率。
如果你正在测量 IO,那么你的数据可能会受到外部事件的影响,我会非常担心。精确性(如上所述)。相反,我会进行一系列测量,并考虑这些数字的平均值和分布。
根据个人经验,该类可用于测量方法的执行时间,但是,请注意:它并不完全准确!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 毫秒,而其余时间却少得多?”
答案是,它不能补偿 .NET 中的“背景噪音”活动,例如 JITing。因此,首次运行方法时,首先使用 .NET JIT。执行此操作所需的时间将添加到执行时间中。同样,其他因素也会导致执行时间不同。Stopwatch
您真正应该寻找绝对准确性的是性能分析!
请看以下内容:
RedGate ANTS Performance Profiler 是一种商业产品,但会产生非常准确的结果。- 通过 .NET 分析提高应用程序的性能
这是一篇关于分析的 StackOverflow 文章: - 有哪些好的 .NET 分析器?
我还写了一篇关于使用 Stopwatch 进行性能分析的文章,您可能想看看 - .NET 中的性能分析
评论
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);
}
}
遵循此 Microsoft 文档:
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
您还可以使用此功能,“获取自系统启动以来经过的毫秒数”。
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));
}
评论