Salut a tous,
pour optimiser mon code j'aimerais savoir comment doit-on procéder pour pouvoir afficher le temps de génération d'une page?
Version imprimable
Salut a tous,
pour optimiser mon code j'aimerais savoir comment doit-on procéder pour pouvoir afficher le temps de génération d'une page?
ba tu stocke le temps actuel au début de la génération de la page(style juste apres le <?php) avec la fonction time();
Puis à la fin de ton code tu refais un appel à time, tu soustrais la première valeur à celle que tu viens de récupérer et tu as le temps de génération de ta page en secondes
Voilou, ensuite je ne sais pas si ça correspond à ce que tu recherche, mais bon c'est une solution onne peut plus simple
OUi mais je me demandais si il n'existait pas deja des fonctions toute faites.
Et j'aurai la même question pour compter le nombre de requette? Faut quand même pas faire un compter et faire + 1 à chaque requette?
A oui le probleme avec la fonction time c'est que l'on a les secondes. On ne peut pas avoir les centieme de seconde?
C'est bon j'ai trouvé microtime :D.
Par contre c'est bizare. Desfois quand je raffraichi j'obtient un temps négatifs 8O normal?
8O Ouahou tu remontes le temps !
fais voir ton code ... (que je remonte moi aussi, j'ai les résultats de quelques loto intéressants à jouer 8) )
Il existe des librairies "toutes pretes" (dans pear entre autre) qui permettent ça...
Sinon, voici une partie de ce que j'utilise :
Pour l'utilisation :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101 // --------------------- Fonctions de benchmark function & k_bench_init() { static $bench = array( 'stats'=>array(), 'count'=>array(), 'tmp'=>array(), ); return $bench; } function k_bench_start($cat,$info=false) { $start=k_time_actual(); $benchInfo = & k_bench_init(); if($tmp=end($benchInfo['tmp'])) { $include=$tmp['cat']; if($tmp['info']) $include.=' / '.$tmp['info']; } else $include=false; array_push($benchInfo['tmp'], array('cat'=>$cat, 'start'=>$start, 'info'=>$info, 'include'=>$include)); } function k_bench_stop($info_end=false) { $benchInfo = & k_bench_init(); if(!$tmp=array_pop($benchInfo['tmp'])) return false; $cat=$tmp['cat']; $info=$tmp['info']; if($info_end !== false) { if($info) $info.=' / '; $info.=$info_end; } if($tmp['include'] !== false) $info.=' (included in : '.$tmp['include'].')'; $time=bcsub(k_time_actual(), $tmp['start'], 6); if(!isset($benchInfo['stats'][$cat])) { $benchInfo['stats'][$cat]=array('1 '.$info=>$time); $benchInfo['count'][$cat]=1; } else { $id=(++$benchInfo['count'][$cat]).' '.$info; $benchInfo['stats'][$cat][$id]=$time; } return true; } function & k_bench_get() { $benchInfo = & k_bench_init(); $level = 1; while( k_bench_stop('force '.($level++).' level') ); $stats=array( 'php'=>array( 'total'=>bcsub(k_time_actual(), k_time_start(), 6) ) ) + $benchInfo['stats']; foreach($stats as $cat => $list){ if(count($list)>1){ $count=0; foreach($list as $time) $count+=$time; $stats[$cat]['total']=$count; } } return $stats; } // --------------------- Fonctions diverses function k_time_start() { static $time = NULL; if( $time === NULL ) $time = k_time_actual(); return $time; } function k_time_actual() { $tmp = explode( ' ', microtime() ); return $tmp[1] . substr( $tmp[0], 1 ); }
1) le plus tôt possible dans le code, appeler k_time_start() pour pouvoir initialiser le compteur.
2) entourer les portions de code à chronometrer comme ceci :
3) à la fin du script, afficher les résultats :Code:
1
2
3 k_bench_start( 'lecture cache', 'nom du cache' ); [...] k_bench_stop()
Ce qui donne :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 $stats = k_bench_get(); echo '<ul>'; foreach( $stats as $cat => $list ) { echo '<li>'; echo '<ul>', htmlspecialchars( $cat ); foreach( $list as $info => $time ) { echo '<li >', htmlspecialchars( round( $time * 1000 , 2 ) ), 'ms ', htmlspecialchars( $info ), '</li>'; } echo '</ul></li>'; } echo '</ul>';
http://www.boolsite.net/download/bench.png
Bon... ce n'est qu'un exemple... mais en tous cas c'est bien pratique. :)
bah j'ai juste fai:
en de ma pageCode:
1
2<? $tempscreaction=microtime(); ?>
et ca:
en bas de la page :(.Code:
1
2
3
4 $tempsfini=microtime(); $tempsaffi=$tempsfini-$tempscreaction; echo $tempsaffi;
relis la doc de microtime, surtout le type de ce qui est retourné...
Ba c'est le time stamp en microseconde non?
relis encore...
Donc si je fait la soustraction entre les 2 j'ai bien le temps en seconde avec les microseconde non?Citation:
microtime() retourne le stimestamp Unix avec les microsecondes.
non justement. Mais ma fonction "k_time_actual()" plus haut utilise correctement microtime()...
C'est un peu de l'artillerie lourde pour obtenir jsute le temps de génération d'un e page quand même.Citation:
Envoyé par Kioob
c'est deja plus simple quand même :D?Citation:
<?php
$startTime = array_sum(explode(" ",microtime()));
echo round((array_sum(explode(" ",microtime())) - $startTime),4).' sec';
?>
il y a un exemple d'utilisation sur la doc...
Ou il y a la fonction de Kioob...
8O Ca de l'artillerie lourde... :marteau:Code:
1
2
3
4
5 function k_time_actual() { $tmp = explode( ' ', microtime() ); return $tmp[1] . substr( $tmp[0], 1 ); }
je te parle d'une seule fonction, qui fait 2 lignes... pas de l'ensemble qui permet de benchmarker relativement "finement" de multiples portions de scripts dans un même code...
note : en utilisant array_sum() tu perds une grande partie de la précision de microtime()...
Pour pouvoir faire les calculs correctement il faut utiliser les fonctions bc_xxx(). Or, comme c'est assez couteux il est plus rapide de conserver le résultat de microtime() en chaine, et de ne faire les calculs qu'au dernier moment.
Edit : d'ailleurs la fonction en question est inspirée de la classe benchmark de PEAR si j'ai bonne mémoire...
Une autre classe d'artillerie lourde sinon que je trouve sympa : http://phpdebug.sf.net