printf plus de 5 fois plus rapide que 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;
}

Maintenant, voici les temps pour les cinq premières pistes:

  • 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: de 0,232 s

Comme vous pouvez le voir, à l'aide de printf et puis fflushing prend environ 5 fois moins de temps que l'utilisation std::cout.

Bien que je ne l'attends à l'aide de std::cout's << opérateur pour être peut-être un peu plus lent (presque minimale) , je n'étais pas préparé à cette énorme différence. Suis-je faire un test juste? Si oui, alors ce qui fait le premier test beaucoup plus lent que la seconde, si ils font essentiellement la même chose?

Il n'a encastré dans le printf version trop bien, donc ça ne peut pas être?
Le double question ne répond pas à ma question principale, **what makes** the first test so much slower than the second one... je.e pourquoi est exactement le printf plus vite?
Il y a peut-être pas une seule bonne réponse autre que la qualité de la mise en œuvre de bibliothèque que vous utilisez. Il y a eu des questions similaires, tels que lié. Lire et les questions connexes des liens vers elle.
Notez que std::cout << "Hello, World! (" << i << ")" << std::endl; est de 4 appels de fonction, tandis que printf est seul. Essayez de faire printf 5 fois, comme avec cout et voir ce qui se passe. Ensuite, vous vous rendrez compte comment une grande partie de la performance de l'échec est dû à des appels de fonction, et combien, en raison de la bibliothèque elle-même.
Votre timings sont vide de sens que le std::cout est synchronisé avec la sortie standard (stdout) et n'a donc beaucoup de "plus" du travail pour maintenir la synchronisation. Si vous dissociez eux, vous pourrez voir une accélération (c'est encore plus lent) std::cout.sync_with_stdio(false);

OriginalL'auteur ApprenticeHacker | 2012-08-20