与标题所说的差不多:我正在运行一个很长的程序,并且它附加了CLR调试器,因此我可以捕获和检查异常。我得到的性能是否可以与不使用调试器运行它相媲美,或者是否存在严重的(2-10倍或更多)代价?
发布于 2010-08-13 09:05:38
最重要的是:工具+选项,调试,常规,抑制模块加载的JIT优化。如果您想调试发布代码并获得类似的性能,则需要将其关闭。然而,这确实增加了调试代码的难度,JIT优化器将在CPU寄存器中存储局部变量(Watch不起作用),并对代码进行重新排序和内联(单步执行很奇怪)。
然后是由编译器自动生成的DebuggableAttribute。它的IsJITOptimizerEnabled和IsJITTrackingEnabled属性很重要。首先,它们的作用是使局部变量的存活时间比必要的长一点,从而防止垃圾收集器收集您可能希望在调试器中检查的引用。很容易避免,只需调试发布版本,而不是调试版本。
然后,在你的程序中会发生一些特定的事情,唤醒调试器,使其窃取CPU周期:
当你的程序抛出异常时,
就是这样,调试器不会妨碍你的代码,只要它不做上面列出的事情,它就会让你的代码全速运行。像ASP.NET和Silverlight这样的运行时环境是特殊的,可能会有额外的开销。在64位操作系统上调试任何CPU程序也是如此,这需要远程调试器,因为VS仅为32位。
发布于 2010-08-13 07:13:03
是的,我已经看到了相当大的不同。
特别是,当抛出异常时,当附加调试器时,它们花费的时间要长得多。还有一些其他重要的优化可以影响行为-例如,当未附加调试器时,垃圾收集器会更具侵略性。
为什么不直接记录异常而不是进入调试器呢?抛开其他事情不谈,这意味着如果你想回到过去,看看昨天发生的异常,并将它与刚刚发生的异常进行比较,这很容易……更难回到过去:)
发布于 2010-08-13 07:01:14
附加调试器会禁用一些JIT优化--例如函数内联。
http://msdn.microsoft.com/en-us/library/bb384548.aspx
你的表现可能会更差。
https://stackoverflow.com/questions/3472671
复制相似问题