2011-10-19 47 views
8

我有一个客户端/服务器应用程序。服务器组件运行时,以“远程处理”方式(二进制格式化程序,会话对象)使用WCF。附带调试器的C#代码非常慢; MemoryMappedFile的错?

如果我启动服务器组件并启动客户端,则服务器在第一个任务中将完成0.5秒的<。

如果我使用附加的VS调试器启动服务器组件,然后启动客户端,则任务需要20秒才能完成。

没有代码更改 - 没有条件编译更改。无论我的服务器组件是以32位,64位,VS托管流程,没有VS托管流程还是任何这些组合的方式编译和运行,都会发生同样的情况。

可能重要:如果我用VS.NET 探查(采样模式),然后应用程序,就好像没有附加的调试运行一样快。所以我不能这样诊断。刚刚检查,仪器模式也运行得很快。对于并发性分析模式也是如此,可以快速运行。

主要数据:

  • 应用程序使用相当沉重的多线程(在标准的线程池40个线程)。创建线程很快就会发生,而且不是一个慢点。有很多锁,WaitHandle s和Monitor模式
  • 该应用程序根本没有引发异常。
  • 该应用程序不会创建控制台输出。
  • 该应用程序是完全托管代码。
  • 该应用程序并在磁盘上映射的几个文件到MemoryMappedFile:1x750MB和12x8MB和一些规模较小的

实测表现:

  • CPU使用率在两种情况下最小;当连接调试器时,CPU位于< 1%
  • 在这两种情况下,内存使用都很少;在这两种情况下
  • 有很多页面故障发生(参考MMF)的大概有50或60MB,但是当调试器附加
  • 如果VS宿主进程不使用,或基本上是“远程调试它们发生更慢显示器“进入游戏,然后使用一个体面的CPU,并创建了很多页面错误。但这不是发生问题的唯一时间
  • 无论客户端如何运行,都会看到性能差异。唯一被更改的变量是通过“从调试开始”vs从资源管理器启动的服务器组件。

我的想法:当调试

  • WCF慢?
  • MemoryMappedFiles调试速度慢吗?
  • 使用40个线程 - 调试速度慢?也许监视器/锁通知调试器?线程调度变得很奇怪/上下文切换非常罕见?
  • 宇宙背景辐射授予的智慧和幽默的残酷感VS

都显得愚蠢的可能性不大。

所以,我的问题:

  1. 这究竟是为什么?
  2. 如果#1未知,我该如何诊断/发现?
+1

是否启用第一个机会异常收获?您还可以尝试启用.NET服务器源代码步进,以在调试模式下捕获最多潜在的“隐藏”异常,特别是(de)服务器异常。另外,痕迹(outputdebugstring或其他)呢? –

+0

是的,根本不会引发任何异常 - 所有类别的异常(包括.NET)都有第一次机会。没有调试控制台输出(这就是我的意思是控制台输出 - 我会编辑澄清)。我刚刚启用.NET框架源步进(无法看到服务器源步进)..发现一些例外。将暂时更新 –

+0

来自WCF的异常:“'字符,十六进制值0x20,不能包含在名称中。”我不知道*可以用这种方式隐藏异常:不是例外吗?将看我能做些什么来解决。也许你可以发表一个答案,这样你可以得到一些upvotes /一个接受,如果这能解决它? :) –

回答

9

异常可显着影响应用程序的性能。有两种类型的异常:第一次机会异常(用try/catch块优雅地处理的异常)和未处理的异常(最终会使应用程序崩溃)。

默认情况下,调试器不显示第一次机会异常,它只是显示未处理的异常。并且默认情况下,它也只显示代码中发生的异常。但是,即使它没有显示它们,它仍然会处理它们,所以它的性能可能会受到影响(尤其是在负载测试或大型循环运行中)。

要在Visual Studio中启用第一次机会例外显示,请单击“Debug | Exceptions”以调用Exceptions对话框,并在“Common language runtime”部分检查“Thrown”(您可以更具体地选择第一个偶然的例外,你想看到)。

为了使第一次机会异常从任何地方的应用程序中显示始发,不只是从你的代码,点击“工具|选项|调试|常规”和禁用“启用仅我的代码”选项。

为这些特定“取证方式”的情况下,我也强烈建议,以使.NET框架源步进(它需要“启用仅我的代码”被禁用)。这是非常有用的理解发生了什么事情,有时只是在看调用堆栈是非常鼓舞人心的 - 和乐于助人尤其是在宇宙辐射的mixup的:-)情况

两个相关的有趣的文章:

+1

根据我的其他意见,这个例外是完全'隐藏'的,直到我启用'.NET Framework源程序步骤'。 SerializableInfo.SetValue()抛出一个关于'string'参数的异常不是一个有效的XML元素名称,即使它可以继续工作,而且我使用的是NetTcpBinding(即二进制格式化程序) 。 –

2

由于这是google搜索这个问题,我想在这里补充我的问题解决方案,节省人2个小时的研究就像我的希望,当第一批成果之一我的情况。

我的代码从30秒减慢不附加到4分钟,调试器的调试器。因为我忘记删除一个条件断点。这些似乎执行大大减缓,所以,要当心那些