c++ - 性能差异调试与发布

标签 c++ performance-testing

我发现各种来源表明,调试版和发布版的 Visual Studio 应该几乎没有性能差异。

我正在使用 Visual Studio 2015 并编写了一个事件驱动状态机框架。在我进行了第一次性能测试之后,由于该框架每秒仅进行大约 13.000 次状态切换,所以出现了问题。

但是,一旦我将其编译为发布版本,我就得到了每秒 150 万个状态切换。这对我来说是一个巨大的增长,但我无法解释这是从哪里来的。

可悲的是,我不能分享我的代码,因为它属于我的公司。

但我发现像这样的 for 循环在发布版本中运行得更快。

for (auto i = 0; i < 2000000; i++)      
        my_machine.PushEvent(event);

此外,发行版的内存使用量从大约 255 MB 下降到 67MB。内存被两个队列占用。

我希望这不会被标记为重复,但我想听听一些关于性能差异的意见。

最佳答案

I found various sources that there should be little to no performance difference with the debug and release version of Visual Studio.

这很可能是不正确的或被误解的信息……或者,显然是关于不同语言的信息。如果出现误解,原来的说法可能是调试符号信息对性能没有影响,这是正确的。

无论如何,由 _DEBUG(特定于 Visual Studio)启用或由 NDEBUG(控制断言的标准宏)禁用的额外调试操作确实会产生开销。开销有多大取决于程序的作用。如果它大部分时间都在等待硬盘驱动器或网络,那么可能意义不大。如果它在容器上执行大量操作,那么开销可能会更大。

更显着的性能差异将来自缺乏优化,这些优化在发布版本中启用,而不是在调试版本中启用。

关于c++ - 性能差异调试与发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57061839/

相关文章:

c++ - 删除动态数组

c++ - std::swap 在构造函数、赋值运算符和析构函数方面如何工作?

performance - IIS 7.5 WebAPI 性能扩展问题

time - 为 Fortran 多线程程序计时

io - 内存和 IO 带宽之间有什么区别,我们如何测量它们?

c++ - c++中没有参数的数组

c++ - 在父类的析构函数中加入成员线程访问其父类的其他成员是否会导致未定义的行为?

c++ - tr ("\302\261") 在Qt中是什么意思?

scala - 创建一个 scala 函数来定义 Gatling HTTP 请求链

java - 如何测试java DBMS应用程序的性能