2

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

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 差不多。

4

2 回答 2

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 ,它可能会给你一些优化算法的想法。

于 2013-07-28T22:43:59.337 回答
1

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

于 2013-07-29T13:24:20.343 回答