[RESOLU] optimiser une fonction str_repeat faite maison

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] optimiser une fonction str_repeat faite maison

Re: optimiser une fonction str_repeat faite maison

par carte-sd » 01 mai 2016, 20:27

Merci pour cette réponse très claire, j'apprendrais le C plus tard. Ça me plait cette idée de descendre toujours plus bas vers le langage machine; on peut recréer le monde (de l'informatique...) !

Re: optimiser une fonction str_repeat faite maison

par Genova » 01 mai 2016, 15:08

Tes fonctions ne peuvent être que plus lentes que les fonctions natives qui sont écrites en C et totalement optimisées. Le C est un langage compilé de très bas niveau, et PHP est un langage interprété de haut niveau, pour vraiment comprendre pourquoi le C est beaucoup plus rapide il faudrait que tu l'apprennes. Chaque langage a ses avantages, le C a par exemple l'avantage de pouvoir optimiser au maximum les algorithmes, alors que le PHP permet de faire des scripts plus complexes sans réinventer la roue à chaque fois mais au détriment de la performance.

Pour le dépassement de mémoire, c'est parce que tu charges en mémoire une chaîne de caractère extrêmement longue. Lorsque tu remplis des variables dans un script, elles sont stockées dans la RAM, et par défaut PHP ne permet que de stocker 128 Mo dans la RAM. Pour augmenter ça il faut changer "memory_limit" (soit dans ton php.ini, soit en live dans le script en faisant ini_set()).

Re: optimiser une fonction str_repeat faite maison

par or 1 » 01 mai 2016, 14:26

pas spécialiste, mais je dirais qu'une fonction native ira toujours plus vite que du php.

optimiser une fonction str_repeat faite maison

par carte-sd » 01 mai 2016, 12:14

Bonjour à tous,
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 str_repeat : 0.0099999904632568 secondes
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.