PHP Note
category: 実験・実測 関数の値渡しと参照渡しどちらが速い? MySQL4.1のインストール

forループとwhileループどちらが速い?

created: 2003-01-18 | modified: 2003-01-18

ループでは forwhile をよく使いますが、どちらがどのくらい速いのか確かめてみたいと思います。聞いたところによると whileループ の方がわずかに速いらしいのですが、あえて確かめるのがこのコーナーの趣旨ですので。


テストコード

こんなコードで試してみました。

<?php
$time1;         // 測定開始時間
$time2;         // 測定終了時間
$timeF;         // forループの実行時間
$timeW;         // whileループの実行時間
$ritu;          // forとwhileの実行時間の差(%)
$count = 1000;  // 繰り返す回数

// 現在の時間をマイクロ秒単位で返す関数
function getmicrotime(){
    list($msec, $sec) = explode(" ", microtime());
    return ((float)$sec + (float)$msec);
}

// forループの実行時間測定
$time1 = getmicrotime();
for($n = 0; $n < 10000; $n++){
    // 何もしない
}
$time2 = getmicrotime();
$timeF = $time2 - $time1;

// whileループの実行時間測定
$time1 = getmicrotime();
$n = 0;
while($n < 10000){
    $n++; // カウントするだけ
}
$time2 = getmicrotime();
$timeW = $time2 - $time1;

// forループを100としたときのwhileループの割合
$ritu = ($timeW / $timeF) * 100;

// 見栄え良くテーブルに出力
print <<<HTML
<html>
<head>
<meta http-equiv=\"content-type\" content=\"text/html;charset=Shift_JIS\">
<title>forループとwhileループ、実行速度比較</title>
</head>
<body>
<table border=\"2\">
 <caption>$count 回ループの実行速度比較</caption>
 <tr>
  <td>forループ</td>
  <td> $timeF </td>
 </tr>
 <tr>
  <td>whileループ</td>
  <td> $timeW </td>
 </tr>
 <tr>
  <td>while/for</td>
  <td> $ritu (%)</td>
 </tr>
</table>
</body>
</html>
HTML;
?>

結果

何度かこのスクリプトを走らせたところ、値のばらつきがかなりありましたが 5% ~ 15% ほど while ループの方が高速でした。

また、繰り返す回数($count)を増やしてみたところその差は少なくなる傾向にありました。実際 $count が 100000 の時、その差は 2% ~ 0% とほとんどありませんでした。これは推測になりますが、コンピュータのキャッシュ機能によって両者の差が埋めらてるのではないかと思うのですが、正解をご存知の方がいらっしゃいましたら教えて下さい。

whileループで書くほうが若干高速なわけですが、この位の差であればあえてwhileループを使って高速化を図るよりも、コードの読みやすさや保守のしやすさなどを優先し使い分けるのがベターだと思います。



category: 実験・実測 関数の値渡しと参照渡しどちらが速い? MySQL4.1のインストール
PHP Note
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新したNote
よく読まれている記事
Yahoo Search

最近更新された掲示板トピックス
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑