Outils pour utilisateurs

Outils du site


progc

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
Prochaine révisionLes deux révisions suivantes
progc [2018/05/15 14:10] brbachelprogc [2018/05/15 14:17] brbachel
Ligne 9: Ligne 9:
 ===== Mesure des temps de calcul ===== ===== Mesure des temps de calcul =====
  
-Pour mesurer les temps de calcul d'un programme, une bonne solution consiste à utiliser la commande Unix ''time'' qui permet, si on regarde les temps ''user'' et ''system'' d'avoir une mesure précise et reproductible. Cependant, si on souhaite faire la mesure d'une partie de notre programme, il faut forcément toucher à notre code. On peut utiliser la fonction ''clock'' du C ou bien la classe ''chrono'' du nouveau C++, mais ces deux solutions mesurent le temps perçu (l'équivalent du temps ''real'' de la commande ''time''), c'est-à-dire le temps où l'on attend pour avoir le résultat. Dans un environnement multitâche et multi-utilisateur, on ne peut pas se fier au temps perçu pour avoir une mesure précise et surtout reproductible.+Pour mesurer les temps de calcul d'un programme, une bonne solution consiste à utiliser la commande Unix ''time'' qui permet, si on regarde les temps ''user'' et ''system''d'avoir une mesure précise et reproductible. Cependant, si on souhaite faire la mesure d'une partie de notre programme, il faut forcément toucher à notre code. On peut utiliser la fonction ''clock'' du C ou bien la classe ''chrono'' du nouveau C++, mais ces deux solutions mesurent le temps perçu (l'équivalent du temps ''real'' de la commande ''time''), c'est-à-dire le temps où l'on attend pour avoir le résultat. Dans un environnement multitâche et multi-utilisateur, on ne peut pas se fier au temps perçu pour avoir une mesure précise et surtout reproductible.
  
 ==== La solution: getrusage ==== ==== La solution: getrusage ====
Ligne 35: Ligne 35:
 </code> </code>
  
-La fonction ''now'' s'occupe d'appeler ''getrusage'' (qui fournit des mesures de temps depuis le début de l'exécution du programme) et de synthétiser les résultats sous la forme des différents temps ''real'', ''user'' et ''system'' comme le fait la commande ''time''. On effectue donc une mesure juste avant l'appel à la fonction à mesurer, une autre juste après, et on fait la différence des temps. Le résultat de ce programme:+La fonction ''now'' s'occupe d'appeler ''getrusage'' (qui fournit des mesures de temps depuis le début de l'exécution du programme) et de synthétiser les résultats sous la forme d'une structure contenant les différents temps ''real'', ''user'' et ''system'' comme le fait la commande ''time''. On effectue donc une mesure juste avant l'appel à la fonction à mesurer, une autre juste après, et on fait la différence des temps. Le résultat de ce programme:
  
 <code> <code>
Ligne 51: Ligne 51:
 </code> </code>
  
-=== Temps d'exécution pour un thread ===+==== Temps d'exécution d'un thread ====
  
-La fonction ''getrusage'' dispose d'un paramètre ''who'' qui peut prendre trois valeurs qui affectent la manière de mesurer le temps: ''RUSAGE_SELF'' qui mesure le temps d'exécution du processus courant et de tous ces threads, ''RUSAGE_THREAD'' qui mesure le temps d'exécution du thread courant, et ''RUSAGE_CHILDREN'' qui mesure le temps d'exécution des processus fils du processus courant. Dans l'entête que nous proposons, il est possible d'indiquer l'une des trois valeurs à la fonction ''now'' (qui transmettra à ''getrusage''). Nous avons choisi ''RUSAGE_SELF'' par défaut, ce qui signifie que si on lance une tâche de 3 secondes sur 4 threads, on obtient un temps ''user'' de 12 secondes (le cumul de tous les threads). Voici un exemple où l'on mesure le temps par thread et le temps du processus:+La fonction ''getrusage'' dispose d'un paramètre ''who'' qui peut prendre trois valeurs qui affectent la manière de mesurer le temps: ''RUSAGE_SELF'' qui mesure le temps d'exécution du processus courant et de tous ces threads, ''RUSAGE_THREAD'' qui mesure le temps d'exécution du thread courant, et ''RUSAGE_CHILDREN'' qui mesure le temps d'exécution des processus fils du processus courant. Dans l'entête que nous proposons, il est possible d'indiquer l'une des trois valeurs à la fonction ''now'' (qui la transmettra à ''getrusage''). Nous avons choisi ''RUSAGE_SELF'' par défaut, ce qui signifie que si on lance une tâche de 3 secondes sur 4 threads, on obtient un temps ''user'' de 12 secondes (le cumul de tous les threads). Voici un exemple où l'on mesure le temps par thread et le temps du processus:
  
 <code c++> <code c++>
Ligne 96: Ligne 96:
 </code> </code>
  
-Et voilà les mesures que l'on peut obtenir, où l'on constate que le temps cumulé des threads correspond bien au temps mesuré pour le processus:+Et voici les mesures que l'on peut obtenir, où l'on constate que le temps cumulé des threads correspond bien au temps mesuré pour le processus:
  
 <code> <code>
progc.txt · Dernière modification : 2018/10/11 20:49 de 127.0.0.1