My PHP Performance Benchmarks

PHP version 5.2.13 is running on this server.

Check if a String is empty

Method Undefined Null False Empty string String "0" String "1" Long string Summary Index
if (!$var) 2 ms >0 ms >0 ms >0 ms >0 ms >0 ms >0 ms 4 ms 132
if (empty($var)) >0 ms 1 ms 1 ms 1 ms 1 ms >0 ms >0 ms 3 ms 100
if ($var == "") 2 ms >0 ms >0 ms 1 ms 1 ms 1 ms 38 ms 43 ms 1376
if ("" == $var) 2 ms >0 ms >0 ms 1 ms >0 ms >0 ms >0 ms 5 ms 151
if ($var === "") 2 ms >0 ms >0 ms >0 ms >0 ms >0 ms >0 ms 3 ms 107
if ("" === $var) 2 ms >0 ms >0 ms >0 ms >0 ms >0 ms >0 ms 3 ms 107
if (strcmp($var, "") == 0) 3 ms 2 ms 2 ms 1 ms 1 ms 1 ms 1 ms 12 ms 375
if (strcmp("", $var) == 0) 4 ms 2 ms 2 ms 1 ms 1 ms 1 ms 1 ms 12 ms 375
if (strlen($var) == 0) 3 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 9 ms 287
if (!strlen($var)) 3 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 8 ms 270

My conclusion: In most cases, use empty() because it does not trigger a warning when used with undefined variables. Note that empty("0") returns true. Usestrlen() if you want to detect "0". Try to avoid == at all because it may cause strange behaviour (e.g. "9a" == 9 returns true). Prefer === over == and !== over != if possible because it does compare the variable types in addition to the contents.

Compare two Strings

Method Equal First character not equal Last character not equal Summary Index
$a == $b 2 ms 1 ms 2 ms 5 ms 100
!strcmp($a, $b) 4 ms 3 ms 4 ms 11 ms 202
strcmp($a, $b) == 0 4 ms 3 ms 4 ms 11 ms 215
strcmp($a, $b) === 0 4 ms 3 ms 4 ms 11 ms 202
strcasecmp($a, $b) === 0 8 ms 3 ms 8 ms 19 ms 353

My conclusion: ?

Check if a String contains another String

Method Not found Found at the start Found in the middle Found at the end Summary Index
strstr($haystack, $needle) 1 ms 1 ms 1 ms 1 ms 4 ms 101
strpos($haystack, $needle) !== false 1 ms 1 ms 1 ms 1 ms 4 ms 100
strstr($haystack, $needle) !== false 1 ms 1 ms 1 ms 1 ms 4 ms 109
stristr($haystack, $needle) 2 ms 2 ms 2 ms 2 ms 8 ms 196
preg_match("/$needle/", $haystack) 2 ms 2 ms 2 ms 2 ms 8 ms 203
preg_match("/$needle/i", $haystack) 2 ms 2 ms 2 ms 2 ms 8 ms 205
preg_match("/$needle/S", $haystack) 2 ms 2 ms 2 ms 2 ms 8 ms 203
ereg($needle, $haystack) 2 ms 2 ms 9 ms 17 ms 31 ms 752

My conclusion: It does not matter if you use strstr() or strpos(). Use the preg…() functions only if you need the power of regular expressions. Never use theereg…() functions.

Check if a String starts with another String

Method Not found Found at the start Found in the middle Found at the end Summary Index
strncmp($haystack, $needle, strlen($needle)) === 0 1 ms 1 ms 1 ms 1 ms 6 ms 148
strncmp($haystack, "Test", 4) === 0 1 ms 1 ms 1 ms 1 ms 4 ms 100
strncasecmp($haystack, $needle, strlen($needle)) === 0 1 ms 1 ms 1 ms 1 ms 6 ms 144
strpos($haystack, $needle) === 0 1 ms 1 ms 1 ms 1 ms 4 ms 100
substr($haystack, 0, strlen($needle)) === $needle 2 ms 2 ms 2 ms 2 ms 6 ms 163
strcmp(substr($haystack, 0, strlen($needle)), $needle) === 0 2 ms 2 ms 2 ms 2 ms 9 ms 232
preg_match("/^" . preg_quote($needle, "/") . "/", $haystack) 3 ms 3 ms 3 ms 3 ms 12 ms 325

My conclusion: strpos() is very fast and can be used in almost all cases. strncmp() is good if you are looking for a constant length needle.

Check if a String ends with another String

Method Not found Found at the start Found in the middle Found at the end Summary Index
substr($haystack, strlen($haystack) - strlen($needle)) === $needle 2 ms 2 ms 2 ms 2 ms 8 ms 134
substr($haystack, -strlen($needle)) === $needle 2 ms 2 ms 2 ms 2 ms 6 ms 100
strcmp(substr($haystack, -strlen($needle)), $needle) === 0 2 ms 2 ms 2 ms 2 ms 9 ms 144
preg_match("/" . preg_quote($needle, "/") . "$/", $haystack) 3 ms 4 ms 4 ms 4 ms 14 ms 226

My conclusion: Using substr() with a negative position is a good trick.

Replace a String inside another String

Method Not found Found at the start Found in the middle Found at the end Summary Index
str_replace($search, $replace, $subject) 2 ms 2 ms 2 ms 2 ms 7 ms 100
preg_replace("/$search/", $replace, $subject) 3 ms 3 ms 3 ms 3 ms 13 ms 185
preg_replace("/$search/S", $replace, $subject) 3 ms 3 ms 3 ms 3 ms 13 ms 183
ereg_replace($search, $replace, $subject) 3 ms 6 ms 12 ms 19 ms 41 ms 571

My conclusion: Never use the ereg…() functions.

Trim Characters from the Beginning and End of a String

Method Not found Found at start Found at end Found at both sides Summary Index
trim($string, ",") >0 ms >0 ms >0 ms >0 ms 1 ms 100
preg_replace('/^,*|,*$/', "", $string) 7 ms 7 ms 7 ms 7 ms 27 ms 3754
preg_replace('/^,*|,*$/m', "", $string) 11 ms 11 ms 11 ms 11 ms 45 ms 6132
preg_replace('/^,+|,+$/', "", $string) >0 ms >0 ms >0 ms >0 ms 2 ms 259
preg_replace('/^,+|,+$/m', "", $string) >0 ms >0 ms >0 ms >0 ms 2 ms 249
preg_replace('/^,+/', "", preg_replace('/,+$/', "", …)) 1 ms 1 ms 1 ms 1 ms 3 ms 424

My conclusion: Always benchmark your regular expressions! In this case, with .* you also replace nothing with nothing which takes time because there is a lot of “nothing” in every string.

Split a String into an Array

Method Empty string Single occurrence Multiple occurrences Summary Index
explode(",", $string) 1 ms 1 ms 7 ms 10 ms 100
split(",", $string) 1 ms 2 ms 40 ms 43 ms 452
preg_split("/,/", $string) 2 ms 2 ms 11 ms 15 ms 152
preg_match_all('/[^,]+/', $string, $matches) 2 ms 4 ms 19 ms 24 ms 255

My conclusion: Don't use split(). It's deprecated in PHP 5.3 and will be removed in PHP 6.

Loop a numerical indexed Array of Strings

Method Summary Index
for ($i = 0; $i < count($array); $i++) 42 ms 5895
for ($i = 0, $count = count($array); $i < $count; $i++) 1 ms 140
for ($i = count($array) - 1; $i >= 0; $i--) 1 ms 158
for ($i = count($array) - 1; $i >= 0; --$i) 1 ms 154
$i = count($array); while ($i--) 1 ms 100

My conclusion: count() is horribly slow. Always precalculate it, if possible.

Get Elements from an Array

Method Summary Index
$array[0] 33 ms 100
$array['key'] 33 ms 100

My conclusion: I like associative arrays.

Implode an Array

Method Summary Index
implode(" ", $array) 5 ms 107
"$array[0] $array[1] $array[2]" 4 ms 100
$array[0] . " " . $array[1] . " " . $array[2] 5 ms 108
sprintf("%s %s %s", $array[0], $array[1], $array[2]) 10 ms 219
vsprintf("%s %s %s", $array) 11 ms 256

My conclusion: String concatenation is a cheap operation in PHP. Don't waste your time benchmarking this.

The single vs. double Quotes Myth

Method Summary Index
'contains no dollar signs' 1 ms 102
"contains no dollar signs" 1 ms 101
'$variables $are $not $replaced' 1 ms 101
"\$variables \$are \$not \$replaced" 1 ms 100
"$variables $are $replaced" 8 ms 1314
$variables . ' ' . $are . ' ' . $replaced 8 ms 1458
$variables . " " . $are . " " . $replaced 8 ms 1442

My conclusion: It does not matter if you use single or double quotes at all. The inclusion of variables has a measurable effect, but that's independent from the quotes.

© Thiemo Mättig, created in September 2008, updated in March 2010
More PHP experiments »
PHP语言本身特性性能测试My PHP Performance Benchmarks
标签: