After some reading, writing and testing I got something:
function inc(&$var){
if (isset($var)) $var++;else $var=1;
}
and thought I struck gold, but let's see the tests first...
Test code:
$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]);
Execution times: (for informative purposes only)
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)
Conclusions:
@
is of course the fastest to type and I don't see any problem in using it in this case but feel free to check this question also: Suppress error with @ operator in PHP
- completely suppressing errors (before the loop and enabling errors after the loop) via
ini_set()
is worse than all on performance
inc()
looks nice and clean, easy to type and does checking instead of suppressing, but calling it looks to be even slower than @
isset()
is slightly faster than empty()
, but both perform fairly the same
- interestingly using shorthand
if
statements is slightly slower!
- best results achieved when pre-filling the array. Even if length is unknown a good prediction would be still slightly faster on a huge dataset
- strangely,
array_fill()
takes slightly longer than for
?!?!
RFC
I don't consider this answer 100% complete, although, for now it looks like isset()
is the fastest and @
the laziest.
Any comments and ideas are appreciated!