clang ++ fstreams 10X mais lento que g ++
P: Existe uma maneira de acelerar os fluxos de clang ++ STD Library? (E alguém sabe por que é tão mais lento que o g ++?)
Estou tentando processar arquivos de dados binários muito grandes (muitos GB) e fiquei surpreso ao descobrir que o desempenho era tão ruim. No começo, pensei que tinha algo a ver com o meu código. Mas estou vendo o mesmo desempenho lento em um exemplo resumido.
Eu até tentei alocar buffers de tamanhos diferentes via rdbuf () -> pubsetbuf (), mas isso não pareceu ter muito efeito.
Aqui está um exemplo simples de entrada / saída:
#include <fstream>
int main() {
std::ifstream is {"bigSourceFile"};
std::ofstream os {"bigSourceFileCopy"};
std::string line;
while (std::getline (is, line) ) {
os << line;
}
}
Aqui está um código para gerar um arquivo de origem de 1.3 GB. Use isso para gerar o arquivo de origem para o programa 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';
}
}
Na minha máquina (executando o OSX El Capitan e o Xcode mais recente): o exemplo (a primeira lista de códigos) leva aprox. 50 segundos para executar a compilação na linha de comando:
clang ++ -std = c ++ 11 -o readWrite readWrite.cpp
No entanto, ao compilar com o g ++ e seu libstdc ++, o programa leva apenas cerca de 5 segundos.
Eu até construí o último corte do llvm stdc ++ no llvm.org e esse build foi ainda mais lento (aproximadamente 90 segundos).
Resumindo: clang ++: 50 segundos; g ++: 5 segundos