[algorithme] pour les gens qui ont un esprit logique :)

pour les gens qui ont un esprit logique :) [algorithme] - Algo - Programmation

Marsh Posté le 14-06-2003 à 00:15:55    

salut :)
je suis entrain de coder un peu comme un porc et donc je suis entrain de developper un petit truc pour benchmarker tous les appels de fonctions etc... il fadurait qu'au final je puiss faire une stat assez sympa, de ce style la:
 
nom de fonction
nombre d'appels
temps d'exécution total
 
 
pour cela je construis deux fonctions,  
 
dbgstart(function_name)
 
et un  
 
dbgend()
 
 
ok pour l'instant c bien sympa; a je possede un tableau dans lequel je vais ajouter, a chaque appel de fonction, un sous tableau avec le nom de fonction (et les eventuels parametres ?), l'instant d'exécution...
donc a chaque appel de fonction sera crée et ajouté celui ci au tableau d'appels ...
ok juske la tout va bien,
pour pouvoir chronometrer les temps d'execution, il faut que je fasse un dbgend histoire de pouvoir marquer la fin d'execution d'une fonction
 
 
donc, par exemple toute fonction sera definie ainsi:
 
 


function pouet()
{
  dbgstart("pouet" );
  // code a executer ...
  // ....
  // puis juste avant de retourner on dbgend() ;)
  dbgend()
  return la_valeur_cherchee;
}


voial meme si la fonction ne retourne rien on s'en fout on met le dbgend juste la ou son execution s'arrete ...
 
 
 
voila, les problemes qui se posent, sont par exemple si une fonction en appelle une autre; dans ce cas la il faut que l'appel respectif a dbgend() ecrive dans la bonne case sa date de fin d'execution
il faut aussi que si ya des appels successifs a plusieurs fonctions, ca ecrive le temps de fin d'exec dans la bonne case ...
 
 
voila en gros c un truc completement trivial que je cherche a faire, mais je suis kéblo car saturé de m'être explosé le crane depuis ca fait un mois :) donc voila si vous avez une idee d'algorithme tout con qui fasse ca, merci bcp ! (en fait je cherche a realiser les fonction dbgstart et dbgend)
 
 
apres, quand je voudrais avoir un recapitulatif, je balayerai tout le tableau d'infos et j'ajouterai les temps etc... c pas le probleme :)
 
 
voila aidez moi ca peut servir a d'autres j'espere :)
 
 
salut!
 

Reply

Marsh Posté le 14-06-2003 à 00:15:55   

Reply

Marsh Posté le 14-06-2003 à 00:21:59    

t'es sûr que ça va vraiment marcher ton truc?... les systèmes sont multi-tâche maintenant. Pour des petites fonctions comme ça oui ça posera pas de pb, mais si ton prog s'arrête pour laisser la main à un autre processus bah tes temps seront faussés...
 
sous UNIX c assez flagrant
Tu prends deux processus A et B
A contient ta fonction
B c'est un otre prog sans importance
 
A se lance, il note le temps
paf le système passe la main à B
B se lance, il met qq tps à s'exécuter
A reprend la main et note le tps de fin... et forcément c'est faussé.
 
Après ptet que je me trompe, mais shui pas sûr que ce soit faisable en fait  :??:

Reply

Marsh Posté le 14-06-2003 à 00:26:48    

bin ouais mais c pour du JS que je fais ca :)
heheh je code un OS en javascript :p nan pas vraiment mais une grosse usine a gaz de plus de 15000 lignes de code ;) et c assez animal ce truc :p donc je veux benchmarker pour optimiser!
 
 
voila en fait j'ai pensé à ça, dites moi si ca vous parait correct ? (pas encore testé, j'ai peur !!! :D)
 


 function dbgstart(fname)
 {
  var pushit = new Array();
  pushit["fname"] = fname;
  pushit["start"] = new Date();
  dbgdata.push(pushit);
  dbgstack++;
 }
 
 function dbgend()
 {
  var pos = dbgdata.length - dbgstack;
  dbgdata[pos]["end"] = new Date();
  dbgstack--;
 }


Message édité par k666 le 14-06-2003 à 00:28:03
Reply

Marsh Posté le 14-06-2003 à 09:09:33    

pour ce qui veulent résoudre ce problème en C++
 
http://boost.org/libs/timer/timer.htm#Class progress_timer
http://minilien.com/?yKRmarbbwj
 
d'un autre coté, le truc que tu veux faire, ça s'appelle un profiler si je ne m'abuse

Reply

Marsh Posté le 14-06-2003 à 09:50:00    

bon bin j'ai réussi à le faire finalement :) çà me donne des stats très très intéressantes :)
 
voici le code au cas ou:
(avec fncsInfo un tableau)


 
function dbgstart(fncName){
   var fncInfo = fncsInfo[fncName];
   if (!fncInfo) fncInfo=fncsInfo[fncName]={ calls:0, times:[], starts:[] }
   fncInfo.calls++;
   var tmp_start = new Date();
   var nutc = tmp_start.getTime();
   fncInfo.starts.push(nutc);
}
 
function dbgend(fncName){
   var now = new Date();
   var utc = now.getTime();
   var fncInfo = fncsInfo[fncName];
   fncInfo.times.push( utc - fncInfo.starts.pop() );
}
 

Reply

Marsh Posté le 24-06-2003 à 16:46:40    

Essaye de te documenter et évite d'écrire des messages trop long ça donne pas trop envie de lire  :sol:

Reply

Marsh Posté le 25-06-2003 à 01:22:51    

lol messages longs ???
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
nan [:urgeman]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed