【问题标题】:Visual Studio 2008 Very Slow Debugging Managed to Unmanaged Transition (only one machine though)Visual Studio 2008 非常慢的调试托管到非托管转换(虽然只有一台机器)
【发布时间】:2012-02-06 13:28:01
【问题描述】:

我有一些 C# 代码通过 NUnit 测试中的 P/Invoke 函数调用将委托作为回调传递给非托管方法。

代码运行良好,在 Relase 和 Debug 模式下都通过了所有测试。而且它在一台机器上运行速度很快,无论是否在调试器下运行。

但是在另一台 PC 上为新开发人员设置几乎相同的开发环境后,它很快在发布和调试配置中运行得很快。但是附加调试器时速度非常慢。

请注意,我看到在项目上启用“调试非托管代码”时出现了一种缓慢的情况。我已经禁用了它,重新编译了它,无论是否使用都无关紧要。这两种方法我都试了好几次。

另外,没有设置任何断点或观察变量。

顺便说一句,这个单元测试实际上在循环中调用了 100 万次非托管方法,该方法在递增计数器后返回。这是非常简单的代码,仅用于测试跨 AppDomain 进行非托管调用的性能。

请记住,这是来自 git commit 的相同代码,仅在其中一台机器上的调试器下运行缓慢。它们之间的代码修改没有什么不同,因此这似乎最终不是“代码”问题,而是 Visual Studio 中与非托管与托管调试相关的某个设置,我会大惊小怪。

提前感谢您的任何想法。如果您真的认为查看代码会有所帮助。我也会发布单元 C# 测试和 cpp 文件。

编辑:我缩小了调试器中的这种缓慢仅发生在调用不同 AppDomain 的非托管代码的范围内。因此,在这些性能测试中,存在主要的和另一个次要的 AppDomain。托管到非托管调用经过测试以从主域回调到自身。那些很快!但是那些从非托管回调到另一个 AppDomain 的速度非常非常慢。这意味着从每秒 2000 万次下降到每秒只有 4 或 5000 次。

请注意,被调用来测试的方法是 void callback()——所以不是参数或返回值。换句话说,没有什么可以编组的。

编辑:我正在使用不同的设置进行调整,现在我的开发框也很慢。我确信这是因为速度更快的机器关闭了“只是我的代码”设置,所以让它可以尝试一下。但是现在,即使再次禁用它,它仍然很慢。所以不确定这是否是原因。

【问题讨论】:

  • 暗中刺探:本地与漫游用户配置文件?
  • 感谢您的建议,但这似乎超出了我的想象。什么是“漫游用户配置文件”?为什么它只会影响进行非托管转换的代码?哦,也许帖子很清楚所有代码性能测试只涉及 C# w/o unmanaged, P/Invoke 调用在调试器下工作正常?

标签: c# visual-studio-2008 debugging settings unmanaged


【解决方案1】:

检查两台机器上的符号文件设置是否相同。加载本机代码的所有符号可能需要很长时间(工具 -> 选项 -> 调试 -> 符号)。

【讨论】:

  • 我在两台电脑上的符号文件都是空的。该字段为空白。还有其他想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多