J'ai tout d'abord commencer mes tests en ligne de commande.

Pour cela, j'ai utilisé le script suivant :

<?php

$phpCode = file_get_contents(__DIR__ . '/bench.php');

$descriptors = array
(
0 => array('pipe', 'r'),
1 => array('pipe', 'w'),
2 => array('pipe', 'w')
);

$durations = array();

for ($i = 0; $i < 100; $i++)
{
echo '.';

$php = proc_open($_SERVER['_'], $descriptors, $pipes);


if ($php !== false)
{
fwrite($pipes[0], $phpCode);
fclose($pipes[0]);

$stdOut = stream_get_contents($pipes[1]);
fclose($pipes[1]);

$stdErr = stream_get_contents($pipes[2]);
fclose($pipes[2]);

$returnValue = proc_close($php);

if ($stdErr != '')
{
throw new \runtimeException($stdErr, $returnValue);
}

$durations[] = unserialize($stdOut);
}
}

echo "\n";

echo array_sum($durations) . "\n";

?>

Les lecteurs attentifs auront remarqué que le script fait appel au fichier bench.php qui contient le code suivant :

<?php

$time = microtime(true);

require(__DIR__ . '/mageekguy.sparkline.phar');

use mageekguy\sparkline;
use mageekguy\sparkline\writers;
use mageekguy\sparkline\layer\linechart;

$data = array(1, 5, 6, -9, 10, -4, 8, 10, 11, 34, 3, 1, -7, -23, 38, 21, 10, 8, 6);

$sparkline = new sparkline(100, 20, $data);

ob_start();

$sparkline
->setPadding(4)
->addLayer(new linechart\curves\line(3, 40, 50, 255))
->addWriter(new writers\png())
->write()
;

ob_end_clean();

echo serialize(microtime(true) - $time);

?>

Ainsi, je peux exécuter une centaine de fois le script en partant d'un environnement propre à chaque fois.

J'obtient ainsi une mesure significative car l'auto-chargement de classe entre en jeux à chaque éxécution, ce qui ne serait pas le cas si j’exécutais mes itérations à l'aide d'une boucle traditionnelle dans un unique script.

J'ai par ailleurs éxecuté ce script avec un phar non compressé, un phar compressé, ainsi qu'en n'utilisant pas de phar, afin d'avoir une référence.

L'utilisation d'un phar non compressé ralentie donc le script d'environs 3% par rapport à une utilisation sans phar.

Un phar  compressé ralenti quand à lui le script d'environs 9% par rapport à un phar non compressé, et d'environs 12% par rapport à une utilisation sans phar.

L'utilisation du format phar a donc un impact direct sur les performances du langage, ce qui semble parfaitement logique.

C'est d'ailleurs la raison pour laquelle Greg Beaver, le créateur du format a prévu un système de cache au niveau du langage via la directive phar.cache_list.

J'ai donc effectué une nouvelle session de tests, en utilisant cette fois un serveur http pour pouvoir profiter de cette fonctionnalité.

Le code a donc été modifié de la façon suivante à cette fin :

<?php

header('Content-type: image/png');

require(__DIR__ . '/mageekguy.sparkline.phar');

use mageekguy\sparkline;
use mageekguy\sparkline\writers;
use mageekguy\sparkline\layer\linechart;

$data = array(1, 5, 6, -9, 10, -4, 8, 10, 11, 34, 3, 1, -7, -23, 38, 21, 10, 8, 6);

$sparkline = new sparkline(100, 20, $data);

$sparkline
->setPadding(4)
->addLayer(new linechart\curves\line(3, 40, 50, 255))
->addWriter(new writers\png())
->write()
;

?>

J'ai ensuite utilisé ab, successivement avec un phar non compressé, un phar compressé, sans phar, et en activant et en désactivant alternativement le cache, de la manière suivante :

fch@witchblade:/usr/local/www/bench.local
133> ab -n 1000 -c 5 http://bench.local/index.php

Il en ressort qu'un phar non compressé sans cache ralenti le script d'environs 6%, alors qu'un phar non compressé avec le cache est de moins de 1% plus lent.

Le cache a donc un impact plus que positif sur les performances, ce qui se comprend parfaitement lorsque l'on sait comment il fonctionne.

En effet, il force la lecture en mémoire de l'ensemble des archives phar devant être mis en cache au démarrage du serveur web.

Le langage n'a donc plus besoin de lire à l'intérieur de l'archive et en conséquence, un phar peut donc être plus efficace qu'un ensemble de fichiers.

Cependant, vous aurez peut être remarqué que je n'ai pas indiqué mes résultats dans le cas d'une archive phar compressée, car j'ai été incapable de la faire fonctionner avec le cache activé.

Il semblerait en effet que ce dernier soit incapable de lire des fichiers compressés.

Pour autant, j'ai pu réaliser mon test avec le cache désactivé, et les résultats sont sans appel, l'utilisation de l'archive compressée ralentie le script de pratiquement 42%.

Dans le cadre d'un serveur http, il est donc primordiale d'activer le cache afin de conserver des performances optimales.

Quant au cas d'un script en ligne de commande, une solution à la baisse d'efficacité induite par l'utilsation d'archives phar pourrait être la mise en place d'un cache tel qu'APC au niveau de PHP lui-même, et à tout le moins de ne pas utiliser d'archive compressée.