我有一个客户端/服务器应用程序。服务器组件运行,以“远程处理”方式使用WCF(二进制格式化程序,会话对象)。
如果我启动服务器组件并启动客户端,则服务器执行的第一项任务在<0.5秒内完成。
如果我在连接了VS调试器的情况下启动服务器组件,然后启动客户端,则任务需要20秒才能完成。
没有代码更改 - 没有条件编译更改。无论我是否已经编译并运行32位,64位服务器组件,VS主机进程,没有VS主机进程,或者这些东西的任何组合,都会出现同样的情况。
可能很重要:如果我使用VS.NET profiler (采样模式),则应用程序运行速度就像没有连接调试器一样。所以我不能那样诊断它。刚检查,仪表模式也快速运行。对于并发性分析模式,同样快速。
关键数据:
WaitHandle
和Monitor
模式测量表现:
我的想法:
所有人似乎都不太可能。
所以,我的问题:
答案 0 :(得分:9)
异常会显着影响应用程序的性能。有两种类型的异常:第一次机会异常(使用try / catch块优雅处理的异常)和未处理的异常(最终会使应用程序崩溃)。
默认情况下,调试器不显示第一次机会异常,它只显示未处理的异常。默认情况下,它还仅显示代码中发生的异常。但是,即使它没有显示它们,它仍会处理它们,因此它的性能可能会受到影响(特别是在负载测试或大循环运行中)。
要在Visual Studio中启用第一次机会异常显示,请单击“调试|异常”以调用“异常”对话框,并在“公共语言运行时”部分中选中“抛出”(您可以更具体地选择第一次机会)你想看到的例外情况。)
要启用源自应用程序中任何位置的第一次机会异常显示,而不仅仅是代码,请单击“工具|选项|调试|常规”并禁用“启用我的代码”选项。
对于这些特定的“取证模式”情况,我还强烈建议启用.NET Framework源步进(它需要禁用“启用我的代码”)。了解正在发生的事情是非常有用的,有时只是看着调用堆栈是非常鼓舞人心的 - 特别是在宇宙辐射混合的情况下有用: - )
两篇相关的有趣文章:
答案 1 :(得分:5)
Since this is one of the first results when googling for this issue I would like to add my problem solution here in the hopes of saving someone 2 hours of research like in my case.
My code slowed down from 30 seconds without debugger attached to 4 minutes with debugger. because I forgot to remove a conditional breakpoint. These seem to slow down execution tremendously, so watch out for those