Accueil > > > UNE CLASSE SIMPLE EN C++ POUR MESURER LE TEMPS D'EXECUTION D'UNE PORTION DE CODE SUR UNE MACHINE NON DEDIEE AUX TESTS (WINDOWS)
UNE CLASSE SIMPLE EN C++ POUR MESURER LE TEMPS D'EXECUTION D'UNE PORTION DE CODE SUR UNE MACHINE NON DEDIEE AUX TESTS (WINDOWS)
Information sur la source
Description
On a parfois besoin de mesurer le temps d'exécution CPU d'une portion de code (lors de l'optimisation de l'efficacité d'une procédure par exemple), et pas toujours les moyens de consacrer une machine exclusivement aux tests. L'utilisation de procédures comme clock(), GetTime(), QueryPerformanceCounter() ou d'autres permet de calculer le temps "réel" qui s'est écoulé entre deux points du code. Lorsqu'on ne peut pas dédier une machine aux tests, l'inconvénient de ces méthodes est de prendre en compte le temps des autres applications qui tournent sur le système en concurrence avec celle testée. Ce cas de figure est par exemple rencontré sur une machine sur laquelle on ne possède pas les droits suffisants pour désactiver une défragmentation, une analyse antivirus... automatique. Le temps consommé par ces applications n'est alors pas décompté par les méthodes sus-citées, ce qui fausse totalement les mesures. Cette classe fournit un moyen simple de mesurer le temps processeur du processus courant uniquement entre un point de l'exécution et un autre grâce à l'utilisation de la fonction le l'API de Windows GetProcessTimes. L'utilisation de cette procédure permet de ne pas avoir recours à une gestion avancée du multi-tâche pour contrôler la préemption de notre processus. Elle dispose en outre d'une mémoire comparable à celle d'un chronomètre classique afin de pouvoir ajouter une mesure à d'autres. Elle présente les avantages suivants : - ne mesurer que le temps du processus (si d'autres applications sont en cours d'exécution sur le système, la mesure n'est pas faussée) - très simple (à mon avis) d'utilisation
Source
- //---------------------------------------------------------------------------
- // Classe Chronomètre : permet de mesurer le temps CPU du processus courant
- // Le temps considéré est le UserTime du processus, soit le temps pendant
- // lequel le système exécute du code appartenant au processus uniquement.
- //---------------------------------------------------------------------------
- #ifndef chronoH
- #define chronoH
- #include <windows.h>
- //---------------------------------------------------------------------------
- class Chrono
- {
- // Handle du processus courant
- HANDLE ihP;
- // Temps CPU lors du déclenchement
- unsigned int startTime;
-
- public :
- // mémoire du chrono
- unsigned int m;
-
- // Constructeur
- Chrono() {reset();}
- // mise à zéro de la mémoire
- void reset() {m=0;}
- // Lance le chronomètre
- void iGo()
- {
- FILETIME ilpCreationTime;
- FILETIME ilpExitTime;
- FILETIME ilpKernelTime;
- FILETIME ilpUserTime;
- SYSTEMTIME stUser;
- ihP=GetCurrentProcess();
- GetProcessTimes(ihP,&ilpCreationTime,&ilpExitTime,&ilpKernelTime,&ilpUserTime);
- FileTimeToSystemTime(&ilpUserTime,&stUser);
- startTime=(stUser.wMilliseconds +1000*(stUser.wSecond
- +60*(stUser.wMinute+60*(stUser.wHour+24*(stUser.wDay-1)))));
- }
- // Renvoie le temps CPU du processus, en millisecondes,
- // écoulé depuis le lancement du chrono
- unsigned int iStop()
- {
- FILETIME ilpCreationTime;
- FILETIME ilpExitTime;
- FILETIME ilpKernelTime;
- FILETIME ilpUserTime;
- SYSTEMTIME stUser;
- GetProcessTimes(ihP,&ilpCreationTime,&ilpExitTime,&ilpKernelTime,&ilpUserTime);
- FileTimeToSystemTime(&ilpUserTime,&stUser);
- return stUser.wMilliseconds +1000*(stUser.wSecond
- +60*(stUser.wMinute+60*(stUser.wHour+24*(stUser.wDay-1))))
- -startTime;
- }
- // Ajoute le temps CPU du processus, en millisecondes,
- // écoulé depuis le lancement du chrono à la mémoire
- void iStopAndAdd()
- {
- m+=iStop();
- }
- };
- //---------------------------------------------------------------------------
- #endif
//---------------------------------------------------------------------------
// Classe Chronomètre : permet de mesurer le temps CPU du processus courant
// Le temps considéré est le UserTime du processus, soit le temps pendant
// lequel le système exécute du code appartenant au processus uniquement.
//---------------------------------------------------------------------------
#ifndef chronoH
#define chronoH
#include <windows.h>
//---------------------------------------------------------------------------
class Chrono
{
// Handle du processus courant
HANDLE ihP;
// Temps CPU lors du déclenchement
unsigned int startTime;
public :
// mémoire du chrono
unsigned int m;
// Constructeur
Chrono() {reset();}
// mise à zéro de la mémoire
void reset() {m=0;}
// Lance le chronomètre
void iGo()
{
FILETIME ilpCreationTime;
FILETIME ilpExitTime;
FILETIME ilpKernelTime;
FILETIME ilpUserTime;
SYSTEMTIME stUser;
ihP=GetCurrentProcess();
GetProcessTimes(ihP,&ilpCreationTime,&ilpExitTime,&ilpKernelTime,&ilpUserTime);
FileTimeToSystemTime(&ilpUserTime,&stUser);
startTime=(stUser.wMilliseconds +1000*(stUser.wSecond
+60*(stUser.wMinute+60*(stUser.wHour+24*(stUser.wDay-1)))));
}
// Renvoie le temps CPU du processus, en millisecondes,
// écoulé depuis le lancement du chrono
unsigned int iStop()
{
FILETIME ilpCreationTime;
FILETIME ilpExitTime;
FILETIME ilpKernelTime;
FILETIME ilpUserTime;
SYSTEMTIME stUser;
GetProcessTimes(ihP,&ilpCreationTime,&ilpExitTime,&ilpKernelTime,&ilpUserTime);
FileTimeToSystemTime(&ilpUserTime,&stUser);
return stUser.wMilliseconds +1000*(stUser.wSecond
+60*(stUser.wMinute+60*(stUser.wHour+24*(stUser.wDay-1))))
-startTime;
}
// Ajoute le temps CPU du processus, en millisecondes,
// écoulé depuis le lancement du chrono à la mémoire
void iStopAndAdd()
{
m+=iStop();
}
};
//---------------------------------------------------------------------------
#endif
Conclusion
Pour utiliser la classe, il suffit de : - ajouter l'include (#include "Chrono.h" après avoir copié le fichier dans le répertoire source) - définir un objet Chrono (par exemple, tps) pour chaque temps que vous voulez mesurer - déclencher le chronomètre juste avant la portion de code à chronométrer (tps.iGo()) - si vous voulez ajouter le temps à la mémoire, faire tps.iStopAndAdd(), le temps écoulé sera ajouté à tps.m si vous voulez seulement récupérer les temps écoulé depuis le déclenchement, faire temps=tps.iStop() Le zip contient un exemple d'utilisation (demo.cpp), peut-être plus clair que ces explications...
Historique
- 14 septembre 2005 12:22:57 :
- Changement de titre (plus complet)
- 14 septembre 2005 20:44:33 :
- Ajout du code dans la zone code (pour éviter le téléchargement)
- 14 septembre 2005 20:52:38 :
- Juste une mise en forme du code...
- 16 septembre 2005 14:16:23 :
- Tirant l'expérience des remarques de BruNews, optimisation du code et explication plus précise du but du code.
- 08 mars 2006 17:00:02 :
- modif mineure
- 31 juillet 2006 05:30:52 :
- mod mineure
- 12 avril 2007 14:31:09 :
- Ajout des catégories
- 05 juillet 2007 17:02:20 :
- Mod. forme
- 20 juillet 2007 11:46:55 :
- .
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
temps d'exécution d'un processus (c/linux) [ par davidauche ]
bonjour a tt monde,comment calculer le temps d'exécution d'un processus en c sous linux!?j'essaie avec time et times + struct tms marc
Utilisation du port // ; mesure temps-résistance [ par thibzult ]
Bonjour,Je dois d'abord vous dire que mes connaissances en programmations sont ... quasi nulles ! J'ai programmé il y a longtemps en GW-Basic pui
temps processeur d'un processus [ par lefouman ]
bonjour a tous je viens de commencer un stage en informatique et je dois faire un programme en C++ qui me permette de trouver le temps qu'un processeu
SIMULATION d’APPLICATION TEMPS RÉEL [ par MEHOUTA ]
je souhaite réaliser une simulation d'application temps réel sous unix et je dois utiliser comme solution des processus et que des appels sy
temps d'exécution trop long [ par diable007 ]
bonjour, j'ai une application parallèle en c++ et MPI, j'ai une partie qui ne nécessite pas de communication avec mpi entre les processeurs. En séqu
mesure de temps d'exécution [ par ezneti ]
Bonjour tout le monde, Je veux faire la mesure de temps d'exécution d'un programme (de traitement d'image)developpé en C sur un processeur bien determ
ordonnancement [ par futur1ing1info ]
Salut, j'ai un probleme d'ordonnancement qui utilise la politique tourniquet avec un quantum de temps qui peut etre superieur au temps d'execution de
Relancer un processus quant celui ci et down [ par xana05 ]
Bonjour, Voila j'ai un petit soucie avec un programme (de vidéosurveillance ) il arrive que le programme se ferme tout seul quant il commence l'encoda
création d'un processus en C sous linux [ par azimhamid1975 ]
salut à tous j'ai un probléme [^^confus2] [^^sad1] je cherche un programme C qui crée un processus sachant que : le processus parent (en C sous linux
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
MATRICE TEMPLATEMATRICE TEMPLATE par hjr2610
Cliquez pour lire la suite par hjr2610 RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|