.net - 当附加调试器时,从 .Net 代码调用 C++ dll 的速度极其缓慢

标签 .net c++ visual-studio visual-studio-2008 interop

我正在使用 VS 2008 来编译和调试我的代码。在我的应用程序中,前端是C#,后端是C++。我通过互操作访问 C++ 代码。

我注意到的一件事是,如果我按 F5,并链接到 native 代码的调试版本,则运行 native 代码将需要 20 秒以上。如果我链接到 native 代码的发布版本,运行它所需的时间会减少到 7-8 秒。

如果我没有附加 VS 2008 调试器(即,我单击 IDE 外部的 exe),并且链接到 C++ 代码的发布版本,则运行 C++ 只需 1 秒代码。

请注意,对于所有测试,C++ 代码的输入始终相同。

当然,存在一些与调试器附件和调试构建相关的开销。但性能上的差异太大了。有什么我错过的或者我可以调整的吗?

我发现这很令人费解;根据我的经验,C# 不会引入这么多开销,无论您是否使用调试器运行,或者是否在 Debug模式下运行。

最佳答案

我最好的猜测是加载调试符号是拖慢你速度的原因。我在纯非托管 C++ 项目中看到过完全相同的情况,这些项目被设置为自动加载所有 Windows 系统库的符号文件。确保您没有自动加载调试符号:

  1. 在“工具”菜单中,点击“选项”。
  2. 向左侧展开“调试”类别,然后选择“符号”子类别。
  3. 选中标有“仅在手动加载符号时搜索上述位置”的复选框。

Check "Search the above locations only when symbols are loaded manually"


此外,请考虑混合模式调试非常慢。

如果您不需要单步执行 C++ DLL 中的代码,您可以尝试关闭项目属性中的“启用非托管代码调试”选项:

   Uncheck "Enable unmanaged code debugging"

关于.net - 当附加调试器时,从 .Net 代码调用 C++ dll 的速度极其缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4929616/

相关文章:

.net 运行时 - Silverlight 运行时 =?

.net - 将日期时间 + 时区转换为 UTC

c# - 如何通过编程生成exe程序?

c++ - 在 C++ 中仅使用 std::string 而不是 char 数组和 std::vector/list 而不是数组是否有任何实际限制?

windows - 如何在无人值守的情况下安装 Visual Studio Build Tools?

c# - 具有缓冲区和线程安全的 FIFO/QUEUE

c# - 为 OpenBackupEventLog 函数意外返回 ERROR_FILE_NOT_FOUND

c# - 使用 Visual Studio 2010 从命令行构建 C# 解决方案

c++ - "cannot access private member' "只有当类有导出链接时才会出错

c# - 有没有办法在 Visual Studio 2010 中突出显示当前事件的代码块?