C++ 为什么在连接多个字符串时性能会有所不同?

C++ 为什么在连接多个字符串时性能会有所不同?,c++,performance,c++11,C++,Performance,C++11,我对许多字符串的串联性能感到好奇。读完后,我做了一些测试。但不同编译器的结果是不同的 这是我的密码。(代码中的计时器来自。) 其中,ostringstream速度最慢,reserve()速度稍微加快 但是,在Visual Studio 2015社区上运行相同的代码时,结果如下: ostringstream: 4413ms += operator: 9319ms s.Append(): 8937ms s.Reserve() & +=: 8966ms s.Reserve() & s.

我对许多字符串的串联性能感到好奇。读完后,我做了一些测试。但不同编译器的结果是不同的

这是我的密码。(代码中的计时器来自。)

其中,
ostringstream
速度最慢,
reserve()
速度稍微加快

但是,在Visual Studio 2015社区上运行相同的代码时,结果如下:

ostringstream: 4413ms
+= operator: 9319ms
s.Append(): 8937ms
s.Reserve() & +=: 8966ms
s.Reserve() & s.Append(): 8815ms
只需注意相对速度,
ostringstream
变得最快,
reserve()
似乎没有加速

那为什么会这样呢?编译器优化还是其他什么?

多亏了。看来我猜的是对的。将优化从
/Od
更改为
/O2
后。结果是:

ostringstream: 1098ms
+= operator: 362ms
s.Append(): 356ms
s.Reserve() & +=: 216ms
s.Reserve() & s.Append(): 227ms

这与GCC 5.1相同。

您是如何使用VS编译的<代码>/O2发布?@JameyD感谢您指出这一点。我使用了
/Od
XDlibc++也是一个有趣的例子,它似乎在ostringstream中速度较慢,但在append中速度较快(在reserve+append中也是如此)。-1对于另一个速度问题,特别是调试构建时间。每个评测/速度问题都有这样的问题。。。但是我们仍然会遇到调试构建时间的问题。我想这就是我问题的答案。
ostringstream: 4413ms
+= operator: 9319ms
s.Append(): 8937ms
s.Reserve() & +=: 8966ms
s.Reserve() & s.Append(): 8815ms
ostringstream: 1098ms
+= operator: 362ms
s.Append(): 356ms
s.Reserve() & +=: 216ms
s.Reserve() & s.Append(): 227ms