forのなかでcountしてもあまり速度的に変わらないというお話。

February 5, 2013,
tags: php


このエントリーをはてなブックマークに追加

なんか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に移行したい。

comments powered by Disqus