OMG benchmarks!
Posté : 12 mai 2007, 12:12
Voici un script que j'avais écris pour effectuer quelques tests mais que je n'ai jamais vraiment fini et donc jamais distribué. Créez le fichier generate.php et les tests dans le sous-répertoire tests. En exécutant generate.php des scripts PHP seront créés dans le répertoire tests. Il ne vous reste plus qu'à exécuter ces scripts séparément en ligne de commande.
Le script de génération nécessite PHP5 mais les tests produits fonctionneront sous PHP4. Je vous mets deux exemples de tests, à vous de deviner comme écrire les vôtres
generate.php
tests/strlen_vs_isset.xml
Le script de génération nécessite PHP5 mais les tests produits fonctionneront sous PHP4. Je vous mets deux exemples de tests, à vous de deviner comme écrire les vôtres
generate.php
<?php
foreach (glob('./tests/*.xml') as $id)
{
$id = substr(basename($id), 0, -4);
$file = './tests/' . $id . '.xml';
$bench = simplexml_load_file($file);
$php = "<?php\nset_time_limit(0);\n";
if (!empty($bench->setup))
{
$php .= "\n" . trim($bench->setup) . "\n\n";
}
foreach ($bench->tests->group as $group)
{
$php .= 'echo "\\n";' . "\n";
if (!empty($test->setup))
{
$php .= "\n" . trim($test->setup) . "\n";
}
foreach ($group->test as $test)
{
$php_test = rtrim($test);
if (preg_match('#\\n\\t+#', $php_test, $m))
{
$php_test = str_replace($m[0], "\n\t", ltrim($php_test));
}
$php .= '
$i=' . $bench->iterations . ';
ob_start();
$s=microtime();
do
{
' . $php_test . '
}
while (--$i);
$e=microtime();
ob_end_clean();
echo "\n", sprintf("%.4f", array_sum(explode(" ", $e)) - array_sum(explode(" ", $s))), "\\t", \'' . ltrim(str_replace(array('\\', "'"), array('\\\\', "\\'"), $php_test)) . '\';
';
echo htmlspecialchars(strval($test)),'<br/>';
}
if (!empty($test->teardown))
{
$php .= "\n" . trim($test->teardown) . "\n";
}
}
$php .= "\n\necho \"\\n\";";
if (!empty($bench->teardown))
{
$php .= "\n" . trim($bench->teardown) . "\n";
}
file_put_contents('./tests/' . $id . '.php', $php);
}
tests/multiple_echo.xml
Code : Tout sélectionner
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<bench>
<iterations>100000</iterations>
<description xml:lang="fr">
<p>Utiliser des variables PHP dans des chaînes entre guillemets est rarement efficace. Il est souvent préférable d'utiliser plusieurs echo ou sortir de PHP. Ce test essaie de mesurer les pertes de performance.</p>
<p><strong>Attention</strong>, les résultats de ce test sont sujets à de grosses variations selon la longueur des chaînes, la taille du "output buffer", etc...</p>
</description>
<description xml:lang="en">
<p>Using PHP is double-quoted strings is rarely efficient. Instead, it is often preferable to use multiple echo's or switch out and in PHP. This test will try to measure the performance loss.</p>
<p><strong>Attention</strong>, the results of this test will greatly vary depending on the length of the strings, the size of the output buffer, etc...</p>
</description>
<setup>
$fruit1 = 'apples';
$fruit2 = 'oranges';
</setup>
<tests>
<group>
<test><![CDATA[
echo "You can't compare $fruit1 to $fruit2";
]]></test>
<test><![CDATA[
echo "You can't compare {$fruit1} to {$fruit2}";
]]></test>
<test><![CDATA[
echo "You can't compare " . $fruit1 . ' to ' . $fruit2;
]]></test>
<test><![CDATA[
echo "You can't compare ", $fruit1, ' to ', $fruit2;
]]></test>
<test><![CDATA[
?>You can't compare <?php echo $fruit1; ?> to <?php echo $fruit2;
]]></test>
<test><![CDATA[
echo "You can't compare ";
echo $fruit1;
echo ' to ';
echo $fruit2;
]]></test>
</group>
</tests>
</bench>Code : Tout sélectionner
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<bench>
<setup><![CDATA[
$str = str_repeat(' ', 100);
]]></setup>
<iterations>1000000</iterations>
<description xml:lang="fr">
<p>Vous souhaitez comparer la taille d'une chaîne de caractères, au lien d'utiliser strlen() vous pouvez utiliser isset().</p>
</description>
<description xml:lang="en">
<p>You want to compare the size of a string, instead of using strlen() you can use isset().</p>
</description>
<source><a href="http://ilia.ws/archives/12-PHP-Optimization-Tricks.html">ilia.ws</a></source>
<tests>
<group>
<test><![CDATA[
strlen($str) > 6;
]]></test>
<test><![CDATA[
isset($str[6]);
]]></test>
</group>
<group>
<test><![CDATA[
strlen($str) < 256;
]]></test>
<test><![CDATA[
!isset($str[256]);
]]></test>
</group>
</tests>
</bench>