Analyzing.NETApplicationswithStopwatchAnalyzing.NETApplications似乎没有免费的*.NET性能分析器可以逐行分析。所以我正在研究使用秒表进行分析。*在Liberty中免费,即许可证包括商业用途。编辑:为了回应人们告诉我“买一个分析器”,我想,但如果我能花那么多钱,我会把它花在别的东西上。我试图说服我的老板,一个剖析器是值得的,但运气不佳。这个问题主要是出于好奇。我永远不会认为秒表可以替代真正的分析器。我有一个小型测试应用程序(用C#编写),用于测量在每一行上使用秒表时的性能差异。测试代码是这样的:intn=100;大整数f=1;对于(inti=n;i>1;i--){f*=i;这里是完整的代码:http://pastebin.com/AvbQmT32我有一个秒表用于每一行代码。这是我的“分析器”。我还有一个整个节目的秒表。这是我的“探查器探查器”。我将程序配置为发布模式、任何CPU(在x64机器上),并禁用优化。当我在禁用探查器的情况下运行程序时,我得到:滴答声-----------------------------|------------|总时间:|359当我在启用探查器的情况下运行它时,我得到如下信息:Line|滴答声----------------------------|------------|整数n=100;|3大整数f=1;|12for(inti=n;i>1;i--)|第325章f*=我;|第539章|总时间:|1710秒表头顶:|831Ideallyspentinbothcases代码上的时间应该相等,但看起来秒表的开销发生在它们自己的运行时间中。现在,通常不需要剖析程序的每一行,因为分而治之的方法通常效果更好。您通常可以从分析一段代码开始,缩小任何性能问题的范围。此外,在大多数应用程序中,平均代码行将比测试程序中的代码慢得多。这意味着更少的秒表开销。但是,使用秒表时仍然存在开销,尤其是当您经常使用它们时。所以问题是:使用秒表进行分析的最有效方法是什么?如何最小化开销?是否值得将秒表包含在一个语句中?感谢您的反馈意见。首先要注意的是:您的结果并不令人惊讶。如果您使用商业分析器,您会看到类似的情况:分析时您的程序需要更长的时间才能运行。您可以将分析器设置得越精细,预期的时间就越长。当您考虑像“i>1”和“i–”这样的语句很可能作为单处理器指令执行时,很明显为什么分析特定行的执行时间比执行该行本身需要更长的时间。分析会增加程序的整体运行时间这一事实应该不是问题。正如其他几个人提到的那样,重要的不是程序运行的绝对时间,而是比较各个部分的运行时间以找出瓶颈。但是还有一个问题。秒表将使用底层操作系统中的高频计时器(如果可用);但即便如此,也可能还不够高。我的Windows764位i5-2400(四核3.10GHz)上的高频计时器每秒发送3,020,556次。听起来很多;但以这种速度,处理器可以在滴答之间执行一千条指令。这意味着,如果您试图测量执行一条指令所花费的时间,要么时间不够,要么时间过长。最好在方法级别进行分析。即便如此,您还是会遇到频率问题,特别是如果您有一些精心设计的方法。但结果会比在线水平更可靠;一旦确定了导致瓶颈的方法,就可以直接检查它以确定如何优化它以更好地执行。所有这些都抛弃了与一般分析相关的许多警告,这些警告超出了本文的范围。确保你对这个主题做了额外的研究,看看你应该如何解释你得到的结果。举个简单的例子,您的分析可能会显示您程序中的大部分时间都花在了一个特定的方法上;但这是否意味着方法本身就是问题所在,还是其他方法经常调用它?回答这类问题才是分析的真正难点。考虑到我们经常通过单一职责原则直观地编程,不仅在类型方面而且在功能方面,我想说没有任何方法可以逐行分析应用程序。您将对分析每一行的“单一职责”更感兴趣。当然,对于需要提供信息的情况也是如此。但是不要在所有应用程序中都使用它,在函数的单个部分或单个函数中使用它。在这种情况下,秒表是最佳选择。考虑到StopWatch是一个.NET类,所以它的开销甚至很小。你不应该看绝对值,而应该看相对值。希望这可以帮助。您不应该查看确切的数字,而应该查看相对差异。这样您就可以确定问题区域。您正在寻找可以解决性能问题的优化地方。如果您在性能实际上是一个问题的级别开发代码,并且您需要对其进行分析以找到有问题的代码,那么购买一个工具来为您执行此操作将在节省时间方面获得更多回报。VisualStudioPremium附带的探查器是我推荐的。您是否尝试查看CInject:http://codeinject.codeplex.com/documentation?它基本上是将代码注入到DLL中。开箱即用,它似乎具有性能监控功能,但它还允许您创建自己的代码注入。似乎很适合您要尝试做的事情。您是否将没有分析器的总时间与在调试模式下使用分析器的时间进行了比较?我的第一个猜测是额外的时间即将到来,因为秒表的额外声明阻止了一些寄存器或循环优化。因此,额外的时间可能来自优化缺失,而不是秒表的一些时间损失。然而,话虽如此,即使秒表的分辨率很高,我想您也会注意到一些时间误差测量结果小到一行代码。例如'intn=100'是汇编中的一行,所以在技术术语中我认为它只有1个刻度。您注意到每次运行的数字有多大变化?如果您得到的变化是平均值的很大一部分,那么该值并不能真正为您提供那么多信息。也许您应该考虑分析方法调用时间而不是单行。毕竟,方法调用通常是调用代码中的一行。另一种有趣的方法是使用日志库来记录方法的进入和退出,例如,像这样(使用log4net作为选择的记录器):publicstringMyMethod(stringarg){stringresult=null;如果(logger.IsDebugEnabled)记录器.Debug("->MyMethod("+arg+")");//做一些事情result="Helloworld!";if(logger.IsDebugEnabled)logger.Debug("这将创建一个日志文件,这对于查看应用程序正在做什么很有用,它可以为写入日志的每一行添加时间戳,因此您可以查看是否特定方法需要很长时间。使用log4net,您可以轻松更改配置以关闭注销,因此当您不需要它时您不会付出任何性能损失。如果您有VisualStudioUltimate,请尝试VisualStudioProfiler,非常不错,C#学习教程:Profiling.NETApplicationswithStopwatch分享的就这些,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注---本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,如需转载请注明出处:
