J'ai remarqué que de nombreux développeurs utilisent à la fois strstr et strpos pour vérifier l'existence d'une sous-chaîne. L'un d'eux est-il préféré et pourquoi?
Depuis le PHP manuel en ligne :
Si vous voulez seulement déterminer si une aiguille particulière se produit dans une botte de foin, utilisez plutôt la fonction plus rapide et moins gourmande en mémoire
strpos()
.
Ici sont quelques autres réponses (+ repères) Je suis arrivé à ma question, qui est presque pareil (je n'ai pas réalisé le vôtre en le demandant).
En attendant, j'ai également fait mon propre test de référence, que j'ai exécuté 1000000 fois pour chaque fonction pertinente (strstr()
, strpos()
, stristr()
et stripos()
).
Voici le code:
<?php
function getmicrotime() {
list($usec, $sec) = explode(" ", microtime());
return ((float) $usec + (float) $sec);
}
$mystring = 'blahblahblah';
$findme = 'bla';
echo 'strstr & strpos TEST:<pre>';
$time_start = getmicrotime();
for($i=0; $i<1000000; $i++) strstr($mystring, $findme);
$time_needed_strstr = getmicrotime() - $time_start;
echo 'strstr(): ',
round( $time_needed_strstr , 8 ). PHP_EOL;
$time_start = getmicrotime();
for($i=0; $i<1000000; $i++) stristr($mystring, $findme);
$time_needed_stristr = getmicrotime() - $time_start;
echo 'stristr(): ',
round( $time_needed_stristr , 8 ) . PHP_EOL;
$time_start = getmicrotime();
for($i=0; $i<1000000; $i++) strpos($mystring, $findme) !== false;
$time_needed_strpos = getmicrotime() - $time_start;
echo 'strpos() !== false: ',
round( $time_needed_strpos , 8 ) . PHP_EOL;
$time_start = getmicrotime();
for($i=0; $i<1000000; $i++) stripos($mystring, $findme) !== false;
$time_needed_stripos = getmicrotime() - $time_start;
echo 'stripos() !== false: ',
round( $time_needed_stripos , 8 ) . PHP_EOL;
echo PHP_EOL;
echo 'time_needed_stristr - time_needed_strstr: ',
round( $time_needed_stristr - $time_needed_strstr , 8) . PHP_EOL;
echo 'time_needed_stripos - time_needed_strpos: ',
round( $time_needed_stripos - $time_needed_strpos , 8) . PHP_EOL;
echo PHP_EOL;
echo 'time_needed_strstr - time_needed_strpos: ',
round( $time_needed_strstr - $time_needed_strpos , 8) . PHP_EOL;
echo 'time_needed_stristr - time_needed_stripos: ',
round( $time_needed_stristr - $time_needed_stripos , 8) . PHP_EOL;
echo '</pre>';
?>
Et voici la première sortie, qui montre que strpos()
est le gagnant:
strstr & strpos TEST:
strstr(): 2.39144707
stristr(): 3.65685797
strpos() !== false: 2.39055395
stripos() !== false: 3.54681897
time_needed_stristr - time_needed_strstr: 1.2654109
time_needed_stripos - time_needed_strpos: 1.15626502
time_needed_strstr - time_needed_strpos: 0.00089312
time_needed_stristr - time_needed_stripos: 0.110039
Le suivant est similaire à la première sortie (strpos()
est à nouveau le gagnant):
strstr & strpos TEST:
strstr(): 2.39969015
stristr(): 3.60772395
strpos() !== false: 2.38610101
stripos() !== false: 3.34951186
time_needed_stristr - time_needed_strstr: 1.2080338
time_needed_stripos - time_needed_strpos: 0.96341085
time_needed_strstr - time_needed_strpos: 0.01358914
time_needed_stristr - time_needed_stripos: 0.25821209
Ci-dessous, un autre, plus intéressant, car dans ce cas, strstr()
est le gagnant:
strstr & strpos TEST:
strstr(): 2.35499191
stristr(): 3.60589004
strpos() !== false: 2.37646604
stripos() !== false: 3.51773095
time_needed_stristr - time_needed_strstr: 1.25089812
time_needed_stripos - time_needed_strpos: 1.14126492
time_needed_strstr - time_needed_strpos: -0.02147412
time_needed_stristr - time_needed_stripos: 0.08815908
Ça signifie cela peut vraiment dépendre des "circonstances environnementales", qui sont parfois difficiles à influencer et peuvent modifier le résultat de "tâches de micro-optimisation" comme celle-ci, au cas où vous vérifieriez simplement si une chaîne existe dans une autre ou non.
MAIS je pense que dans la plupart des cas, strpos()
est le gagnant par rapport à strstr()
.
J'espère que ce test a été utile pour quelqu'un.
De nombreux développeurs utilisent strpos
à des fins micro optimisation.
L'utilisation de strstr
ne fonctionne également que si la chaîne résultante ne peut pas être interprétée comme fausse dans un contexte booléen.
strpos () détecte où se trouve une aiguille particulière dans la botte de foin. stristr () teste si l'aiguille est n'importe où dans la botte de foin
strpos () est donc plus rapide et moins gourmand en mémoire
une raison pour strstr (): si votre aiguille est au début d'une chaîne, strpos retourne 0 (alors vérifiez-la avec === false)