PHP version 7.4.28 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 ) | 2 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 3 ms | 767 |
if (empty( $var) ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 1 ms | 223 |
if ( $var == "" ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 24 ms | 25 ms | 7180 |
if ( "" == $var ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 13 ms | 14 ms | 4059 |
if ( $var === "" ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 109 |
if ( "" === $var ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 108 |
if ( strcmp( $var, "" ) == 0 ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 1 ms | 269 |
if ( strcmp( "", $var ) == 0 ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 1 ms | 268 |
if ( strlen( $var ) == 0 ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 125 |
if ( ! strlen( $var ) ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 100 |
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 | 1 ms | 179 |
strcmp( $a, $b ) == 0 | >0 ms | >0 ms | >0 ms | 1 ms | 178 |
strcmp( $a, $b ) === 0 | >0 ms | >0 ms | >0 ms | 1 ms | 175 |
strcasecmp( $a, $b ) === 0 | >0 ms | >0 ms | 1 ms | 2 ms | 357 |
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 | 14608 |
strpos( $haystack, $needle ) !== FALSE | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 12658 |
strstr( $haystack, $needle ) !== FALSE | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 15983 |
stristr( $haystack, $needle ) | >0 ms | >0 ms | >0 ms | >0 ms | 2 ms | 60917 |
preg_match( "/$needle/", $haystack ) | >0 ms | >0 ms | >0 ms | >0 ms | 1 ms | 26483 |
preg_match( "/$needle/i", $haystack ) | >0 ms | >0 ms | >0 ms | >0 ms | 1 ms | 25558 |
preg_match( "/$needle/S", $haystack ) | >0 ms | >0 ms | >0 ms | >0 ms | 1 ms | 21917 |
Function ereg is deprecated since 5.3 | 0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 100 |
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 | 109 |
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 | 100 |
strpos( $haystack, $needle ) === 0 | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 109 |
substr( $haystack, 0, strlen( $needle ) ) === $needle | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 127 |
strcmp( substr( $haystack, 0, strlen( $needle ) ), $needle ) === 0 | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 194 |
preg_match( "/^" . preg_quote( $needle, "/" ) . "/", $haystack ) | >0 ms | >0 ms | >0 ms | >0 ms | 1 ms | 448 |
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 | 100 |
substr( $haystack, -strlen( $needle) ) === $needle | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 101 |
strcmp( substr( $haystack, - strlen( $needle) ), $needle) === 0 | >0 ms | >0 ms | >0 ms | >0 ms | 1 ms | 154 |
preg_match( "/" . preg_quote( $needle, "/" ) . "$/", $haystack ) | >0 ms | >0 ms | >0 ms | >0 ms | 1 ms | 347 |
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 | 1 ms | 13113 |
preg_replace( "/$search/", $replace, $subject ) | >0 ms | >0 ms | >0 ms | >0 ms | 1 ms | 25344 |
preg_replace( "/$search/S", $replace, $subject ) | >0 ms | >0 ms | >0 ms | >0 ms | 1 ms | 24119 |
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 | 2 ms | 5424 |
preg_replace( '/^,*|,*$/m', "", $string ) | 2 ms | 2 ms | 2 ms | 2 ms | 6 ms | 22104 |
preg_replace( '/^,+|,+$/', "", $string ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 293 |
preg_replace( '/^,+|,+$/m', "", $string ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 348 |
preg_replace( '/^,+/', "", preg_replace( '/,+$/', "", … ) ) | >0 ms | >0 ms | >0 ms | >0 ms | >0 ms | 540 |
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 | 82325 |
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 | 2 ms | 169475 |
preg_match_all( '/[^,]+/', $string, $matches ) | >0 ms | >0 ms | 2 ms | 2 ms | 255400 |
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 | 222 |
for ( $i = 0, $count = count( $array ); $i < $count; $i++ ) | >0 ms | 100 |
for ( $i = count( $array ) - 1; $i >= 0; $i-- ) | >0 ms | 105 |
for ( $i = count( $array ) - 1; $i >= 0; --$i ) | >0 ms | 105 |
$i = count( $array ); while ( $i-- ) | >0 ms | 139 |
My conclusion:
count()
is horribly slow. Always precalculate it, if possible.
Method | Summary | Index |
---|---|---|
$array[0] | 2 ms | 104 |
$array['key'] | 2 ms | 100 |
My conclusion: I like associative arrays.
Method | Summary | Index |
---|---|---|
implode( " ", $array ) | >0 ms | 102 |
"$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] ) | 1 ms | 1743 |
vsprintf( "%s %s %s", $array ) | 1 ms | 2004 |
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 | 101 |
'$variables $are $not $replaced' | >0 ms | 101 |
"\$variables \$are \$not \$replaced" | >0 ms | 101 |
"$variables $are $replaced" | >0 ms | 101 |
$variables . ' ' . $are . ' ' . $replaced | >0 ms | 101 |
$variables . " " . $are . " " . $replaced | >0 ms | 101 |
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.