Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么将visual调试器附加到程序比直接从visual studio运行更快?_C++_Performance_Visual Studio 2012 - Fatal编程技术网

C++ 为什么将visual调试器附加到程序比直接从visual studio运行更快?

C++ 为什么将visual调试器附加到程序比直接从visual studio运行更快?,c++,performance,visual-studio-2012,C++,Performance,Visual Studio 2012,我已经为性能问题挣扎了很长一段时间,最近我意识到从VisualStudio运行时获得的性能并不意味着什么 不过,让我非常惊讶的是,根据调试方式的不同,我的性能有很大的不同:当我从visual studio运行程序时,即使是在发布模式下,也比直接运行程序然后将其附加到visual studio调试器时慢10倍多。您知道这种差异是从何而来的吗?当您在调试器中运行可执行文件时,Visual会在运行时将大量测试插入其中: 堆损坏检查 堆栈损坏检查 内存泄漏检查 有些甚至更微妙,特别是如果你运行CRT

我已经为性能问题挣扎了很长一段时间,最近我意识到从VisualStudio运行时获得的性能并不意味着什么


不过,让我非常惊讶的是,根据调试方式的不同,我的性能有很大的不同:当我从visual studio运行程序时,即使是在发布模式下,也比直接运行程序然后将其附加到visual studio调试器时慢10倍多。您知道这种差异是从何而来的吗?

当您在调试器中运行可执行文件时,Visual会在运行时将大量测试插入其中:

  • 堆损坏检查
  • 堆栈损坏检查
  • 内存泄漏检查
  • 有些甚至更微妙,特别是如果你运行CRT
它通过插入一个替代标准内存分配器库的自定义内存分配器库来实现。 所有对
new
delete
的调用以及所有堆栈操作(进入/退出函数)都会被监视

所以,是的,对于性能分析,不要运行VS调试器

如果您想了解代码中发生的情况,可以在此处查看答案:

特别是第二个答案,有着有趣的提示。
建议使用的工具之一非常有用:

当您在调试器中运行可执行文件时,Visual会在运行时将大量测试插入其中:

  • 堆损坏检查
  • 堆栈损坏检查
  • 内存泄漏检查
  • 有些甚至更微妙,特别是如果你运行CRT
它通过插入一个替代标准内存分配器库的自定义内存分配器库来实现。 所有对
new
delete
的调用以及所有堆栈操作(进入/退出函数)都会被监视

所以,是的,对于性能分析,不要运行VS调试器

如果您想了解代码中发生的情况,可以在此处查看答案:

特别是第二个答案,有着有趣的提示。
建议使用的工具之一非常有用:

即使在发布模式下构建,VS中的默认运行模式是附加调试器(调试器总是比较慢,因为它插入了一系列检查和监视)。如果要从VS中测试“正常”运行,请使用“调试>无调试启动”或Ctrl-F5。

即使在发布模式下生成,VS中的默认运行模式也是附加调试程序(由于它插入了一系列检查和监视,因此速度总是较慢)。如果要在VS中测试“正常”运行,请使用“调试>不调试启动”或Ctrl-F5。

无论如何启动调试会话,使用调试器运行性能测试都是荒谬的。调试程序,一旦它在发布模式下运行,并在不受外部环境干扰的情况下测量性能debugger@DavidRodríguez dribeas:不是真的。如果您正在使用检测探查器,调试版本将比发布版本提供更好的逐行信息。@SigTerm:无论如何(我不会讨论是使用符号构建调试版本还是发布版本),在调试程序内部运行将产生额外的成本,这将使性能度量不正确[注意:并不是说您无法获得评测信息(在不同部分花费的时间的%),只是它不是真实的图片,也不是性能信息]无论您如何启动调试会话,使用调试器运行性能测试都是荒谬的。调试程序,一旦它在发布模式下运行,并在不受调试程序干扰的情况下测量性能debugger@DavidRodríguez dribeas:不完全是。如果您使用检测分析器,调试构建将为您提供更好的逐行信息n而不是发布版本。@SigTerm:无论如何(我不会讨论是使用符号构建调试版本还是发布版本),在调试器内部运行将产生额外的成本,这将导致性能度量不正确[注意:并不是说您无法获得评测信息(在不同部分花费的时间的%),只是它不会是真实的图片,也不会是性能信息]陈雷蒙已经报道了这一点:陈雷蒙已经报道了这一点: