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;
}
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
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
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