Maison >développement back-end >tutoriel php >Opérateur ternaire PHP : rapide ou pas ?
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 :
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;Pour résumer, la vitesse de l'opérateur ternaire est directement liée au temps qu'il faut pour copier le résultat de la déclaration, même si cela n’est pas strictement requis. Copier un tableau de 100 000 éléments prend du temps. Si vous utilisez PHP 5.3, il existe un moyen plus simple d'exprimer nos déclarations en utilisant le nouveau ?:construct::
$tmp = $context['test'] ?: '';En termes de performances cependant, cette nouvelle construction a le mêmes inconvénients que la construction standard, même si PHP peut être capable d'optimiser le cas où la variable est présente.
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!