您可以使用以下内容对其进行测试。
请注意,PHP 进行了很多优化,并将编译后的字节码存储在其缓存中。
http://php.net/manual/en/intro.opcache.php
结果
字符串
0.38328790664673
持续的
0.50211310386658
字符串
0.38391804695129
持续的
0.51568698883057
令我惊讶的是,String 似乎更快。
我在 opcache 配置中记录了以下设置:
opcache.interned_strings_buffer integer
The amount of memory used to store interned strings, in megabytes.
This configuration directive is ignored in PHP < 5.3.0.
一个非常简洁的设置,类似 0 文档。 PHP 使用一种称为字符串实习的技术来提高性能,例如,如果您的代码中有 1000 次字符串“foobar”,那么 PHP 会在内部为该字符串存储 1 个不可变变量,并为其他 999 使用指向它的指针您使用它的次数。凉爽的。此设置使其更上一层楼。而不是为每个 SINGLE php-fpm 进程拥有这些不可变字符串的池,此设置在所有 php-fpm 进程之间共享它。它可以节省内存并提高性能,尤其是在大型应用程序中。
所以说字符串比较比常量比较慢是 PHP 中的错误假设。
但是:您可以打破这个优化示例:
$state = "State";
switch($string) {
case "Offline" . $state:
break;
}
这样做的结果将是:
字符串 0.61401081085205 常量 0.51961803436279
在这种情况下,常量比较会更快。
添加到 PHP5.4 的性能改进,这里是 RFC
https://wiki.php.net/rfc/performanceimprovements
但请注意,常量通常有助于更好地重构代码,从而更好地维护。此外,性能损失可以忽略不计
function doSomethingString() {
return "OfflineState";
}
const OFFLINE_STATE = 1;
function doSomethingConstant() {
return OFFLINE_STATE;
}
function dummy() {}
// String
echo('string' . PHP_EOL);
$start = microtime(true);
for($i = 0; $i < 10000000; $i++) {
switch(doSomethingString()) {
case "OfflineState":
dummy();
break;
}
}
echo(PHP_EOL);
$end = microtime(true);
echo($end - $start);
echo(PHP_EOL);
//Constant
echo('constant' . PHP_EOL);
$start = microtime(true);
for($i = 0; $i < 10000000; $i++) {
switch(doSomethingConstant()) {
case OFFLINE_STATE:
dummy();
break;
}
}
echo(PHP_EOL);
$end = microtime(true);
echo($end - $start);
echo(PHP_EOL);
我的php版本:
PHP 7.2.8-1+ubuntu18.04.1+deb.sury.org+1 (cli) (built: Jul 25 2018 10:52:19) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.8-1+ubuntu18.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies