正如标题所说:我正在运行一个很长的程序,并且它附加了 CLR 调试器,因此我可以捕获和检查异常。我获得的性能是否与不使用调试器运行它相当,或者我是否付出了严重的(2-10 倍或更多)代价?
最重要的是:工具+选项、调试、常规、抑制模块加载的 JIT 优化。如果您想调试发布代码并获得可比较的性能,则需要关闭它。然而,这确实使调试代码变得更加困难,JIT 优化器会将局部变量存储在 CPU 寄存器中(Watch 不起作用)并重新排序和内联代码(步进行为很奇怪)。
然后是由编译器自动生成的 DebuggableAttribute。它的 IsJITOptimizerEnabled 和 IsJITrackingEnabled 属性很重要。首先,它们的作用是使局部变量的存活时间比必要的时间长一点,从而防止垃圾收集器收集您可能想要在调试器中检查的引用。很容易避免,只需调试 Release 版本而不是 Debug 版本。
然后,程序中会发生一些特定的事情,唤醒调试器并使其窃取 CPU 周期:
- 当你的程序抛出异常时。调试器在抛出它之前对其进行射击。称为“第一次机会通知”,您可以在“输出”窗口中看到它。这就是“调试 + 异常”对话框发挥作用的原因。大大减慢了异常处理的速度。
- 当您的程序加载或卸载 DLL 时。加载时会发生很多事情,调试器会尝试查找 DLL 的符号。检查是否需要激活任何断点。并在输出窗口中显示通知。这通常只会使程序的启动速度变慢,尤其是当您打开混合模式调试时。
- 当您将 Trace 类与 DefaultTraceListener、Debug.Write/Line() 方法或 Console.Write/Line 结合使用并启用托管进程时。输出出现在“输出”窗口中,大大减慢了这些调用的速度。
- 当程序中的线程启动或停止时。在输出窗口中可见。让这个减慢你的程序将是一个设计错误。
就是这样,调试器不会妨碍您的代码,只要它不执行上面列出的操作,它就可以全速运行。 ASP.NET 和 Silverlight 等运行时环境很特殊,可能会产生额外的开销。在 64 位操作系统上调试 Any CPU 程序也是如此,这需要远程调试器,因为 VS 仅是 32 位的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)