C++ 预处理器中的 #define
与其他语言中的定义变量不同。
PHP 中的 define()
和创建一个变量有什么不同?
define("SETTING", 0);
$something = SETTING;
vs
的翻译是对比
。$setting = 0;
$something = $setting;
C++ 预处理器中的 #define
与其他语言中的定义变量不同。
PHP 中的 define()
和创建一个变量有什么不同?
define("SETTING", 0);
$something = SETTING;
vs
的翻译是对比
。$setting = 0;
$something = $setting;
'define' 操作本身相当缓慢 —— 这一点已经得到了 xdebug 分析器的确认。
以下是来自 http://t3.dotgnu.info/blog/php/my-first-php-extension.html 的基准测试结果:
纯粹的 'define'
380.785 次每秒取值
14.2647 毫秒/首个响应平均时间
使用 'hidef' 扩展定义常量
930.783 次每秒取值
6.30279 毫秒/首个响应平均时间
链接失效更新
上面提到的博客文章已经从互联网上消失了。可以通过 Wayback Machine 查看。这里还有另一篇类似的文章。
作者引用的库可以在 这里(apc_define_constants) 和 这里(hidef 扩展) 找到。
php > $cat='';$f=microtime(1);$s='cowcow45';$i=9000;while ($i--){$cat.='plip'.$s.'cow';}echo microtime(1)-$f."\n";
0.00689506530762
php > $cat='';$f=microtime(1);define('s','cowcow45');$i=9000;while ($i--){$cat.='plip'.s.'cow';}echo microtime(1)-$f."\n";
0.00941896438599
这个结果可以重复出现并且结果相似。看起来常量的定义和/或使用比变量稍微慢一些。
看起来效率不高。(我基于php.net上的一条评论做出所有假设,我还没有进行自己的基准测试。)
调用常量将比调用变量需要多2倍的时间。
检查常量的存在需要2毫秒,对于错误的判断需要12毫秒!
以下是来自php在线文档define页面评论中的基准测试:
在使用defined()之前,请查看以下基准测试:
true 0.65ms
$true 0.69ms (1)
$config['true'] 0.87ms
TRUE_CONST 1.28ms (2)
true 0.65ms
defined('TRUE_CONST') 2.06ms (3)
defined('UNDEF_CONST') 12.34ms (4)
isset($config['def_key']) 0.91ms (5)
isset($config['undef_key']) 0.79ms
isset($empty_hash[$good_key]) 0.78ms
isset($small_hash[$good_key]) 0.86ms
isset($big_hash[$good_key]) 0.89ms
isset($small_hash[$bad_key]) 0.78ms
isset($big_hash[$bad_key]) 0.80ms
PHP版本为5.2.6,Apache 2.0,Windows XP。
每个语句执行1000次,虽然在1000个调用上的12ms开销不会让最终用户抓狂,但在与if(true)比较时,它确实显示出一些有趣的结果:
1)如果($true),几乎相同 2)如果(TRUE_CONST),几乎慢了一倍--我猜编译时没有进行替换(我必须再检查一下!)3)如果常量存在,则defined()慢了3倍4)如果常量不存在,则defined()慢了19倍5)无论你抛什么东西,isset()都非常高效(对于任何实现基于数组驱动事件系统的人来说是个好消息 - 比如我!)
可能要避免if(defined('DEBUG'))...
摘自tris+php@tfconsulting.com.au,2009年3月26日06:40
定义是简单的静态概念,意味着它的值在运行时不能被更改,而变量是动态概念,因为您可以在过程中自由地操作其值。
当我运行速度测试时,设置并转储的常量比设置变量并转储它们要快一些。
2020更新(PHP 7.2,AMD Ryzen9,启用Zend OpCache)
总结:重新定义相同的常量会很慢。与$_GLOBALS比较和定义常量大约慢8倍,检查未定义的常量略慢。 不要使用全局变量。
代码:
$loops = 90000;
$m0 = microtime(true);
for ($i=0; $i<$loops; $i++) {
define("FOO$i", true);
}
$m1 = microtime(true);
echo "Define new const {$loops}s: (" . ($m1-$m0) . ")\n";
// etc...
输出:
Define new const 90000s: (0.012847185134888)
Define same const 90000s: (0.89289903640747)
Define same super global 90000s: (0.0010528564453125)
Define new super global 90000s: (0.0080759525299072)
check same undefined 90000s: (0.0021710395812988)
check same defined 90000s: (0.00087404251098633)
check different defined 90000s: (0.0076708793640137)
主要区别:
不确定效率如何,但它比创建一个变量更好:
$something = 0;
在性能上等效于PHP(添加一个注释来描述该值)。不幸的是,这通常是最好的选择 - 这就是C++预处理器在幕后为您完成的工作。 - Abhi Beckert