【发布时间】:2013-07-28 22:18:21
【问题描述】:
当我对这个函数进行基准测试时,我很惊讶:
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 倍。我用这个 sn-p 进行测试:
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 差不多。
【问题讨论】:
-
您正在运行基准测试,为什么不告诉我们哪个部分慢?
-
使用 MinGW 的程序员是奇数。他们似乎从不想签入补丁并一直要求 SO 用户为他们做这件事。你不能同时拥有它。
-
这个主题让我很感兴趣...例如,如果您尝试使用 MinGW 4.7.2 会发生什么?
-
您在构造字符串时是否尝试过反转字符串,而不是作为缩小范围的第二步?
string rDigits(digits.rbegin(), digits.rend());您的基准测试是否还包括任何类型的 I/O(例如cout)? -
@Antonio MinGW 4.7.2 编译此代码失败:未定义
to_string()。
标签: c++ visual-studio-2012 c++11 mingw benchmarking