2016-09-12 3 views
4

Je passais un test simple pour chronométrer du code C++, et j'ai couru à travers un artefact dont je ne suis pas 100% positif.Différence entre l'heure Linux et les horloges de performance dans le code

Configuration

Mon code utilise C++ 11 high_resolution_clock pour mesurer le temps écoulé. J'enveloppe également l'exécution de mon programme en utilisant la commande time de Linux (/usr/bin/time). Pour mon programme, le high_resolution_clock signale ~ 2s tandis que time rapporte ~ 7s (~ 6.5s utilisateur et ~ .5s système). Également en utilisant l'option verbose à temps montre que mon programme a utilisé 100% du CPU avec 1 changement de contexte volontaire et 10 commutateurs de contexte involontaires (/usr/bin/time -v).

Question

Ma question est ce qui cause une telle différence dramatique entre les mesures de temps OS et des mesures de temps de performance?

Mes premières réflexions

Grâce à ma connaissance des systèmes d'exploitation, je suppose ces différences sont uniquement causées par des changements de contexte avec d'autres programmes (comme l'a noté time -v).

Est-ce la seule raison de cette différence? Et dois-je faire confiance à l'heure indiquée par mon programme ou le système lorsque je regarde la performance du code? Encore une fois, mon hypothèse est de faire confiance à l'heure calculée de mon programme sur l'heure de Linux, parce que cela dépasse le temps d'utilisation du processeur de mon programme.

Avertissements
  • Je ne suis pas le code posterai, car il est pas vraiment pertinent à la question à portée de main. Si vous voulez savoir, c'est un test simple qui multiplie 100 000 000 opérations arithmétiques en virgule flottante.

  • Je sais que d'autres horloges dans mon code C++ peuvent être plus ou moins appropriées pour des circonstances de différence (this stack overflow question). High_resolution_clock est juste un exemple.

Edit: Code comme demandé

#include <chrono> 
#include <cstdlib> 
#include <iostream> 
#include <vector> 

using namespace std; 
using namespace std::chrono; 

int main() { 
    size_t n = 100000000; 

    double d = 1; 

    auto start_hrc = high_resolution_clock::now(); 

    for(size_t i = 0; i < n; ++i) { 
    switch(rand() % 4) { 
     case 0: d += 0.0001; break; 
     case 1: d -= 0.0001; break; 
     case 2: d *= 0.0001; break; 
     case 3: d /= 0.0001; break; 
    } 
    } 

    auto end_hrc = high_resolution_clock::now(); 
    duration<double> diff_hrc = end_hrc - start_hrc; 
    cout << d << endl << endl; 
    cout << "Time-HRC: " << diff_hrc.count() << " s" << endl; 
} 
+0

La sortie initiale de 'time' sera le temps d'horloge du début du programme à la fin du programme, ce qui pourrait prendre un certain temps il y avait des changements de contexte, comme vous mentionné.Je ferais confiance à high_resolution_clock car il est fort probable qu'il dorme aussi pendant que votre thread est en train de dormir. Je sais que vous avez dit que vous ne voulez pas afficher de code, mais ce serait bien de voir exactement comment vous avez instrumenté vos timings, donc le code est bon pour ça. – AndyG

+0

J'ai téléchargé la synchronisation, qui n'est pas très différente de tous les tutoriels sur high_resolution_clock que j'ai trouvé. – pippin1289

+0

Corrigez-moi si je me trompe, mais l'hypothèse dans le code est que le nombre de ticks représente les secondes? Quelle est la sortie si vous utilisez 'std :: chrono :: duration_cast (end_hrc-start_hrc)'? – AndyG

Répondre

0

Ma question est ce qui cause une telle différence dramatique entre les mesures de temps du système d'exploitation et des mesures de temps de performance?

Il semblerait que votre système prenne un peu de temps pour démarrer votre application. Probablement un problème de ressources: pas assez de mémoire libre (échange) ou de CPU surchargée.

Aucune différence spectaculaire est observée sur mon bureau:

Time-HRC: 1.39005 s 
real 0m1.391s 
user 0m1.387s 
sys  0m0.004s