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

questionAnswers(0)

yourAnswerToTheQuestion