Opérateur ternaire PHP : rapide ou pas ?

藏色散人
Libérer: 2023-04-04 21:36:01
original
4778 Les gens l'ont consulté

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.

Opérateur ternaire PHP : rapide ou pas ?

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 = '';
}
Copier après la connexion

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[&#39;test&#39;][$i] = $i;
}
// you can also just create a big string
// $context = str_repeat(&#39; &#39;, 1000000);

// benchmark
$time = microtime(true);
for ($i = 0; $i < 100; $i++) {
    // the snippet of code to benchmark
    $tmp = isset($context[&#39;test&#39;]) ? $context[&#39;test&#39;] : &#39;&#39;;
}
printf("TIME: %0.2d\n", (microtime(true) - $time) * 1000);
Copier après la connexion

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[&#39;test&#39;];

// the copy happens now
$tmp[] = true;

// copy also happens if the original variable changes
// $context[&#39;test&#39;][] = true;
Copier après la connexion
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[&#39;test&#39;] ?: &#39;&#39;;
Copier après la connexion
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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal