forのなかでcountしてもあまり速度的に変わらないというお話。
なんかforの中でカウントしてるよーとか今日コードを眺めてて思っていた僕です。
あ、社会復帰記念に超どうでもいい技術ネタ書きます。
で、まあ実験用のスクリプトをこんな感じに用意します。
count.php
<?php
$max = [];
for( $i = 0; $i < 10000000; $i++ ) {
$max[] = true;
}
for ( $i < 0; $i < count($max); $i++ ) {}
で、計測します。
polidog$ time php count.php
php count.php 3.89s user 0.72s system 99% cpu 4.624 total
まあループの中でカウントしてるってどうなのよ?ってことでループの中でカウントしないコード書きました。
その1。
<?php
$max = [];
for( $i = 0; $i < 10000000; $i++ ) {
$max[] = true;
}
function counter() {
$count = 0;
return function($max) use ($count) {
if ($count == 0 ) {
$count = count($max);
}
return $count;
};
};
$counter = counter($max);
for ( $i < 0; $i < $counter($max); $i++ ) {}
で、実行。
polidog$ time php count2.php
php count2.php 3.76s user 0.73s system 99% cpu 4.489 total
おしゃれにクロージャ使うと若干早くなるみたいですねー。
その2。
<?php
$max = [];
for( $i = 0; $i < 10000000; $i++ ) {
$max[] = true;
}
$count = count($max);
for ( $i < 0; $i < $count; $i++ ) {}
で、実行
polidog$ time php count3.php
php count3.php 3.69s user 0.70s system 99% cpu 4.398 total
やっぱ普通に変数に代入するのがはやいですね。まあ微々たる物ですが、それでも速度を速くするという意味では、大量のループの際は変数に入れてあげる方がいいかもしれないです。
ほんとどうでもいいことですがw
※ただクロージャが書きたくなっただけです。
※そろそろサンプルコードはgistに移行したい。