我正在尝试处理非常大(很多GB)的二进制数据文件,并且惊讶地发现性能非常差。起初,我认为这与我的代码有关。但是我在一个简单的例子中看到同样缓慢的表现。
我甚至尝试通过rdbuf() - > pubsetbuf()分配不同大小的缓冲区,但这似乎没有太大作用。
这是一个简单的输入/输出示例:
#include <fstream>
int main() {
std::ifstream is {"bigSourceFile"};
std::ofstream os {"bigSourceFileCopy"};
std::string line;
while (std::getline (is, line) ) {
os << line;
}
}
以下是生成1.3GB源文件的一些代码。使用它来生成readWrite程序的源文件:
#include <fstream>
#include <string>
std::string createTailStr () {
std::string result {"__"};
for (auto i (0); i< 58; ++i) {
result += 'A'+i;
}
return result;
}
int main() {
std::string tail {createTailStr()};
std::ofstream os {"bigSourceFile"};
constexpr auto Lines (20000000ul);
for (auto i (0); i < Lines; ++i) {
os << i << tail << '\n';
}
}
在我的机器上(运行OSX El Capitan和最新的Xcode):示例(第一个代码清单)采用aprox。从命令行运行编译50秒:
clang ++ -std = c ++ 11 -o readWrite readWrite.cpp
但是,在编译g ++及其libstdc ++时,程序只需要大约5秒钟。
我甚至从llvm.org构建了llvm stdc ++的最新剪辑,并且构建速度更慢(aprox 90秒)。
总结: clang ++:50秒; g ++:5秒