概要

ls2プラグインは、呼び出されるたびにget_existpages()を呼び出すので、 全体で数万ページあるようなサイトでは、ページ内に何度も#ls2を書くと 無視できないほど遅くなります。

get_existpages()の結果をキャッシュして、複数回呼ばれたときの処理を高速化します。

内容

$ diff -u ls2.inc.php.original ls2.inc.php
--- ls2.inc.php.original        2004-12-05 20:37:37.000000000 +0900
+++ ls2.inc.php 2011-04-01 01:52:35.372269811 +0900
@@ -86,14 +86,18 @@
 function plugin_ls2_show_lists($prefix, & $params)
 {
        global $_ls2_err_nopages;
+       static $s_cached_existpages = null;
 
        $pages = array();
+       if ($s_cached_existpages === null) {
+               $s_cached_existpages = get_existpages();
+       }
        if ($prefix != '') {
-               foreach (get_existpages() as $_page)
+               foreach ($s_cached_existpages as $_page)
                        if (strpos($_page, $prefix) === 0)
                                $pages[] = $_page;
        } else {
-               $pages = get_existpages();
+               $pages = $s_cached_existpages;
        }
 
        natcasesort($pages);

効果

  • 全体ページ数2万のあるサイト、#ls2(キーワード) が 45あったあるページのHTML convert time:
    • 改善前: 35秒 → 改善後 2秒

コメント

  • 遅かったので対策しました。 -- umorigu 2011-04-21 (木) 00:33:38
  • get_existpages()側でキャッシュすればls2に限らず高速化されるとか... -- 2011-04-21 (木) 00:31:17
  • されます。get_existpages()の変更は影響範囲を読めなかったので今回はls2だけにしました。ここ (//www.revulo.com/PukiWiki/Cache/PagenameCache.html) ではget_existpages()内でキャッシュしているようです -- umorigu 2011-04-21 (木) 00:35:57
  • 「影響範囲」というのは「get_existpages()→ページ追加・削除→get_existpages()というケースがあるかも?」という懸念です -- umorigu 2011-04-21 (木) 00:57:04
  • この件は、①全体で数万ページあるようなサイトを引き合いに出しているのに、それを メモリに キャッシュするという富豪的な所と、②ls2のみが対象である(局所解)である という所に抵抗感を覚えます。 -- henoheno 2017-10-16 (月) 22:57:31
    • メモリについては、例えば 32文字/UTF-8で62bytesが10万ページあったとしても、文字列リストの容量は7MBほどですので、富豪的とはいえ問題になるようなレベルのものではないと考えています。ただ、ご指摘を受けて改めて見直してみると、ここで提案した実装は get_existpages() の結果をそのままキャッシュしているので倍ほどメモリを無駄に使っていることがわかりました。(キャッシュには不要な「ファイル名」を含んでいる。)ここは対応したいと思います。2点目、ls2限定にしているのは影響範囲を小さくするためです。get_existpages()の中でキャッシュするすると、get_existpages()を呼び出した後にページ生成をするようなプラグイン(標準添付のものではbugtrackやtracker)のことを考えると、キャッシュ機構をかなり複雑なものにする必要がでてきます -- umorigu 2017-10-17 (火) 00:16:03
      • 「readプラグインが動き始めてからのみキャッシュする」のような動作にできなくもないので、もう少し考えてみます -- umorigu 2017-10-17 (火) 01:15:48
    • パラメータを変えて同一ページで何度も呼び出されるプラグイン(かつ、それぞれの呼び出しでページを列挙する)というのは限られており、標準のものではls2とcalendar_viewer系プラグインです -- umorigu 2017-10-17 (火) 00:42:22
  • ls2の高速化はBugTrack/2438, calendar_viewerの高速化はBugTrack/2446で、同じ実装 (get_existspages内でのキャッシュ)で実現されています -- umorigu 2018-03-07 (水) 00:48:02


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-03-07 (水) 00:48:02
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.462 sec.

OSDN