当我对该功能进行基准测试时,我感到很惊讶:
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
-condition:
if (digits != rDigits)
continue;
else
nMax = max(i*j, nMax);
但这只是一个猜测...
顺便说一句,我宁愿写:
string rDigits(digits.rbegin(), digits.rend());
您还可以看一下:https://stackoverflow.com/a/17909430/1689664,它可以为您提供一些优化算法的想法。