printf mehr als 5-mal schneller als std::cout?

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <ctime>

int main(int argc, char* argv[])
{
    std::clock_t start;
    double duration;    

    std::cout << "Starting std::cout test." << std::endl;
    start = std::clock();

    for (int i = 0; i < 1000; i++)
    {
        std::cout << "Hello, World! (" << i << ")" << std::endl;
    }

    duration = (std::clock() - start) / (double) CLOCKS_PER_SEC;

    std::cout << "Ending std::cout test." << std::endl;
    std::cout << "Time taken: " << duration << std::endl;

    std::system("pause");

    std::cout << "Starting std::printf test." << std::endl;
    start = std::clock();

    for (int i = 0; i < 1000; i++)
    {
        std::printf("Hello, World! (%i)\n", i);
        std::fflush(stdout);
    }

    duration = (std::clock() - start) / (double) CLOCKS_PER_SEC;

    std::cout << "Ending std::printf test." << std::endl;
    std::cout << "Time taken: " << duration << std::endl;

    system("pause");

    return 0;
}

Nun, hier sind die Zeiten für die ersten fünf Läufe:

  • std::cout test: 1.125 s ; printf test: 0.195 s
  • std::cout test: 1.154 s ; printf test: 0.230 s
  • std::cout test: 1.142 s ; printf test: 0.216 s
  • std::cout test: 1.322 s ; printf test: 0.221 s
  • std::cout test: 1.108 s ; printf test: 0.232 s

Wie Sie sehen können, mit printf und dann fflushing dauert etwa 5-mal weniger Zeit als mit std::cout.

Obwohl ich es erwartet hatte mit std::cout's << Betreiber zu sein, vielleicht ein wenig langsamer (fast minimal) , ich war nicht bereit für diesen großen Unterschied. Bin ich ein fairer test? Wenn ja, was macht dann der erste test so viel langsamer als die zweite, wenn Sie im wesentlichen genau die gleiche Sache?

  • Haben Sie ermöglichen die Optimierung?
  • std::endl in jeder iteration ist eine schlechte Idee. Verwenden '\n'. Sie sind nicht die gleiche Sache.
  • Er hat flush in der printf-version zu sein, also, dass kann nicht wahr sein?
  • mögliche Duplikate Frage keine Antwort auf meine wichtigste Frage, **what makes** the first test so much slower than the second one... ich.e warum genau ist die printf schneller?
  • es hängt davon ab, Realisierung: Für mich cout dann schneller printf, aber nur wenn ich -std=c++0x.
  • Kann es nicht eine einzige richtige Antwort, andere als die Qualität der Bibliothek Implementierung, die Sie verwenden. Dort wurden ähnliche Fragen wie das verlinkte. Lesen Sie es und Fragen es links zu.
  • Beachten Sie, dass std::cout << "Hello, World! (" << i << ")" << std::endl; 4 Funktionsaufrufe, während printf ist nur einer. Versuchen Sie printf 5 mal, wie mit cout und sehen, was passiert. Dann werden Sie erkennen, wie viel von der Leistung scheitern wird durch die Funktion Aufrufe, und wie viel durch die Bibliothek selbst.
  • Deine aktuellen timings sind sinnlos wie der std::cout ist synchronisiert mit stdout und so viel "extra" arbeiten, um die Synchronisation zu gewährleisten. Wenn Sie entkoppelt werden Sie sehen eine Beschleunigung (es ist noch langsamer) std::cout.sync_with_stdio(false);
  • Es ist ziemlich unfair zu Spülen stdout für jeden printf. Ohne die std::fflush(stdout); die printf Schleife viel schneller. Es ist zwar idiomatisch zu << std::endl ist es nicht idiomatisch zu fflush(stdout). Ahnungslose C++ - Programmierer sind Sie wahrscheinlich cout viel weniger uneffektiv, dann stdout

Schreibe einen Kommentar