パフォーマンスの目(AutoLinkとisset())

状況 2005-02-05

1. AutoLinkが有効であり、かつ膨大な量のAutoLink対象ページ(数千?)があり、かつページの中に膨大な量のAutoLink対象文字列がある場合、1ページを表示するときのis_page() のコール回数が5000回を越えるようになる。このような時には、is_page()全体の処理をメモリにキャッシュすることで、is_page()の実行時間を極力下げることがやや有効らしい。ただし、メモリオーバーヘッドは状況が悪化するにつれ指数関数的に増大すると思われる。 -- henoheno

2. この状況では、AutoLinkの処理自体がボトルネックになっているようである。そちらをチェックするのはどうか。

3. 実際のページ数よりも多くis_page()がコールされる状況がそもそもよろしくない。AutoLinkの表示上の問題をスマートに解決できないものか。

関連

メッセージ

キャッシュをどこに持つべきか、持たないべきか。 細かいパフォーマンスチューニングについて。 とりあえず、1.4.5 をベースにします。

is_page() のキャッシュ

ページを更新する場合に、「ページの更新」ボタン→ redirect → 編集後のページと 遷移しますが、ページ数が多い(といっても 3000 ページほどですが)場合、 redirection を出すまでの時間がとても長くなります。

少し話を絞りたいので、is_page() を調整する場合を考えます。

diff -u pukiwiki-1.4.5/lib/func.php pukiwiki-1.4.5.nw/lib/func.php
--- pukiwiki-1.4.5/lib/func.php	2005-01-27 21:50:43.000000000 +0900
+++ pukiwiki-1.4.5.nw/lib/func.php	2005-02-21 21:49:03.778414400 +0900
@@ -43,8 +43,17 @@
 // If the page exists
 function is_page($page, $clearcache = FALSE)
 {
-	if ($clearcache) clearstatcache();
-	return file_exists(get_filename($page));
+	static $is_page_cache=array();
+	if ($clearcache){
+		clearstatcache();
+		return $is_page_cache[$page]=file_exists(get_filename($page));
+	}else{
+		if(isset($is_page_cache[$page])){
+			return $is_page_cache[$page];
+		}else{
+			return $is_page_cache[$page]=file_exists(get_filename($page));
+		}
+	}
 }
 
 function is_editable($page)

redirection を送り返すまでの時間を計測し、秒で出します。

$autolink=8(デフォルトの設定)

おぉ。よかった。5 % 程度の高速化で済んだ。

$autolink=0

こちらは若干速度が落ちます。

当然のことですが、ハードウェアの構成などで測定数値の状況は変わります。 上の数字はあくまで私の手元で実験した時の数字です。

問題は autolink が有効になっている場合に、do_search() が呼ばれ、 全ファイル探索に入るためですが、is_page() をキャッシュすると少しだけ 軽減できます。 副作用として通常のページ表示で若干遅くなると推測されます(こちらは未測定)。



*1 ファイルアクセスのコストは大きいものだ、という事を仮定した上のキャッシュ

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2005-04-14 (木) 21:03:23
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 8.2.12. HTML convert time: 0.208 sec.

SourceForge