我有一个I / O计时方法,可以将数据从一个位置复制到另一个位置。什么是计算执行时间的最佳和最实际的方法? Thread
? Timer
? Stopwatch
?还有其他方法吗?我想要最准确的一个,尽可能简短。
答案 0 :(得分:932)
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在评论部分所指出的:如果想要对某些代码的执行进行真正精确的测量,则必须使用内置于操作系统中的性能计数器。 following answer包含一个很好的概述。
答案 1 :(得分:62)
根据个人经验,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是一种商业产品,但可以产生非常准确的结果。 - Boost the performance of your applications with .NET profiling
以下是有关分析的StackOverflow文章: - What Are Some Good .NET Profilers?
我还写了一篇关于使用秒表的性能分析的文章,你可能想看一下 - Performance profiling in .NET
答案 2 :(得分:24)
StopWatch
课程寻找最佳解决方案。
Stopwatch sw = Stopwatch.StartNew();
DoSomeWork();
sw.Stop();
Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);
它还有一个名为Stopwatch.IsHighResolution
的静态字段。当然,这是硬件和操作系统问题。
指示计时器是否基于高分辨率性能 计数器。
答案 3 :(得分:17)
如果您对了解性能感兴趣,最好的答案是使用分析器。
否则,System.Diagnostics.StopWatch提供高分辨率计时器。
答案 4 :(得分:7)
StopWatch将使用高分辨率计数器
秒表通过计算计时器滴答来测量经过的时间 基础计时器机制。如果安装了硬件并运行 系统支持高分辨率性能计数器,然后 秒表类使用该计数器来测量经过的时间。除此以外, 秒表类使用系统计时器来测量经过的时间。使用 Frequency和IsHighResolution字段用于确定精度 和秒表计时实施的解决方案。
如果您正在测量IO,那么您的数据可能会受到外部事件的影响,我会非常担心。 准确性(如上所述)。相反,我会进行一系列测量,并考虑这些数字的平均值和分布。
答案 5 :(得分:2)
遵循此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
答案 6 :(得分:0)
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);
}
}
答案 7 :(得分:0)
我为此目的使用了Environment.TickCount
属性。
int start = Environment.TickCount;
// Your code here...
int end = Environment.TickCount;
int diffInMilliseconds = end - start;