经过一些阅读、写作和测试,我得到了一些东西:
function inc(&$var){
if (isset($var)) $var++;else $var=1;
}
并以为我找到了金子,但让我们先看看测试......
测试代码:
$a=array();
// Pre-Fill array code goes here
for($i=1;$i<100000;$i++) {
$r=rand(1,30000);
//increment code goes here
}
// Remove extra keys from array with:
//foreach ($a as $k=>$v) if ($v==0) unset($a[$k]);
执行时间:(仅供参考)
inc($a[$r]) 1.15-1.24
@$a[$r]++ 1.03-1.09
$a[$r]=array_key_exists($r,$a)?$a[$r]++:1; 0.99-1.04
$a[$r]=!empty($a[$r])?$a[$r]++:1; 0.61-0.74
if (!empty($a[$r])) $a[$r]++;else $a[$r]=1; 0.59-0.67
$a[$r]=isset($a[$r])?$a[$r]++:1; 0.57-0.65
if (isset($a[$r])) $a[$r]++;else $a[$r]=1; 0.56-0.64
//with pre-fill
$a=array_fill(0,30000,0); +0.07(avg)
for($i=1;$i<=30000;$a[$i++]=0); -0.04(avg)
//with pre-fill and unset
$a=array_fill(0,45000,0); +0.16(avg)
for($i=1;$i<=45000;$a[$i++]=0); +0.02(avg)
结论:
@
当然是最快的类型,我认为在这种情况下使用它没有任何问题,但也可以随意检查这个问题:Suppress error with @ operator in PHP
- 完全抑制错误(在循环之前并在循环之后启用错误)通过
ini_set()
比所有性能都差
inc()
看起来漂亮干净,易于键入并且会检查而不是抑制,但调用它看起来甚至比@
isset()
比 略快empty()
,但两者的表现相当
- 有趣的是,使用速记
if
语句稍慢!
- 预填充阵列时获得的最佳结果。即使长度未知,一个好的预测在巨大的数据集上仍然会稍微快一些
- 奇怪的是,
array_fill()
需要的时间比for
?!?!
RFC
我不认为这个答案是 100% 完整的,虽然,现在它看起来isset()
是最快和@
最懒惰的。
任何意见和想法表示赞赏!