为什么使用MinGW时std::to_string()的运行速度是使用VS2012时的16倍
Why std::to_string() runs 16-times slower with MinGW than with VS2012
当我对这个函数进行基准测试时,我很惊讶:
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大致相同。
if
-条件:
if (digits != rDigits)
continue;
else
nMax = max(i*j, nMax);
但这只是猜测。。。
顺便说一句,我宁愿写:
string rDigits(digits.rbegin(), digits.rend());
你也可以看看:https://stackoverflow.com/a/17909430/1689664,它可能会给你一些优化算法的想法。
检查您的MINGW构建所使用的C++运行时版本(使用依赖助行器或类似的工具)。VS2012支持r值,在您的情况下可能更重要的是支持小字符串优化。使用它将消除来自to_string的任何内存分配。内存分配需要比查找最大值或反向值多得多的CPU。
相关文章:
- 为什么这些算法的运行速度比它们应该的要快?
- Windows 7 应用程序在未聚焦时运行速度较慢
- 当 2 个线程共享同一物理内核时,具有错误共享的易失性增量在发布中的运行速度比在调试中慢
- O(NlogN)算法运行速度快于O(n)..等等,什么
- C++openssl SHA256运行速度比JDK SHA256实现慢
- 有人可以解释为什么使用 OpenMP 部分的运行速度比单个线程慢吗?
- 为什么这个简单的 C++ SIMD 基准测试在使用 SIMD 指令时运行速度较慢?
- 为什么C 运行速度比Python慢
- 通过创建单个线程来运行一段代码可加快执行速度
- QWebView 用于在桌面应用程序中运行 javascript (D3) - 当 HTML 更改时重新加载速度很慢
- cl 生成的可执行文件在第一次运行时运行速度非常慢
- JIT 编译的运行速度能否比编译时模板实例化更快?
- Python的运行速度比C和C 更快
- 将变量从Python转移到C ,并全速运行C (不是Python速度)
- 我的OpenCL测试的运行速度不超过CPU
- 如果我用代码块编译代码,为什么我的代码运行速度更快
- 具有`k`线程的多线程程序的运行速度都比其顺序版本快
- 在Visual Studio上运行时程序速度变慢
- 如何使程序在不同计算机上以相同的速度运行
- 如何使动态数组或矢量以与标准阵列相似的速度运行?C++