Php性能测试(转载)

来自:http://maettig.com/code/php/php-performance-benchmarks.php (非永久链接)

关于php程序执行性能的一个测试,转载至此备查与学习。

My PHP Performance Benchmarks

PHP version 5.2.17 is running on this server. The benchmarks are done live. Reload the page to get fresh numbers. You are free to use the source for whatever you want. Giving credits to me (Thiemo Mättig) would be nice.

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.

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 133
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 >0 ms >0 ms 38 ms 43 ms 1380
if ("" == $var) 2 ms >0 ms >0 ms 1 ms >0 ms >0 ms >0 ms 5 ms 161
if ($var === "") 2 ms >0 ms >0 ms >0 ms >0 ms >0 ms >0 ms 3 ms 109
if ("" === $var) 2 ms >0 ms >0 ms >0 ms >0 ms >0 ms >0 ms 4 ms 119
if (strcmp($var, "") == 0) 4 ms 2 ms 2 ms 1 ms 1 ms 1 ms 1 ms 11 ms 367
if (strcmp("", $var) == 0) 3 ms 2 ms 2 ms 1 ms 1 ms 1 ms 1 ms 11 ms 361
if (strlen($var) == 0) 3 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 9 ms 294
if (!strlen($var)) 3 ms 1 ms 1 ms 1 ms 1 ms 1 ms 1 ms 9 ms 276

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.

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 10 ms 196
strcmp($a, $b) == 0 4 ms 4 ms 7 ms 14 ms 269
strcmp($a, $b) === 0 6 ms 5 ms 6 ms 18 ms 336
strcasecmp($a, $b) === 0 13 ms 4 ms 9 ms 26 ms 490

My conclusion: Use what fits your needs.

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 100
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 5 ms 113
stristr($haystack, $needle) 2 ms 2 ms 2 ms 2 ms 8 ms 203
preg_match("/$needle/", $haystack) 2 ms 2 ms 2 ms 2 ms 8 ms 190
preg_match("/$needle/i", $haystack) 2 ms 2 ms 2 ms 2 ms 8 ms 199
preg_match("/$needle/S", $haystack) 2 ms 2 ms 2 ms 2 ms 8 ms 195
ereg($needle, $haystack) 2 ms 2 ms 9 ms 16 ms 29 ms 714

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.

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 2 ms 2 ms 1 ms 6 ms 159
strncmp($haystack, "Test", 4) === 0 1 ms 1 ms 1 ms 1 ms 4 ms 101
strncasecmp($haystack, $needle, strlen($needle)) === 0 2 ms 2 ms 2 ms 1 ms 6 ms 166
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 169
strcmp(substr($haystack, 0, strlen($needle)), $needle) === 0 2 ms 2 ms 2 ms 2 ms 9 ms 242
preg_match("/^" . preg_quote($needle, "/") . "/", $haystack) 3 ms 3 ms 3 ms 3 ms 12 ms 318

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 127
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 140
preg_match("/" . preg_quote($needle, "/") . "$/", $haystack) 3 ms 4 ms 3 ms 3 ms 14 ms 222

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 12 ms 173
preg_replace("/$search/S", $replace, $subject) 3 ms 3 ms 3 ms 3 ms 12 ms 170
ereg_replace($search, $replace, $subject) 3 ms 6 ms 12 ms 18 ms 39 ms 536

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 29 ms 3725
preg_replace('/^,*|,*$/m', "", $string) 12 ms 12 ms 12 ms 12 ms 47 ms 6107
preg_replace('/^,+|,+$/', "", $string) >0 ms >0 ms >0 ms >0 ms 2 ms 234
preg_replace('/^,+|,+$/m', "", $string) >0 ms >0 ms >0 ms >0 ms 2 ms 230
preg_replace('/^,+/', "", preg_replace('/,+$/', "", …)) 1 ms 1 ms 1 ms 1 ms 3 ms 395

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 8 ms 10 ms 100
split(",", $string) 1 ms 2 ms 38 ms 41 ms 416
preg_split("/,/", $string) 2 ms 2 ms 12 ms 16 ms 160
preg_match_all('/[^,]+/', $string, $matches) 2 ms 3 ms 18 ms 24 ms 242

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++) 41 ms 5811
for ($i = 0, $count = count($array); $i < $count; $i++) 1 ms 144
for ($i = count($array) - 1; $i >= 0; $i--) 1 ms 135
for ($i = count($array) - 1; $i >= 0; --$i) 1 ms 133
$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 101
$array['key'] 33 ms 100

My conclusion: I like associative arrays.

Implode an Array

Method Summary Index
implode(" ", $array) 5 ms 100
"$array[0] $array[1] $array[2]" 5 ms 107
$array[0] . " " . $array[1] . " " . $array[2] 5 ms 104
sprintf("%s %s %s", $array[0], $array[1], $array[2]) 10 ms 207
vsprintf("%s %s %s", $array) 12 ms 251

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 104
"contains no dollar signs" 1 ms 100
'$variables $are $not $replaced' 1 ms 101
"\$variables \$are \$not \$replaced" 1 ms 103
"$variables $are $replaced" 7 ms 1222
$variables . ' ' . $are . ' ' . $replaced 9 ms 1501
$variables . " " . $are . " " . $replaced 9 ms 1530

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.

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇