为什么使用MinGW时std::to_string()的运行速度是使用VS2012时的16倍

Why std::to_string() runs 16-times slower with MinGW than with VS2012

本文关键字:速度 运行 VS2012 16倍 时的 string MinGW std to 为什么      更新时间:2023-10-16

当我对这个函数进行基准测试时,我很惊讶:

int f(int N = 999) {  
  int nMax = 0;
  for (int i = 1; i <= N; ++i)
    for (int j = i; j <= N; ++j) {
      string digits  = to_string(i*j);
      string rDigits = digits;
      reverse(rDigits.begin(), rDigits.end());
      if (digits == rDigits)
        nMax = max(i*j, nMax);
    }
  return nMax;
}

在Windows 7 32位和64位上使用VS2012、VS2013(版本/O2)和MinGW 4.8.0、4.8.1(-Ofast)。我注意到MinGW构建的版本运行速度大约是VS版本的13倍。这是to_string()reverse()的实现问题吗?还有其他原因吗?

我使用的代码如下:https://github.com/pauljurczak/Benchmark-2/blob/master/benchmark.cpp

编辑

我将问题缩小到std::to_string()函数,它使用MinGW比使用VS慢大约16倍

int f(int N = 100000) {  
  int len = 0;
  for (int i = 0; i <= N; ++i) 
    len += to_string(i).length();
  return len;
}

当我在Ubuntu上使用g++4.7.3编译它时,性能与VS2012大致相同。

Visual Studio本可以逆转if-条件:
if (digits != rDigits)
    continue;
else
    nMax = max(i*j, nMax);

但这只是猜测。。。

顺便说一句,我宁愿写:

string rDigits(digits.rbegin(), digits.rend());

你也可以看看:https://stackoverflow.com/a/17909430/1689664,它可能会给你一些优化算法的想法。

检查您的MINGW构建所使用的C++运行时版本(使用依赖助行器或类似的工具)。VS2012支持r值,在您的情况下可能更重要的是支持小字符串优化。使用它将消除来自to_string的任何内存分配。内存分配需要比查找最大值或反向值多得多的CPU。