PHP version 7.4.33 is running on this server.
Please note that these are micro benchmarks. Micro benchmarks are stupid. I created this comparison to learn something about PHP and how the PHP compiler works. This can not be used to compare PHP versions or servers.
Method | Undefined | Null | False | Empty string | String "0" | String "1" | Long string | Summary | Index |
---|---|---|---|---|---|---|---|---|---|
if ( ! $var ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 569 |
if (empty( $var) ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 238 |
if ( $var == "" ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 4 ms | 4 ms | 5226 |
if ( "" == $var ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 3 ms | 3 ms | 3599 |
if ( $var === "" ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 100 |
if ( "" === $var ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 101 |
if ( strcmp( $var, "" ) == 0 ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 370 |
if ( strcmp( "", $var ) == 0 ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 372 |
if ( strlen( $var ) == 0 ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 197 |
if ( ! strlen( $var ) ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 163 |
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.
Use strlen()
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.
Method | Equal | First character not equal | Last character not equal | Summary | Index |
---|---|---|---|---|---|
$a == $b | >0 ms | >0 ms | >0 ms | >0 ms | 100 |
!strcmp( $a, $b ) | >0 ms | >0 ms | >0 ms | >0 ms | 251 |
strcmp( $a, $b ) == 0 | >0 ms | >0 ms | >0 ms | >0 ms | 252 |
strcmp( $a, $b ) === 0 | >0 ms | >0 ms | >0 ms | >0 ms | 254 |
strcasecmp( $a, $b ) === 0 | >0 ms | >0 ms | >0 ms | 1 ms | 446 |
My conclusion: Use what fits your needs.
Method | Not found | Found at the start | Found in the middle | Found at the end | Summary | Index |
---|---|---|---|---|---|---|
strstr( $haystack, $needle ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 0 |
strpos( $haystack, $needle ) !== FALSE | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 0 |
strstr( $haystack, $needle ) !== FALSE | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 0 |
stristr( $haystack, $needle ) | >0 ms | >0 ms | >0 ms | >0 ms | 1 ms | 0 |
preg_match( "/$needle/", $haystack ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 0 |
preg_match( "/$needle/i", $haystack ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 0 |
preg_match( "/$needle/S", $haystack ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 0 |
Function ereg is deprecated since 5.3 | 0 ms | 0 ms | 0 ms | 0 ms | 0 ms | 0 |
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 the ereg…()
functions.
Method | Not found | Found at the start | Found in the middle | Found at the end | Summary | Index |
---|---|---|---|---|---|---|
strncmp( $haystack, $needle, strlen( $needle ) ) === 0 | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 113 |
strncmp( $haystack, $needle, 4 ) === 0 | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 100 |
strncasecmp( $haystack, $needle, strlen( $needle ) ) === 0 | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 111 |
strpos( $haystack, $needle ) === 0 | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 108 |
substr( $haystack, 0, strlen( $needle ) ) === $needle | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 126 |
strcmp( substr( $haystack, 0, strlen( $needle ) ), $needle ) === 0 | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 185 |
preg_match( "/^" . preg_quote( $needle, "/" ) . "/", $haystack ) | >0 ms | >0 ms | >0 ms | >0 ms | 1 ms | 395 |
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.
Method | Not found | Found at the start | Found in the middle | Found at the end | Summary | Index |
---|---|---|---|---|---|---|
substr( $haystack, strlen( $haystack ) - strlen( $needle) ) === $needle | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 105 |
substr( $haystack, -strlen( $needle) ) === $needle | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 100 |
strcmp( substr( $haystack, - strlen( $needle) ), $needle) === 0 | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 146 |
preg_match( "/" . preg_quote( $needle, "/" ) . "$/", $haystack ) | >0 ms | >0 ms | >0 ms | >0 ms | 1 ms | 346 |
My conclusion:
Using substr()
with a negative position is a good trick.
Method | Not found | Found at the start | Found in the middle | Found at the end | Summary | Index |
---|---|---|---|---|---|---|
str_replace( $search, $replace, $subject ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 28975 |
preg_replace( "/$search/", $replace, $subject ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 49150 |
preg_replace( "/$search/S", $replace, $subject ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 49150 |
Function ereg_replace is deprecated since 5.3 | 0 ms | 0 ms | >0 ms | 0 ms | >0 ms | 100 |
My conclusion:
Never use the ereg…()
functions.
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 | >0 ms | 100 |
preg_replace( '/^,*|,*$/', "", $string ) | >0 ms | >0 ms | >0 ms | >0 ms | 1 ms | 3383 |
preg_replace( '/^,*|,*$/m', "", $string ) | 1 ms | 1 ms | 1 ms | 1 ms | 4 ms | 22101 |
preg_replace( '/^,+|,+$/', "", $string ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 291 |
preg_replace( '/^,+|,+$/m', "", $string ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 316 |
preg_replace( '/^,+/', "", preg_replace( '/,+$/', "", … ) ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 469 |
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.
Method | Empty string | Single occurrence | Multiple occurrences | Summary | Index |
---|---|---|---|---|---|
explode( ",", $string ) | >0 ms | >0 ms | 1 ms | 1 ms | 76175 |
Function split is deprecated since 5.3 | 0 ms | 0 ms | >0 ms | >0 ms | 100 |
preg_split( "/,/", $string ) | >0 ms | >0 ms | 1 ms | 1 ms | 94825 |
preg_match_all( '/[^,]+/', $string, $matches ) | >0 ms | >0 ms | 1 ms | 1 ms | 145425 |
My conclusion:
Don't use split()
. It's deprecated in PHP 5.3 and will be removed in PHP 6.
Method | Summary | Index |
---|---|---|
for ( $i = 0; $i < count( $array ; $i++ ) | >0 ms | 170 |
for ( $i = 0, $count = count( $array ); $i < $count; $i++ ) | >0 ms | 100 |
for ( $i = count( $array ) - 1; $i >= 0; $i-- ) | >0 ms | 109 |
for ( $i = count( $array ) - 1; $i >= 0; --$i ) | >0 ms | 108 |
$i = count( $array ); while ( $i-- ) | >0 ms | 132 |
My conclusion:
count()
is horribly slow. Always precalculate it, if possible.
Method | Summary | Index |
---|---|---|
$array[0] | 1 ms | 101 |
$array['key'] | 1 ms | 100 |
My conclusion: I like associative arrays.
Method | Summary | Index |
---|---|---|
implode( " ", $array ) | >0 ms | 104 |
"$array[0] $array[1] $array[2]" | >0 ms | 103 |
$array[0] . " " . $array[1] . " " . $array[2] | >0 ms | 100 |
sprintf( "%s %s %s", $array[0], $array[1], $array[2] ) | >0 ms | 1729 |
vsprintf( "%s %s %s", $array ) | >0 ms | 1713 |
My conclusion: String concatenation is a cheap operation in PHP. Don't waste your time benchmarking this.
Method | Summary | Index |
---|---|---|
'contains no dollar signs' | >0 ms | 100 |
"contains no dollar signs" | >0 ms | 108 |
'$variables $are $not $replaced' | >0 ms | 100 |
"\$variables \$are \$not \$replaced" | >0 ms | 108 |
"$variables $are $replaced" | >0 ms | 110 |
$variables . ' ' . $are . ' ' . $replaced | >0 ms | 108 |
$variables . " " . $are . " " . $replaced | >0 ms | 100 |
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.