clang ++ fstreams 10X más lento que g ++

P: ¿Hay alguna forma de acelerar los flujos de clang ++ STD Library fstreams? (¿Y alguien sabe por qué es mucho más lento que g ++?)

Estoy tratando de procesar archivos de datos binarios muy grandes (muchos GB) y me sorprendió descubrir que el rendimiento era tan pobre. Al principio, pensé que tenía algo que ver con mi código. Pero estoy viendo el mismo rendimiento lento en un ejemplo resumido.

Incluso intenté asignar buffers de diferentes tamaños a través de rdbuf () -> pubsetbuf () pero esto no pareció tener mucho efecto.

Aquí hay un ejemplo simple de entrada / salida:

#include <fstream>

int main() {
    std::ifstream is {"bigSourceFile"};
    std::ofstream os {"bigSourceFileCopy"};

    std::string line;
    while (std::getline (is, line) ) {
        os << line;
    }
}

Aquí hay un código para generar un archivo fuente de 1.3GB. Use esto para generar el archivo fuente para el 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';
    }
}

En mi máquina (ejecutando OSX El Capitan y el último Xcode): el ejemplo (la primera lista de códigos) toma aprox. 50 segundos para ejecutar la compilación desde la línea de comando:

clang ++ -std = c ++ 11 -o readWrite readWrite.cpp

Sin embargo, al compilar contra g ++ y su libstdc ++, el programa solo tarda unos 5 segundos.

Incluso construí el último corte de llvm stdc ++ de llvm.org y esa compilación fue aún más lenta (aproximadamente 90 segundos).

Para resumir: clang ++: 50 segundos; g ++: 5 segundos

Respuestas a la pregunta(0)

Su respuesta a la pregunta