Les gens adorent l'optimisation. Ils sont faciles à comprendre et faciles à appliquer…. Mais il y a quelque temps, en regardant les pull request de Twig, j'ai lu une discussion intéressante sur les performances de l'opérateur ternaire en PHP.
Savez-vous lequel des clips suivants est le plus rapide (bien sûr, ils font exactement la même chose)
// snippet 1 $tmp = isset($context['test']) ? $context['test'] : ''; // snippet 2 if (isset($context['test'])) { $tmp = $context['test']; } else { $tmp = ''; }
La bonne réponse ? c'est :
Cela dépend de la situation. La plupart du temps, leurs vitesses sont les mêmes et vous n’avez pas besoin de vous en soucier. Mais si $context['test'] contient beaucoup de données, l'extrait 2 est beaucoup plus rapide que l'extrait 1.
Voici le code que j'ai utilisé pour tester différents scénarios :
$context = array('test' => true); // optionally fill-in the test value with lots of data for ($i = 0; $i < 100000; $i++) { $context['test'][$i] = $i; } // you can also just create a big string // $context = str_repeat(' ', 1000000); // benchmark $time = microtime(true); for ($i = 0; $i < 100; $i++) { // the snippet of code to benchmark $tmp = isset($context['test']) ? $context['test'] : ''; } printf("TIME: %0.2d\n", (microtime(true) - $time) * 1000);
Notez que les chiffres de performances absolus ici n'ont aucun sens. Nous voulons juste comparer la vitesse entre différents clips.
Sur mon ordinateur portable, l'extrait 1 prend plus de 2 secondes à s'exécuter, tandis que l'extrait 2 prend environ 0,05 ms. C'est une grande différence ! Mais si la variable testée ne transporte pas beaucoup de données, la vitesse est presque la même.
Alors pourquoi l'opérateur ternaire est-il lent dans certains cas ? Pourquoi s'appuie-t-il sur la valeur stockée dans la variable de test
La réponse est très simple :
<🎜 L'opérateur ternaire ? copie toujours la valeur, contrairement à l'instruction if. Pourquoi ? Parce que PHP utilise une technique appelée copie sur écriture : lorsque vous attribuez une valeur à une variable, PHP ne crée pas de copie du contenu de la variable tant qu'elle n'est pas modifiée. Lorsque vous écrivez une instruction comme $tmp = $context['test'], presque rien ne se passe : la variable $tmp devient simplement une référence à la variable $context['test'] c'est pourquoi c'est très ; rapide. Mais dès que l'on souhaite modifier la variable, PHP doit copier celle d'origine :$tmp = $context['test']; // the copy happens now $tmp[] = true; // copy also happens if the original variable changes // $context['test'][] = true;
$tmp = $context['test'] ?: '';
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!