Visual Studio 2008“调试非常慢”托管到非托管转换(不过只有一台计算机)
本文关键字:计算机 一台 转换 调试 2008 Studio 非常 Visual 调试非常慢 | 更新日期: 2023-09-27 18:20:02
我有一些C#代码,它们在NUnit测试中通过p/Invoke函数调用将委托作为回调传递给非托管方法。
该代码运行良好,在Relase和Debug模式下都通过了所有测试。无论是否在调试器下运行,它都能在一台机器上快速运行。
但是,在为即将开始的新开发人员在另一台PC上设置了几乎相同的开发环境后,它在发布和调试配置中运行得很快。但是当连接调试器时速度非常慢。
请注意,我看到了在项目上启用"调试非托管代码"时出现的一种缓慢情况。我已经禁用了它,重新编译了它,与或w/o无关。我两种方法都试了好几次。
此外,没有设置任何断点或观察变量。
顺便说一句,这个单元测试实际上在循环中调用了100万次非托管方法,该方法在计数器递增后返回。这是一个非常简单的代码,只测试跨AppDomains进行非托管调用的性能。
请记住,这是来自git提交的相同代码,只有在其中一台计算机上的调试器下运行时才会缓慢。它们之间没有代码修改的区别,所以这似乎不是一个"代码"问题,而是Visual Studio中与非托管调试和托管调试相关的设置,我会疯狂地猜测。
提前感谢您的任何想法。如果你真的认为看到代码会有所帮助。我将发布单元C#测试和cpp文件。
编辑:我缩小了调试器中的这种缓慢只发生在调用不同AppDomain的非托管代码中。因此,在这些性能测试中有主AppDomain和另一个辅助AppDomain。测试托管到非托管调用以从主域回调到自身。这些很快!但是那些从非托管回调到另一个AppDomain的速度非常非常慢。这意味着从每秒2000万下降到每秒仅4000或5000。
请注意,被调用进行测试的方法是void callback(),所以不是参数或返回值。换句话说,马歇尔什么都没有。
编辑:我用不同的设置进行切换,现在我的开发框也很慢。我确信是"只是我的代码"设置关闭了速度更快的机器,所以它可以尝试一下。但现在,即使再次禁用它,它仍然很慢。所以不确定这是否是原因。
检查两台机器上的符号文件设置是否相同。为本机代码加载所有符号可能需要很长时间(工具->选项->调试->符号)。