Optimisation
Dernière modification : 2007/08/04 01:30
Profiler le code
→ ajouter une fonction et ses appels à des endroits stratégiques
function profile ($txt,$dump=FALSE)
{
static $times;
if ($dump)
{
if (!file_exists("perfs.log"))
{
$f = fopen("perfs.log","w");
for ($i=1;$i<sizeof($times);$i++)
fwrite($f,sprintf("%s:",$times[$i][0])); // header
fwrite($f,"\n");
}
else
$f = fopen("perfs.log","a");
for ($i=1;$i<sizeof($times);$i++)
fwrite($f,sprintf("%f:",$times[$i][1]-$times[$i-1][1])); // valeurs
fwrite($f,"\n");
fclose($f);
}
else
{
list($usec, $sec) = explode(" ", microtime());
$times[] = array($txt,((float)$usec + (float)$sec));
}
}
profile("Debut"); // init en début de script
...
profile("Traitement"); // après le code de traitement des actions
...
profile("Formatage"); // après les regex de formatage
...
profile("",TRUE); // a la fin pour écrire les valeurs
→ on obtient le résultat dans le fichier perfs.log :
Traitement:Formatage:
0.027288:0.407159:
0.027298:0.453744:
0.032468:0.444973:
0.025138:0.446650:
Obtenir les perfs
Voici un petit script pour collecter les données en affichage :
#!/bin/bash
url="http://localhost/tw/?page=TestSpeed"
i=0
nb=20
while [ "$i" -lt "$nb" ]
do
echo "$i"
wget -q -O /dev/null "$url"
i=`expr $i + 1`
done
wget -q -O - ${url%\?*}perfs.log
Il faut bien sur remplacer la variable url par la page à tester.
Résultats
Voici les 1ers résultats obtenus en remplaçant u_niquement les preg_replaces par str_replace pour les chaines statiques soit :
- les remplacement des tags dans le template (CONTENT, HISTORY, PAGE_TITLE ...)
- les regex sans références dans la partie Formatage de page (ligne 194 en 2.21)
- TigerWiki 2.21 non modifié (vanilla)
- TigerWiki 2.21 avec les optimisations
- TigerWiki 2.21 avec ma balise Code
- TigerWiki 2.21 avec ma balise Code et les optimisations (cette version est dispo la)
Le gain n'est pas foudroyant (entre 0.5% et 1.7%) mais c'est sans doute un travail qui mérite d'être fait.
Axes d'améliorations
- remplacer preg_replace par str_replace la ou on peut
- traquer les preg_match à remplacer par strpos
- appliquer le même raisonnement aux autres preg_*
- surement pleins d'autres choses au niveau de l'algo donc plus compliquées :)