在优化一个 PHP 函数时,我进行了修改
if(is_array($obj)) foreach($obj as $key=>$value { [snip] }
else if(is_object($obj)) foreach($obj as $key=>$value { [snip] }
if($obj == (array) $obj) foreach($obj as $key=>$value { [snip] }
else if($obj == (obj) $obj) foreach($obj as $key=>$value { [snip] }
在学习了 ===
后,我将其改为
if($obj === (array) $obj) foreach($obj as $key=>$value { [snip] }
else if($obj === (obj) $obj) foreach($obj as $key=>$value { [snip] }
将每个测试从is_*更改为转换类型可以大大提高速度(>30%)。
我理解 === 比 == 更快,因为不需要做强制转换,但是为什么将变量转换类型会比调用任何is_*函数都快这么多呢?
编辑: 由于每个人都在问正确性,我写了这个小测试:
$foo=(object) array('bar'=>'foo');
$bar=array('bar'=>'foo');
if($foo===(array) $foo) echo '$foo is an array?';
if($bar===(object) $bar) echo '$bar is an object?';
它并没有打印出任何错误,两个变量都没有改变,所以我认为它是有效的,但我准备接受其他说法。
另一个编辑:
Artefacto的程序给了我以下数字:PHP 5.3.2-1ubuntu4.2(64位)在Core i5-750上使用Xdebug Elapsed (1): 0.46174287796021 / 0.28902506828308 Elapsed (2): 0.52625703811646 / 0.3072669506073 Elapsed (3): 0.57169318199158 / 0.12708187103271 Elapsed (4): 0.51496887207031 / 0.30524897575378 猜想:强制类型转换和比较可以快1.7-4倍。
PHP 5.3.2-1ubuntu4.2(64位)在不使用Xdebug的Core i5-750上 Elapsed (1): 0.15818405151367 / 0.214271068573 Elapsed (2): 0.1531388759613 / 0.25853085517883 Elapsed (3): 0.16164898872375 / 0.074632883071899 Elapsed (4): 0.14408397674561 / 0.25812387466431 没有使用Xdebug,额外的函数调用就不再重要了,因此每个测试(除了第3个)都运行得更快。
PHP 5.3.2-1ubuntu4.2在Pentium M 1.6GHz上 Elapsed (1): 0.97393798828125 / 0.9062979221344 Elapsed (2): 0.39448714256287 / 0.86932587623596 Elapsed (3): 0.44513893127441 / 0.23662400245667 Elapsed (4): 0.38685202598572 / 0.82854390144348 猜想:转换数组更慢,转换对象可能更快,但可能不会更慢。
PHP 5.2.6-1+lenny8在Xeon 5110上 Elapsed (1): 0.273758888245 / 0.530702114105 Elapsed (2): 0.276469945908 / 0.605964899063 Elapsed (3): 0.332523107529 / 0.137730836868 Elapsed (4): 0.267735004425 / 0.556323766708 猜想:这些结果与Artefacto的结果类似,我认为这是PHP 5.2。 解决方案: 我使用的分析工具(Xdebug)使函数调用变慢了约3倍(即使不进行分析),但并没有明显影响强制类型转换和比较,因此强制类型转换和比较似乎更快,尽管它只是没有受到调试器/分析器的影响。
$obj
是一个对象,is_array($obj)
返回false
,但是可能会出现($obj == (array) $obj)
评估为true
的情况。 - Artefactois_array($obj) === false
意味着($obj == (array) $obj) === true
。(我在谈论==
) - Artefacto