How efficient is define in PHP?
C++预处理器EDCOX1,0,完全不同。
php
1 2 |
VS
1 2 | $setting = 0; $something = $setting; |
"define"操作本身相当慢-由xdebug profiler确认。
以下是http://t3.dotgnu.info/blog/php/my-first-php-extension.html中的基准:
纯"定义"380.785次回迁/秒14.2647平均毫秒/第一反应
用"hidef"扩展名定义的常量930.783次回迁/秒6.30279平均毫秒/第一反应
断开链接更新
上面提到的博客文章已经离开了互联网。它仍然可以在这里通过折返机查看。这是另一篇相似的文章。
作者引用的库可以在这里(apc_define_constants)和这里(hidef extension)找到。
1 2 |
0.00689506530762
1 2 |
0.00941896438599
这是可重复的,结果相似。在我看来,常数的定义和/或使用速度比变量慢一些。
一般来说,常数的概念是常数(听起来很有趣,对吧?;)在程序内部。这意味着编译器(解释器)将在整个脚本中用foobar的值替换"foobar"。
如果你编译的话,这对于理论和优势来说是如此的重要。现在,php是非常动态的,在大多数情况下,您不会注意到不同的地方,因为php脚本是用每次运行编译的。afai可以告诉您,除非使用字节代码缓存(如apc、zend优化器或eaccelerator),否则不应该看到常量和变量之间速度的显著差异。那就有意义了。
这里已经指出了常量的所有其他优点/缺点,可以在PHP手册中找到。
以下是与手册的区别
- 常量前面没有美元符号($)。
- 常量只能使用define()函数来定义,而不能通过简单的赋值来定义;
- 常量可以在任何地方定义和访问,而不考虑变量范围规则;
- 常量一旦被设置,就不能被重新定义或未定义;以及
- 常量只能计算为标量值。
对我来说,主要的好处是全球范围。我当然不担心它们的效率——只要您需要一个不可更改的全局标量值,就可以使用它们。
看起来效率不高。(我把这里所有的假设都建立在php.net的一条评论之上,我自己还没有做基准测试。)
调用常量,将花费调用变量的2倍时间。
检查常数的存在需要2毫秒和12毫秒的假阳性!
下面是来自php在线文档中define页面注释的一个基准。
Before using defined() have a look at the following benchmarks:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 Version 5.2.6, Apache 2.0, Windows XP
Each statement was executed 1000 times and while a 12ms overhead on
1000 calls isn't going to have the end users tearing their hair out,
it does throw up some interesting results when comparing to if(true):1) if($true) was virtually identical 2) if(TRUE_CONST) was almost
twice as slow - I guess that the substitution isn't done at compile
time (I had to double check this one!) 3) defined() is 3 times slower
if the constant exists 4) defined() is 19 TIMES SLOWER if the
constant doesn't exist! 5) isset() is remarkably efficient regardless
of what you throw at it (great news for anyone implementing array
driven event systems - me!)May want to avoid if(defined('DEBUG'))...
来自Tris+PHP,地址:tfconsulting dot com dot au 26-mar-2009 06:40
http://us.php.net/manual/en/function.defined.php_89886
define是简单的静态意义,这意味着它的值在运行时不能更改,而变量是动态意义,因为您可以在过程中自由地操纵它的值。
当我运行速度测试时,被设置和转储的常量比设置变量和将其转储快得多。
主要区别:
- define是常量,variable是变量
- 它们的范围/可见性不同
不确定效率,但它不仅仅是创建一个VaR:
- 它是一个常量:不能重新定义或重新分配此设置。
- 如果找不到定义,$something设置为"setting",这很有用,例如在i18n中:如果缺少翻译(即对应的定义是本地化文件),我们会看到一个大写的大字,非常明显…