可能重复:
如何测量功能运行了多长时间?
我有一种I / O耗时方法,可将数据从一个位置复制到另一个位置。计算执行时间的最好,最真实的方法是什么?Thread
?Timer
?Stopwatch
?还有其他解决方案吗?我想要最精确,最简短的一个。
可能重复:
如何测量功能运行了多长时间?
我有一种I / O耗时方法,可将数据从一个位置复制到另一个位置。计算执行时间的最好,最真实的方法是什么?Thread
?Timer
?Stopwatch
?还有其他解决方案吗?我想要最精确,最简短的一个。
Answers:
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在注释部分所指出的:如果要真正精确地度量某些代码的执行情况,则必须使用操作系统内置的性能计数器。在以下的答案必须包含一个很好的概述。
从个人的经验来看,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
现在您想知道;“那为什么第一次要花132ms,而其余时间却少得多?”
答案是Stopwatch
不能补偿.NET中的“背景噪声”活动,例如JITing。因此,第一次运行您的方法时,.NET JIT首先。执行此操作所需的时间将添加到执行时间中。同样,其他因素也会导致执行时间发生变化。
您真正需要的绝对精度是性能分析!
看一下以下内容:
RedGate ANTS Performance Profiler是一种商业产品,但是可以产生非常准确的结果。- 通过.NET概要分析提高应用程序的性能
这是有关概要分析的StackOverflow文章:- 什么是一些好的.NET Profiler?
我还写了一篇有关使用Stopwatch进行性能分析的文章,您可能想看看-.NET中的性能分析
StopWatch
全班寻找您最好的解决方案。
Stopwatch sw = Stopwatch.StartNew();
DoSomeWork();
sw.Stop();
Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);
它还有一个称为的静态字段Stopwatch.IsHighResolution
。当然,这是硬件和操作系统问题。
指示计时器是否基于高分辨率性能计数器。
如果您对了解性能感兴趣,最好的答案是使用探查器。
否则,System.Diagnostics.StopWatch提供一个高分辨率计时器。
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);
}
}
ThreadPool.QueueUserWorkItem(delegate { CopyFiles(folder, dest); });
内部有一个foreach循环,但是秒表在一切完成之前就停止了。