这是检查用C#运行某些代码所需时间的好方法吗?

这是检查用C#运行某些代码所需时间的好方法吗?,c#,datetime,C#,Datetime,我的意思是 获取时间、运行代码、获取时间、比较时间并获取秒数: 我这样做对吗 DateTime timestamp = DateTime.Now; //...do the code... DateTime endstamp = DateTime.Now; string results = ((endstamp.ticks - timestamp.ticks)/10000000).ToString(); 否。请改用系统.Diagnostics.Stopwatch类日期时间。现在没有您想要的精度

我的意思是

获取时间、运行代码、获取时间、比较时间并获取秒数:

我这样做对吗

DateTime timestamp = DateTime.Now;
//...do the code...
DateTime endstamp = DateTime.Now;

string results = ((endstamp.ticks - timestamp.ticks)/10000000).ToString();

否。请改用
系统.Diagnostics.Stopwatch
类<代码>日期时间。现在没有您想要的精度级别(尽管
日期时间
结构本身非常精确)

为此,您应使用,例如:

var sw = Stopwatch.StartNew();
//...do the code...
sw.Stop();
var result = sw.ElapsedTicks; //ticks it took
//or less accurate/for bigger tasks, sw.ElapsedMilliseconds

编辑以包含@在评论中的改进。

更好的方法是使用System.Diagnostics.StopWatch类

可能没问题,但请注意,“运行某些代码所花费的时间”有几种方法。你得到的是挂钟时间:世界上第一次和第二次调用
DateTime.Now
(大约)之间经过的时间量。这将包括等待锁或磁盘访问所花费的时间,运行不包含代码的其他线程所花费的时间等等。

显然,在您的机器上执行的任意进程可能会扭曲您得到的结果。
秒表是一种很好的解决方案,如MSDN中所述:

秒表通过计算底层计时器机制中的计时器滴答声来测量经过的时间。如果安装的硬件和操作系统支持高分辨率性能计数器,则Stopwatch类将使用该计数器测量经过的时间。否则,Stopwatch类使用系统计时器来测量经过的时间。使用频率和分辨率字段确定秒表计时实施的精度和分辨率


Stopwatch类帮助处理托管代码中与计时相关的性能计数器。具体地说,频率字段和GetTimestamp方法可以用来代替非托管的Win32 API QueryPerformanceFrequency和QueryPerformanceCounter。

这会稍微增加时间,但通常是有效的。您还可以遵循面向方面的原则,并采用类似log4net的方法来获得此功能,而无需到处编写代码


正如许多人所注意到的,高精度秒表类是为回答“这花了多长时间?”的问题而设计的,而DateTime类是为回答“什么时候开始的医生?”的问题而设计的,使用正确的工具来完成这项工作

然而,正确测量经过的时间的问题不仅仅是简单地正确设置计时器。你还必须确保你正在测量你真正想要测量的东西。例如,考虑:

// start the timer
M();
// stop the timer
// start another timer
M();
// stop the timer
两次通话的时间安排是否会有显著差异?可能是的。记住,第一次调用方法时,抖动必须将其从IL编译成机器代码。这需要时间。在某些情况下,对一个方法的第一次调用可能比随后的每次调用加在一起的时间长很多倍


那么,哪种衡量标准是“正确的”?第一次测量?第二个?平均数是多少?这取决于您试图优化的目标。如果您正在优化快速启动,那么您非常关心jit时间。如果您正在优化预热服务器上每秒服务的相同页面数,那么您根本不关心jit时间,应该将测试设计为不测量jit时间。确保您正在测量您实际优化的对象。

前面答案中给出的建议适用于简单的测量。如果您需要更高级的东西,您可能需要使用探查器(有商用的和免费的,如)。

+1。快捷方式是:
var sw=Stopwatch.StartNew()将前两行合并为一行。另外,除非花费很少的时间,否则我更喜欢
sw.elapsedmillyses
,因为它对我来说比滴答声更重要。@Brian-我用了1000次,但从未注意到
.StartNew()
,先生。秒表也在几周前被很好地写在博客上并被公布了,DateTime有足够的精确度,但它没有相应的精确度。有关这方面的一些想法,请参阅。最好的工具是实际的配置文件工具,如RedGate profiler或visual studio的某个版本附带的工具。由于缺乏这些,安东尼所说的将是你最好的选择bet@George-对于大型操作或查看花费的时间,这可能是正确的,但对于短代码段,看看什么是做某事的最快方法,例如10000次……探查器会积极干预,可能不是获得准确结果的最佳方法。这很公平,很有道理。
// start the timer
M();
// stop the timer
// start another timer
M();
// stop the timer