Comment puis-je mesurer le temps CPU et de la paroi de l'horloge temps sur Linux/Windows?
Je veux dire: comment puis-je mesurer mon temps CPU passé sur l'exécution de la fonction et de la paroi de l'horloge temps qu'il faut pour exécuter ma fonction? (Im intéressé par Linux/Windows et les versions x86 et x86_64). Voyez ce que je veux faire (Im en utilisant C++ ici, mais je préfère C):
int startcputime, endcputime, wcts, wcte;
startcputime = cputime();
function(args);
endcputime = cputime();
std::cout << "it took " << endcputime - startcputime << " s of CPU to execute this\n";
wcts = wallclocktime();
function(args);
wcte = wallclocktime();
std::cout << "it took " << wcte - wcts << " s of real time to execute this\n";
Une autre question importante: est ce type de mesure du temps d'architecture indépendant ou pas?
- Je me rends compte que vous voulez le faire par programmation dans le code, mais voilà quand même: superuser.com/questions/228056/...
- merci:) je sais
time
sous linux, mais comme vous l'avez écrit, j'ai besoin de le faire directement dans le code C - Sur Windows,
clock()
donne de la paroi du temps et deGetProcessTimes
donne de temps processeur. Sur Linuxgettimeofday()
donne de la paroi du temps, etclock()
donne de temps processeur. - hein! donc c'est un peu compliqué!!! Je vais essayer d'écrire un peu de code et le coller résultats par la suite (pour les deux win/lin). Mais une autre réponse est la bienvenue! 🙂
- Si vous pouvez utiliser C++,
boost::auto_cpu_timer
(boost.org/libs/timer) est-ce que vous avez besoin. Votre code devientboost::auto_cpu_timer t; function(args);
(ouais pas de cout, de rien et c'est ça, vous obtenez mur et de l'uc — j'aime cette fonctionnalité). - FWIW, OpenMP a un
omp_get_wtime()
minuterie que les mesures de la paroi de temps et est assez haute résolution. - En fait, j'ai deux wallclock et cpuclocks encapsulé dans une API pour l'un de mes programmes (Windows + Linux). Si personne ne donne une réponse complète avant que je rentre du travail, je vais le poster ici.
- Une fois que j'ai été confrontés à la difficulté de l'horloge() peut être facilement débordé. clock_t était un 4 octets entier signé. Sa valeur maximale est de 2^31=2.147e9. CLOCKS_PER_SEC était de 1000 dans Windows et 1000000 de Linux. Ainsi, la durée maximale était de 24,8 jours de Windows et de 35,8 min dans Linux.
Vous devez vous connecter pour publier un commentaire.
Voici un copier-coller solution qui fonctionne sur Windows et Linux ainsi que le C et le C++.
Comme mentionné dans les commentaires, il y a une bibliothèque boost qui fait cela. Mais si vous ne pouvez pas utiliser boost, cela devrait fonctionner:
Il y a un tas de façons de mettre en œuvre ces horloges. Mais voici ce que l'extrait ci-dessus utilise:
Pour Windows:
GetProcessTimes()
Pour Linux:
gettimeofday()
horloge()
Et voici une petite démonstration:
De sortie (12 threads):
rdtsc
?)rdtsc()
pour mettre en œuvre les compteurs de performance. Mais si c'était sur une architecture différente, il serait le système d'exploitation de l'emploi pour mettre en œuvre ces fonctions. Autant que faire dans ces assembly en ligne, c'est difficile. Notez querdtsc()
par elle-même n'est pas suffisant pour obtenir la paroi de temps depuis que vous avez encore besoin de quelque chose pour vous donner le nombre de tiques il y a en une seconde. Et je ne suis pas au courant de quoi que ce soit à l'extérieur de l'OS qui peut vous donner le temps CPU.clock()
fonctionne bien sous Linux, mais n'inclut pas le temps passé dans les processus enfants (par exemple, a commencé par unsystem()
appel). Si vous avez besoin également de mesurer le temps passé dans les processus enfants, avoir un regard surtimes()
, qui vous donne le temps cpu et du système de temps pour le processus en cours et pour les processus enfants. Notez que les horloges par seconde n'est pasCLOCKS_PER_SEC
ici, mais plutôtsysconf(_SC_CLK_TCK)
.#include <ctime>
ou<time.h>
ainsi, afin d'utiliser leclock()
fonction etCLOCKS_PER_SEC
.C++11. Beaucoup plus facile à écrire!
Utilisation
std::chrono::system_clock
pour horloge murale etstd::clock
pour le processeur de l'horlogehttp://en.cppreference.com/w/cpp/chrono/system_clock
Et voilà, facile et portable! Pas besoin de #ifdef _WIN32 ou LINUX!
Vous pourriez même utiliser
chrono::high_resolution_clock
si vous avez besoin de plus de précisionhttp://en.cppreference.com/w/cpp/chrono/high_resolution_clock
auto
pourwcts
puisstd::chrono::duration<double>
pourwctduration
?std::clock
travaux sur des Fenêtres d'une façon non standard, de sorte que "portable" est un peu trop optimiste.Pour donner un exemple concret de @lip suggestion pour l'utilisation
boost::timer
si vous le pouvez (testé avec Boost 1.51):Utiliser le
clock
méthode dans temps.h:Malheureusement, cette méthode retourne de temps CPU sur Linux, mais renvoie l'horloge murale sur Windows (merci aux intervenants pour cette information).
clock()
donne le temps cpu sur Linux, et le mur du temps sur Windows.clock()
donne en temps réel, indépendamment de l'activité du thread.