【发布时间】:2019-11-25 11:03:07
【问题描述】:
我发现各种来源表明 Visual Studio 的调试和发布版本几乎没有性能差异。
我正在使用 Visual Studio 2015 并编写了一个事件驱动的状态机框架。在我进行第一次性能测试后,由于框架每秒仅进行大约 13.000 次状态切换,因此遇到了问题。
但是,当我将它编译为发布版本时,我每秒获得了 150 万次状态切换。这对我来说是一个巨大的增长,但我无法解释这是从哪里来的。
可悲的是,我不能分享我的代码,因为它属于我的公司。
但我发现像这样的 for 循环已经在发布版本中运行得更快了。
for (auto i = 0; i < 2000000; i++)
my_machine.PushEvent(event);
此外,发布版本的内存使用量从 255 MB 下降到 67MB。内存被两个队列占用。
我希望这不会被标记为重复,但我想听听一些关于性能差异的意见。
【问题讨论】:
-
“我发现了各种来源,调试和发布版本应该几乎没有性能差异”,它们是(除了错误之外)?
-
“我发现了各种来源,它们与 Visual Studio 的调试和发布版本几乎没有性能差异。” - 忽略这些来源。他们显然不知道他们在谈论/写什么。使用 Visual Studio 编译器(以及任何其他编译器)进行调试(未优化)和发布(优化)构建之间存在巨大的性能差异。
-
我见过一些任务在发布模式下需要几分钟,而在调试模式下需要一天多的时间。减速很大程度上取决于您正在调试的代码。在上面的例子中,算法做了很多小的分配。
-
您的源代码来自完全不同的编程语言,并且还使用 .net 框架托管代码与没有 .net 的本机代码。
-
“但是当我将它编译为发布版本时,我每秒获得 150 万次状态切换。这对我来说是一个巨大的增长,但我无法解释这是从哪里来的。” - 它来自您的编译器优化器。 C++ 的设计目的是让编译器完全移除大量昂贵的抽象,并且优化器也有很多 的技巧可以将你编写的慢代码变成非常高效的代码。当您不启用优化器时,代码将易于调试,但速度较慢。当您启用优化器时,代码会很快,但 很难 调试。