C++ 为什么MinGW的std::to_string()运行速度比VS2012慢16倍
当我对这个函数进行基准测试时,我感到惊讶:C++ 为什么MinGW的std::to_string()运行速度比VS2012慢16倍,c++,visual-studio-2012,c++11,mingw,benchmarking,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())
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;
}
当我在Ubuntu上用g++4.7.3编译它时,性能与VS2012差不多。Visual Studio可能已经扭转了
,如果-条件:
if (digits != rDigits)
continue;
else
nMax = max(i*j, nMax);
但这只是一个猜测
顺便说一下,我宁愿写:
string rDigits(digits.rbegin(), digits.rend());
你也可以看看:它可能会给你一些优化算法的想法。
< P>检查你的MIWW构建所使用的C++运行时版本(使用依赖性Walkor或类似的东西)。VS2012支持r值,在您的情况下,可能更重要的是支持小字符串优化。使用它将消除来自to_字符串的任何内存分配。内存分配比查找max或reverse需要更多的CPU。您正在运行基准测试,为什么不告诉我们哪一部分比较慢?使用MinGW的程序员太多了。他们似乎从来都不想签入补丁,并一直要求用户为他们做这件事。你不能两全其美。这个话题让我很感兴趣。。。例如,如果您尝试使用MinGW 4.7.2,会发生什么情况?您是否尝试在构建字符串时反转字符串,而不是作为缩小区域的第二步<代码>字符串rdigit(digits.rbegin(),digits.rend())
您的基准测试是否还包括任何类型的I/O(如cout
)?@Antonio MinGW 4.7.2未能编译此代码:未定义的到字符串()
。您甚至不需要反向复制
,只需使用反向迭代器字符串rdigit(digits.rbegin(),digits.rend())构造字符串即可代码>谢谢您的优化建议,但我的问题是,从VS迁移到MinGW时,特定代码的性能会大幅下降。@blastfurnystring rdigit(digits.rbegin(),digits.rend())
不会提高MinGW二进制文件的速度,但会略微降低VS二进制文件的速度。@PaulJurczak:您是否尝试反转if
-条件?在字符串rdigit(digits.rbegin(),digits.rend())之后,Visual Studio二进制文件的速度是否相同代码>?如果是,将速度与string rDigits=reverse\u copy(digits.begin(),digits.end())进行比较代码>…问题在于MinGW中的std::to_string()
的实现-请参阅我编辑的问题。
string rDigits(digits.rbegin(), digits.rend());