C++ Streams deutlich langsamer als C Streams?



  • Beim Einlesen grosser Datenmengen konkurrieren beide untenstehende vereinfachte Funktionen. Wobei die Variante mit dem C-Stream etwa 30% flotter ist. Verwende ich die C++ Version nicht korrekt? da es nicht vorhersehbar ist, wie lang eine Eingabezeile ist, bevorzuge ich bisher die C++ Variante.

    Version mit C++ Streams

    bool Parse(const std::string& filename) {
      std::ifstream ifs(filename.c_str());
      if (ifs.fail()) {
        return false;
      }
    
      std::string input;
      for (int line = 1; !getline(ifs, input, '\n').eof(); ++line) {
        // Do some work...
      }
      return true;
    }
    

    Version mit C Streams

    bool Parse(const std::string& filename) {
      FILE* ifs = fopen(filename.c_str(), "r");
      if (ifs == NULL) {
        return false;
      }
    
      char buffer[1 << 16];  // Fixed size :-(
      for (int line = 1; fgets(buffer, 1 << 16, ifs) != NULL; ++line) {
        std::string input(buffer);
        // Do some work...
      }
      return true;
    }
    

  • Mod

    Das Thema kommt hier dauernd. Hier der Thread von letzter Woche als Anfangspunkt:

    http://www.c-plusplus.net/forum/286372



  • Zusammenfassung:
    C ist schnell, aber C# scheinbar schneller 😮



  • Auch ein Grund, warum Google bei OpenSource-Projekten C++ I/O-Streams verbietet?

    Aber ich glaube, die haben als Grund auch die angeblich bessere Lesbarkeit der C-Variante angeführt.



  • Tomahawk schrieb:

    Beim Einlesen grosser Datenmengen konkurrieren beide untenstehende vereinfachte Funktionen. Wobei die Variante mit dem C-Stream etwa 30% flotter ist. Verwende ich die C++ Version nicht korrekt? da es nicht vorhersehbar ist, wie lang eine Eingabezeile ist, bevorzuge ich bisher die C++ Variante.

    Aber bei diesem beispiel ist eben auch zu berücksichtigen, dass das C Beispiel in ein bereits allokiertes feld schreibt, das C++ Beispile während des lesens auch noch Speicher zu allokieren hat. Je nach dem wie deine reale Implementierung aussieht könnte dies bereits den Unterschied erklären.

    Gruß



  • Drehleiter schrieb:

    Tomahawk schrieb:

    Beim Einlesen grosser Datenmengen konkurrieren beide untenstehende vereinfachte Funktionen. Wobei die Variante mit dem C-Stream etwa 30% flotter ist. Verwende ich die C++ Version nicht korrekt? da es nicht vorhersehbar ist, wie lang eine Eingabezeile ist, bevorzuge ich bisher die C++ Variante.

    Aber bei diesem beispiel ist eben auch zu berücksichtigen, dass das C Beispiel in ein bereits allokiertes feld schreibt, das C++ Beispile während des lesens auch noch Speicher zu allokieren hat. Je nach dem wie deine reale Implementierung aussieht könnte dies bereits den Unterschied erklären.

    Gruß

    In der C-Variante muss der Speicher doch auch jedesmal dynamisch allokiert werden:

    ...
    std::string input(buffer);
    ...
    


  • Aber nur einmal, da der Buffer nicht größer wird. Die freie getline() Funktion muss da teilweise schon öfters neuen Speicher holen.

    Ums zu testen, benutz mal die getline() Memberfunktion oder versuch den String außerhalb zu deklarieren und immer neu zu verwenden.



  • Tomahawk schrieb:

    In der C-Variante muss der Speicher doch auch jedesmal dynamisch allokiert werden:

    ...
    std::string input(buffer);
    ...
    

    Das ist wohl kaum eine C-Variante.



  • Tachyon schrieb:

    Tomahawk schrieb:

    In der C-Variante muss der Speicher doch auch jedesmal dynamisch allokiert werden:

    ...
    std::string input(buffer);
    ...
    

    Das ist wohl kaum eine C-Variante.

    Siehe weiter oben, dort habe ich sie als Solche bezeichnet, wegen der Verwendung des File-Deskriptors nicht wegen des std::string.


Anmelden zum Antworten