スレッド表示 | フラット表示〕 全トピック 920 件中 823 番目 次≫ ≪前

いろんなループの処理速度

created: 2003-08-25 01:58 | modified: 2003-08-26 21:34 | reply: 2

[540] いろんなループの処理速度

user: yagi ホームページ | created: 2003-08-25 01:58
たいして大きくないログファイルのループ処理なら

・while + each
・for
・foreach

などのメジャーなループ処理でいいのですが、
巨大なログを高速に処理するには明らかに不向きですよね。
そこで最近いろいろとログを展開するループ処理速度を大幅に向上させる方法がないかと考えていました。
ただ展開して表示するだけならば、

$file = file("ログ");
do { echo current($file); }
while (next($file));

の連携がかなり高速のようです。
上記の3つの方法による処理時間をかなり短縮できました。
他の方法でさらに処理速度を向上させる方法はないでしょうか?
よいアイディアをお待ちしてます(^^)
reply: 551 返信 編集 削除

[551] Re: いろんなループの処理速度

user: ゆうじ | created: 2003-08-26 20:04
yagiさんが示してくださった方法は
使ったことありませんでした。
大変参考になりました。

自分でもちょっと考えてみました。
この掲示板のログを元に約1万件のレコードを作って、
ローカルPCで以下のコードを走らせ、
実行時間を測定してみました。


// loop A ----------
if( $fp = fopen( $fname, "r" ) ) {
while( !feof( $pf ) ) {
echo fgets( $fp, 9182 );
}
fclose( $fp );
}

// loop B ----------
$file = file( $fname );
foreach( $file as $val )
echo $val;

// loop C ----------
function show( $str ) {
echo $str;
}
$file = file( $fname );
array_walk( $file, "show" );


BとCが早いだろうと予想してたのですが、
意に反してその差はごくわずかでした。
以下はそれぞれの処理を別ファイルに記述して
各10回実行して得た平均時間(秒)です。

loop A : 1.884
loop B : 1.658
loop C : 1.667
Parent: 540  reply: 552 返信 編集 削除

[552] なるほど

user: yagi | created: 2003-08-26 21:34
loopAが若干遅いようですが、この原因は何でしょうね。
私もちょっとテストしてみましたが、
fgetsで読み込むバイト数が小さいほど処理が速いようです。そこでfgetsを調べてみると

「指定バイト数分読み込んでからEOF、改行を判定する」

とあるので、例えば512バイトしかないレコードに対して4096バイト指定した場合の差に原因があるのでしょうか?

loopCはリファレンスを使って速度を向上させられそうですね。
Parent: 551  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 823 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑