为什么std :: to_string()使用MinGW比使用VS2012慢16倍

时间:2013-07-28 22:18:21

标签: c++ visual-studio-2012 c++11 mingw benchmarking

当我对此功能进行基准测试时,我感到很惊讶:

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大致相同。

2 个答案:

答案 0 :(得分:1)

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,它可能会为您提供一些优化算法的建议。

答案 1 :(得分:1)

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