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 2010More PHP experiments »