Fonctions natives vs Objets

La programmation orientée objet (POO) a de nombreux avantages sur la programmation procédurale, le code est plus simple à lire, à maintenir et à faire évoluer, l’on peut réutiliser ses objets dans différents projets, mettre en place des tests unitaires pour s’assurer de leur bon fonctionnement, et même générer la documentation à partir des commentaires. Bref à priori que des avantages. À priori car à force de vouloir développer un objet pour la moindre opération on fini par tomber dans l’excés. Prenons par exemple une opération simple de formatage de date où l’on doit transformer une date au format standard issue d’une base de données dans un format plus “user friendly”. J’utilise ZendFramework depuis maintenant un certains temps et j’ai vu ces dernières années cette manipulation faite très souvent en utilisant Zend_Date. ZendFramework est sans aucun doute un très bon outil, les objets sont riches et répondent à grand nombre de besoin ; un test similaire pourrait sûrement être effectué en utilisant des objets de Symphony ou de CakePHP.

Voici le test effectué, il donne le temps nécessaire et la mémoire utilisée pour réaliser la conversion de date en utilisant Zend_Date, DateTime un objet natif fourni par PHP et les fonctions natives de PHP strftime et strtotime

$d = '2011-03-28 07:28:12';

$loop=1000;
$i=0;

$start = microtime(true);
$memory_start = memory_get_usage();
while ($i++ < $loop) {
    $date = new Zend_Date($d, 'MM.dd.yyyy hh:mi:ss');
}
$memory_end = memory_get_usage();
$end = microtime(true);
echo 'Zend_Date - Time : ', $end - $start,
    ' / Memory : ', $memory_end - $memory_start, "\n";

unset ($date);

$i=0;
$start = microtime(true);
$memory_start = memory_get_usage();
while ($i++ < $loop) {
    $date = new DateTime($d);
    $date = $date->format('j M Y H:i:s');
}
$memory_end = memory_get_usage();
$end = microtime(true);
echo 'Native PHP Object - Time : ', $end - $start,
    ' / Memory : ', $memory_end - $memory_start, "\n";

unset ($date);

$i=0;
$start = microtime(true);
$memory_start = memory_get_usage();
while ($i++ < $loop) {
    $date = strftime('%d %b %Y %H:%M:%S', strtotime($d));
}
$memory_end = memory_get_usage();
$end = microtime(true);
echo 'Native PHP - Time : ', $end - $start,
    ' / Memory : ', $memory_end - $memory_start, "\n";

Et voici le résultat,

Zend_Date - Time : 6.49872088432 / Memory : 5401472
Native PHP Object - Time : 0.00977492332458 / Memory : 400
Native PHP - Time : 0.00840377807617 / Memory : 176

Sans surprises l’utilisation des fonctions natives est beaucoup moins gourmande en ressources. Attention je ne fait aucun reproche à Zend_Date, cet objet à été designé pour remplir des tâches autrement plus compliquées que la simple conversion de format. Le problème c’est l’utilisation que certains développeurs font des outils à leur disposition, à grand principe de “qui peut le plus, peut le moins” ils vont avoir tendance à sortir un objet implémentant un algorithme complexe développer pour détecter des mots clés dans un texte pour… afficher un “Hello word!”.

Quelque soit le langage, les objets disponibles sont conçus dans un but bien défini, vérifiez toujours que l’objet que vous voulez utiliser est fait pour ce que vous voulez en faire, et si possible, utilisez les fonctions natives du langage.

About the Author: Guillaume Luchet

Guillaume Luchet est Directeur de la R&D et Lead Développeur chez Bilendi Technology, entrepreneur et développeur freelance.