Page 1 sur 1

OMG benchmarks!

Posté : 12 mai 2007, 12:12
par Hubert Roksor
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 :lol:

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>
tests/strlen_vs_isset.xml

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>

Posté : 12 mai 2007, 12:20
par Hubert Roksor
J'ai oublié de préciser. Ce script est domaine public, je l'utilise très rarement et je ne pense pas le mettre à jour mais si vous avez un problème vous pouvez toujours essayer de répondre à ce sujet :roll: