読んで、書いて、テストした後、私は何かを得ました:
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)
結論:
@
もちろん、入力するのが最速であり、この場合に使用しても問題はありませんが、この質問もお気軽に確認してください: PHP で @ 演算子を使用してエラーを抑制します。
- エラーを完全に抑制 (ループの前とループの後にエラーを有効にする)
ini_set()
は、すべてのパフォーマンスよりも悪い
inc()
見栄えがよく、きれいで、入力が簡単で、抑制ではなくチェックを行いますが、それを呼び出すと、@
isset()
は よりわずかに高速ですempty()
が、どちらもほぼ同じ性能を発揮します
- 興味深いことに、短縮
if
ステートメントを使用すると少し遅くなります。
- 配列を事前に入力すると、最良の結果が得られます。長さが不明な場合でも、巨大なデータセットでは適切な予測がわずかに高速になります
- 奇妙なことに、?!?!
array_fill()
よりも少し時間がかかります。for
RFC
この回答が 100% 完了したとは考えていませんが、現時点でisset()
は最速で最も@
怠惰なようです。
コメントやアイデアは大歓迎です!