我需要找到一个瓶颈,并需要尽可能准确地测量时间。
下面的代码片段是衡量性能的最佳方法吗?
DateTime startTime = DateTime.Now;
// Some execution process
DateTime endTime = DateTime.Now;
TimeSpan totalTimeTaken = endTime.Subtract(startTime);
我需要找到一个瓶颈,并需要尽可能准确地测量时间。
下面的代码片段是衡量性能的最佳方法吗?
DateTime startTime = DateTime.Now;
// Some execution process
DateTime endTime = DateTime.Now;
TimeSpan totalTimeTaken = endTime.Subtract(startTime);
当前回答
我很少做这种性能检查(我倾向于认为“这个很慢,让它快一点”),所以我几乎总是这样做。
谷歌确实显示了许多用于性能检查的资源/文章。
许多人提到使用pinvoke来获取性能信息。我研究的很多材料都只提到了使用perfmon..
编辑:
看过秒表的对话..好了!我学到了一些东西:)
这篇文章看起来不错
其他回答
这些都是衡量时间的好方法,但这只是发现瓶颈的一种非常间接的方法。
在线程中找到瓶颈的最直接方法是让它运行,当它正在做任何让您等待的事情时,使用暂停或中断键停止它。这样做几次。如果你的瓶颈占用了X%的时间,那么X%就是你在每次快照中捕捉到它的概率。
这里有一个更完整的解释,它是如何以及为什么工作的
这是正确的方法:
using System;
using System.Diagnostics;
class Program
{
public static void Main()
{
Stopwatch stopWatch = Stopwatch.StartNew();
// some other code
stopWatch.Stop();
// this not correct to get full timer resolution
Console.WriteLine("{0} ms", stopWatch.ElapsedMilliseconds);
// Correct way to get accurate high precision timing
Console.WriteLine("{0} ms", stopWatch.Elapsed.TotalMilliseconds);
}
}
要了解更多信息,请使用秒表而不是DataTime来获得准确的性能计数器。
Visual Studio Team System有一些功能可以帮助解决这个问题。从本质上讲,您可以编写单元测试,并将它们混合在不同的场景中,作为压力或负载测试的一部分对您的软件运行。这可能有助于识别对应用程序性能影响最大的代码区域。
微软的模式和实践小组在Visual Studio团队系统性能测试指南中提供了一些指导。
不,不是。使用秒表(在系统诊断中)
Stopwatch sw = Stopwatch.StartNew();
PerformWork();
sw.Stop();
Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);
秒表自动检查是否存在高精度计时器。
值得一提的是DateTime。Now通常比DateTime慢一些。UtcNow是因为需要在时区、夏令时等方面做一些工作。
DateTime。UtcNow的分辨率通常为15毫秒。请看John Chapman关于DateTime的博客文章。现在我们来做一个精确的总结。
有趣的琐事:秒表回落到DateTime。UtcNow如果你的硬件不支持高频计数器。你可以通过查看静态字段Stopwatch. ishighresolution来检查Stopwatch是否使用硬件来实现高精度。
秒表的功能会更好(精度更高)。我还建议下载一款流行的分析器(DotTrace和ANTS是我用得最多的…免费试用的DotTrace功能齐全,不像其他一些唠叨)。