こんばんは、martinです。ppBlogでは、「軽快な動作」を常に念頭において開発しています。PHPには、実に様々な関数が最初から提供されていて、似たような振る舞いをする関数も結構あります。なので、こういう場合は、それぞれの関数で処理時間を計測して、より処理速度が速いほうを採用するようにしていますが、最近、そんなやつをひとつ見つけました。
ppBlogでは、内部でいろんな配列が定義されていて、それを切ったり貼ったりして使用してます。その際に、配列の先頭の要素を取り出すという処理を至る所でしているのですが、これまではarray_shiftを用いていました(というかそれしか知らなかった)。
array_shift() は、array の最初の値を取り出して返します。配列 array は、要素一つ分だけ短くなり、全ての要素は前にずれます。 数値添字の配列のキーはゼロから順に新たに振りなおされますが、 リテラルのキーはそのままになります。
- 引用元: PHP: array_shift - Manual
上の赤字にあるように、元の配列を変えてしまうという点に留意していれば、便利な関数です。で、最近別の似た振る舞いをする関数を見つけました。
reset()関数です。
reset() は、array の内部ポインタの先頭の要素に戻し、配列の最初の要素の値を返します。
- 引用元: PHP: reset - Manual
何となく、内部ポインタを先頭に移すんだなという印象でファイルオープンfopen()などを使う場面ぐらいでしか使わないと思っていたのですが、その要素も返すんですね。
<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_shift($stack); // 結果はorange
// $stackはarray("banana", "apple", "raspberry")になる
?>
<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = reset($stack); // 結果はorange、$stackは元のまま
?>
さてどちらが処理速度が速いかというと、ローカルな環境(PHP5.2.9)では、実はそんなに変わりません。100万回の試行で、前者が3.4秒のところが後者のreset()関数だと3.2秒と、ちょっとだけ速いかなという感じです。でもタイピングも少なくて済むし、こういうのの積み重ねが大事なので、今後はreset()を使うようにしようと思います。余談ですが、ラズベリー(raspberry)の綴りはちょっと意外でした。
ここでひとつ押さえておくべきことは、上の
$stackの例のように、もし配列のキーが定義されていない、つまりキーインデックスがゼロから始まるような配列ならば、わざわざ関数を持ち出さなくても、
<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = $stack[0]; // 結果はorange、$stackは元のまま
?>
でこと足りるということです(これだと100万回の試行では2.4秒と最速)。これで済む場合はそうしますが、ppBlogの内部では、
Array
(
[3] => orange
[11] => banana
[23] => apple
[29] => raspberry
)
みたいに、キーの添え字にも意味がある処理が多いです。
PHP
Comments