Je me suis amusé à recréer la fonction str_repeat et je me suis aperçu que mon code n'est pas optimisé, en plus de ça j'obtiens très rapidement une erreur fatale de dépassement de la mémoire que je n'obtiens pas avec str_repeat. Constatant cela, je me suis un peu creusé la tête et j'ai écrit 3 fonctions différentes qui donnent des résultats médiocres par rapport à la fonction str_repeat.
J'aimerais comprendre avec votre aide le pourquoi du comment. Ci-dessous mes fonctions et tout en bas les résultats que j'obtiens.
Code : Tout sélectionner
<?php
header('content-type: text/plain; charset=utf-8');
function my_str_repeat($input, $multiplier)
{
$input = (string) $input;
$multiplier = ((int) $multiplier > 0) ? (int) $multiplier : 1;
$string = '';
for ($i = 0; $i < $multiplier; $i++):
$string .= $input;
endfor;
return $string;
}
function my_str_repeat_with_array($input, $multiplier)
{
$input = (string) $input;
$multiplier = ((int) $multiplier > 0) ? (int) $multiplier : 1;
$string = array();
for ($i = 0; $i < $multiplier; $i++):
$string[] = $input;
endfor;
$string = implode(' ', $string);
return $string;
}
function my_str_repeat_with_multiple($input, $multiplier)
{
$input = (string) $input;
$multiplier = ((int) $multiplier > 0) ? (int) $multiplier : 1;
$string = $input;
$i = 1;
while ($i < $multiplier)
{
$i *= 2;
if ($i > $multiplier)
{
$i /= 2;
while ($i < $multiplier)
{
$string .= $input;
$i++;
}
}
else
{
$string .= $string;
}
}
return $string;
}
/**
* str_repeat()
**/
$start = microtime(true);
$result1 = str_repeat('Je suis le meilleur !!!', 700000);
$end = microtime(true);
$time = $end - $start;
echo "avec str_repeat : $time secondes\r\n";
/**
* my_str_repeat()
**/
$start = microtime(true);
$result2 = my_str_repeat('Je suis le meilleur !!!', 700000);
$end = microtime(true);
$time = $end - $start;
echo "avec ma fonction my_str_repeat() : $time secondes\r\n";
/**
* my_str_repeat_with_array()
**/
$start = microtime(true);
$result3 = my_str_repeat_with_array('Je suis le meilleur !!!', 700000);
$end = microtime(true);
$time = $end - $start;
echo "avec ma fonction my_str_repeat_with_array() : $time secondes\r\n";
/**
* my_str_repeat_with_multiple()
**/
$start = microtime(true);
$result4 = my_str_repeat_with_multiple('Je suis le meilleur !!!', 700000);
$end = microtime(true);
$time = $end - $start;
echo "avec ma fonction my_str_repeat_with_multiple() : $time secondes\r\n";
?>
avec ma fonction my_str_repeat() : 0.31000018119812 secondes
avec ma fonction my_str_repeat_with_array() : 0.42000079154968 secondes
avec ma fonction my_str_repeat_with_multiple() : 0.12000012397766 secondes
On note que la dernière fonction que j'ai écrite obtient un score nettement mieux que les 2 autres mais on reste bien en deçà de la fonction native de PHP...
Message édité pour corriger une faute d'orthographe.