スポンサーリンク

2008/01/31 修正。ソースが間違っていたので、測定からやり直しました。

プログラムを書いていると、こうするとパフォーマンスがよくなるから、なんてことを思いながら、コーディングしていたりします。PHPでもそれは同じことです。

PHPの本でこんな風に書いてあったら、その本は投げましょう。
<?php
for ( $i = 0; $i < count($array); ++$i){
	doit($array[$i]);
}
?>

for文の構文は、C言語などと同じです。
for (式1; 式2; 式3) {
	文
}

  • 式1の評価は一度だけ、です。
  • 式2、式3の評価は、ループするだけ評価(実行)されます。
つまり、この式が何度も評価(実行)されます。

$i < count($array)

10回ループすれば、count($array)が10回実行されます。PHPは、何も考えず、10回実行してくれます。

さて、どうするのがいいのか?というと、for文の式にcount()を書かずに、for文の前でcount()を計算してあげます。
つまり、こうなります。

<?php
$count=count($array);
for ( $i = 0; $i < $count; ++$i){
	doit($array[$i]);
}
?>

実際にベンチマークを取ってみます。
<?php

include ('Benchmark/Timer.php');

function generate_random_array ($max) {
	$array = array ();
	while ($max-- > 0) {
		$array[] = rand (1, 655535);
	}
	return ($array);
}

function for_without_count ( $array ) {
	$count = count ($array);
	$x = 0;
	for ($i = 0; $i < $count; ++$i) {
		$x += $array[$i];
	}
}

function for_with_count ( $array ) {
	for ($i = 0; $i < count($array); ++$i) {
		$x += $array[$i];
	}
}

$num = 1000;

$array = generate_random_array ( $num );

$oTimer =& new Benchmark_Timer();
$oTimer->start ();
for_with_count ($array);
$oTimer->setMarker( 'with' );
for_without_count ($array);
$oTimer->setMarker( 'without' );
$oTimer->stop ();
$oTimer->display ();

?>

arrayが1000個のとき。
約3倍程度の実行スピード差があります。

------------------------------------------------------
marker    time index            ex time         perct
------------------------------------------------------
Start     1201714387.27995700   -                0.00%
------------------------------------------------------
with      1201714387.28164600   0.001689        71.45%
------------------------------------------------------
without   1201714387.28229200   0.000646        27.33%
------------------------------------------------------
Stop      1201714387.28232100   0.000029         1.23%
------------------------------------------------------
total     -                     0.002364       100.00%
------------------------------------------------------

arrayが2000個のとき。
3倍ぐらい違います。

------------------------------------------------------
marker    time index            ex time         perct
------------------------------------------------------
Start     1201714428.51908800   -                0.00%
------------------------------------------------------
with      1201714428.52260800   0.003520        69.13%
------------------------------------------------------
without   1201714428.52411000   0.001502        29.50%
------------------------------------------------------
Stop      1201714428.52418000   0.000070         1.37%
------------------------------------------------------
total     -                     0.005092       100.00%
------------------------------------------------------

arrayが5000個のとき。
2倍程度違います。
------------------------------------------------------
marker    time index            ex time         perct
------------------------------------------------------
Start     1201714444.30703500   -                0.00%
------------------------------------------------------
with      1201714444.31607100   0.009036        62.85%
------------------------------------------------------
without   1201714444.32128500   0.005214        36.27%
------------------------------------------------------
Stop      1201714444.32141200   0.000127         0.88%
------------------------------------------------------
total     -                     0.014377       100.00%
------------------------------------------------------

arrayが10000個のとき。
実行スピードの差が2倍以下になってきました。
------------------------------------------------------
marker    time index            ex time         perct
------------------------------------------------------
Start     1201714471.39839600   -                0.00%
------------------------------------------------------
with      1201714471.41632200   0.017926        63.66%
------------------------------------------------------
without   1201714471.42642200   0.010100        35.87%
------------------------------------------------------
Stop      1201714471.42655400   0.000132         0.47%
------------------------------------------------------
total     -                     0.028158       100.00%
------------------------------------------------------


というわけで、少しでもPHPのパフォーマンス改善のためのオプティマイズ(最適化)を行いたい人は、for文とcount()に気をつけましょう。

ただし、forの本体部分で $array の大きさが変わってしまう場合で、実行結果が自体が変わってしまっているので、注意が必要です。

<?php
$array = array (
		1,
		2,
		3,
		4
	       );
for($i = 0; $i < count($array); ++$i) {
	echo $i, PHP_EOL;
	array_pop($array);
}
?>
参照しているページ (サイト内): [2008-01-31-1]

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

はてなの人気のブックマーク

スポンサーリンク
 

過去ログ

2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー