首页 / 知识
关于C#:DateTime.Now是测量函数性能的最佳方法吗?
2023-04-13 06:32:00
Is DateTime.Now the best way to measure a function's performance?我需要找到一个瓶颈,并需要尽可能准确地测量时间。 下面的代码片段是衡量性能的最佳方法吗?
不,不是。使用秒表(在
秒表自动检查是否存在高精度计时器。 值得一提的是, datetime.utcnow的分辨率通常为15 ms。请参阅John Chapman关于 有趣的小窍门:如果你的硬件不支持高频计数器,秒表就会落在 如果你想要快速和肮脏的东西,我建议使用秒表代替更高的精度。
或者,如果你需要一些更复杂的东西,你应该考虑使用第三方剖析器,比如蚂蚁。 本文指出,首先需要比较三种备选方案: 它还显示,在某些情况下(性能计数器不存在时),秒表正在使用datetime.utcnow+一些额外的处理。因此,很明显,在这种情况下,datetime.utcnow是最佳选择(因为其他人使用它+一些处理) 然而,事实证明,计数器几乎总是存在的——见关于高分辨率性能计数器及其存在与.NET秒表相关的解释?. 这是一个性能图。请注意,与其他替代方案相比,UTCNOW的性能成本有多低: X轴是样本数据大小,Y轴是示例的相对时间。 将基准代码推送到实用程序类/方法中是很有用的。错误时,
示例调用代码
这是扩展方法版本
和示例调用代码
秒表功能更好(精度更高)。不过,我还建议您下载一个流行的分析程序(dottrace和ants是我使用最多的分析程序)。dottrace的免费试用是完全功能性的,不像其他的一些那样唠叨。 使用System.Diagnostics.StopWatch类。
和秒表一样,它更好。 关于性能度量,您还应该检查您的"//某些执行过程"是否是一个非常短的过程。 还要记住,第一次运行"//some execution process"可能比随后的运行慢得多。 我通常通过在一个循环中运行1000次或1000000次来测试一个方法,我得到的数据比运行一次要准确得多。 这些都是衡量时间的好方法,但这只是找到瓶颈的一种非常间接的方法。 在线程中找到僵尸的最直接的方法是让它运行,当它做任何让您等待的事情时,用暂停或中断键停止它。这样做几次。如果瓶颈占用X%的时间,则X%是在每个快照的操作中捕获它的概率。 下面是一个更完整的解释,说明了它是如何工作的以及为什么工作的。 @ Sean Chambers 仅供参考,.NET计时器类不用于诊断,它以预设的间隔生成事件,如(来自msdn):
所以这真的不能帮助你知道花了多长时间,只是一段时间过去了。 计时器也在system.windows.forms中作为控件公开…您可以在VS05/VS08的设计器工具箱中找到它。 这是正确的方法:
有关更多信息,请使用秒表而不是数据时间来获得准确的性能计数器。 Visual Studio团队系统具有一些可能有助于解决此问题的功能。本质上,您可以编写单元测试,并将它们混合在不同的场景中,以作为压力测试或负载测试的一部分针对您的软件运行。这可能有助于识别对应用程序性能影响最大的代码区域。 微软的模式和实践小组在Visual Studio团队系统性能测试指南中有一些指导。 我刚刚在万斯莫里森的博客上发现了一篇关于他写的一个代码计时器类的文章,它使使用 这不够专业:
更可靠的版本是:
在我的实际代码中,我将添加gc.collect调用以将托管堆更改为已知状态,并添加sleep调用,以便在ETW配置文件中轻松地分隔不同的代码间隔。 我在程序中使用的方法是使用这里所示的秒表类。
我几乎没有做过这种性能检查(我倾向于认为"这很慢,速度更快"),所以我总是这样做。 谷歌确实为性能检查提供了大量的资源/文章。 很多人提到使用pinvoke获取性能信息。我学习的很多材料都只提到使用Perfmon。 编辑:看了秒表的谈话……好极了!我学到了一些东西:) 这篇文章看起来不错 |
最新内容
相关内容
python中获取路径的三种方法
python中获取路径的三种方法,工作,代码,情况,培训,下来,路径,文件,也就是,桌面,目录,python中获取路径总结下来分为三种情况:1、获取工作目录python中函数怎么表示?
python中函数怎么表示?,名称,标准,培训,代码,函数,圆括号,字符串,表达式,选择性,自变量,python中函数定义规则:·函数代码块以def关键词开头,后python有函数重载吗?
python有函数重载吗?,情况,代码,设计,名字,培训,函数,参数,功能,类型,两个,python中没有函数重载。为了考虑为什么python不提供函数重载,首先python函数里面形参和实参一样吗?
python函数里面形参和实参一样吗?,培训,函数,参数,里面,变量,实际,形式,全称,示例,后面,python函数里面形参和实参不一样。形参全称是形式参python中的open函数如何编码?
python中的open函数如何编码?,数据,系统,可取,培训,文件,参数,函数,时候,表示,模式,python中的open函数可以通过在打开文件时添加encoding参python中什么叫递归函数?
python中什么叫递归函数?,规模,培训,函数,嵌套,内部,不是,实例,特性,层次,效率,1、什么叫递归函数?在函数内部,可以调用其他函数。如果一个函python列表有哪些常用方法?
python列表有哪些常用方法?,位置,方法,培训,列表,语法,元素,示例,对象,以上,参数,列表是最常用的Python数据类型,它可以作为一个方括号内的逗python中的sum函数怎么用?
python中的sum函数怎么用?,培训,函数,总和,参数,列表,示例,语法,对象,以上,结果,python中的sum()函数用来进行求和计算,函数语法为:sum(iterablpython有主函数吗?
python有主函数吗?,代码,情况,培训,模块,函数,脚本,作用,方式,文件,文件名,python有主函数,书写格式如下:if__name__==__main__:passpython主函Python如何创建对象,有哪些方法
Python如何创建对象,有哪些方法,培训,对象,方法,内容,函数,属性,所在,以上,以下,功能,以下介绍Python创建对象的9种方法。classPoint:def__iniPython静态函数和普通方法的区别
Python静态函数和普通方法的区别,培训,方法,静态,区别,实例,函数,属性,结果,例子,下面,下面通过一个例子,讲解Python静态函数、普通方法、类方python里的max函数怎么用
python里的max函数怎么用,培训,表达式,数值,参数,函数,方法,序列,语法,以上,以下,python中的max()方法返回给定参数的值,参数可以为序列。以下