Ich war neugierig, so schrieb ich folgendes kurzes Skript:
<?php
$keys = [
"veryshort",
"veryvertlongstringhereveryvertlongstringhereveryvertlongstringhereveryvertlongstringhereveryvertlongstringhereveryvertlongstringhere",
"shortstringwithmatchBintheresomewhere",
uniqid("",true).uniqid("",true).uniqid("",true).uniqid("",true).uniqid("",true).uniqid("",true).uniqid("",true).uniqid("",true).uniqid("",true) //just random stuff
];
$ops = 1000000;
foreach ($keys as $key) {
$mt = microtime(true);
for ($i = 0;$i < $ops;$i++) {
$bool = strpos($key, 'matchA') !== false || strpos($key, 'matchB') !== false || strpos($key, 'matchC') !== false || strpos($key, 'matchD') !== false || strpos($key, 'matchE') !== false;
}
$mtEnd = microtime(true);
echo PHP_EOL."String $key".PHP_EOL;
echo "StrPos".PHP_EOL;
echo "Total time: ".($mtEnd-$mt).PHP_EOL;
echo "Average time: ".($mtEnd-$mt)/$ops.PHP_EOL;
$mt = microtime(true);
for ($i = 0;$i < $ops;$i++) {
$bool = preg_match("~(matchA|matchB|matchC|matchD|matchE)~i",$key, $match);
}
$mtEnd = microtime(true);
echo "preg_match".PHP_EOL;
echo "Total time: ".($mtEnd-$mt).PHP_EOL;
echo "Average time: ".($mtEnd-$mt)/$ops.PHP_EOL;
}
Dies ist das Ergebnis, das ich bekam.
String veryshort
StrPos
Total time: 0.4722261428833
Average time: 4.722261428833E-7
preg_match
Total time: 0.39836096763611
Average time: 3.9836096763611E-7
String veryvertlongstringhereveryvertlongstringhereveryvertlongstringhereveryvertlongstringhereveryvertlongstringhereveryvertlongstringhere
StrPos
Total time: 0.49143600463867
Average time: 4.9143600463867E-7
preg_match
Total time: 0.4594030380249
Average time: 4.594030380249E-7
String shortstringwithmatchBintheresomewhere
StrPos
Total time: 0.21032190322876
Average time: 2.1032190322876E-7
preg_match
Total time: 0.6224000453949
Average time: 6.224000453949E-7
String 577625b20d9632.50190056577625b20d9798.81879058577625b20d97e6.80533504577625b20d97f9.27988846577625b20d9806.94313293577625b20d9803.05317354577625b20d9818.68372474577625b20d9818.19126932577625b20d9825.80344644
StrPos
Total time: 0.50694704055786
Average time: 5.0694704055786E-7
preg_match
Total time: 0.4893159866333
Average time: 4.893159866333E-7
Meine Interpretation ist, dass ein einzelnes preg_match
läuft schneller als mehrere Lauf strpos
wegen Funktionsaufruf Gemeinkosten und zusätzliche Vergleiche pro Funktion, dies jedoch nicht der Fall zu sein scheint, wenn es eine Übereinstimmung innerhalb Ihr String, vielleicht weil, wenn das passiert, der zugrundeliegende Regex-Zustandsautomat seinen Zustand ändert und (vermutlich) mehr Dinge tut.
Ich denke, die Antwort ist nicht so einfach wie "A ist schneller als B", sondern "greifen Sie diesen Code, setzen Sie Ihre üblichen Anwendungsfälle in und sehen, was für Ihren speziellen Fall besser ist".
Diese Frage eignet sich besser für Code Review Forum. http://codereview.stackexchange.com – Jeet
OK Danke - ich poste es dort auf. Danke – Tom
Ich denke, dass diese Frage auch auf SO gültig ist. – Eiko