トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

BugTrack-plugin/405

ページの作成や編集にはユーザ登録が必要です。

keyword 高速化・機能強化プラグイン

  • 投稿者: ぐうます
  • カテゴリ: 新規
  • 優先度: 低
  • 状態: リリース済
  • 日時: 2009年07月23日 06時51分37秒

 内容

  • 「ページの自動リンク」機能を ON したときの表示を高速化します。
  • 「文字境界ズレによるキーワード誤マッチ」のバグを対策します。
  • ワード境界を考慮したキーワードマッチを行います。

「ページの自動リンク」機能と表示レスポンス低下

最も Wiki らしい機能の一つである「ページの自動リンク」は、Wiki ページ数が増えたときに表示レスポンス低下の要因となるため、OFF にして運用することが多いのではないでしょうか。下記条件にて FrontPage 1 ページの表示処理時間を測定したところ、確かに「ページの自動リンク」ON 時は処理時間が長くなることがわかります。

  • 「ページの自動リンク」ON/OFF による表示処理時間の違い
ページの自動リンク 表示処理時間
OFF 0.41 sec
ON 0.99 sec
----- Average -----
URL = wiki.cgi?page=FrontPage
Run on 2009-07-23 01:52:15 -- 2009-07-23 01:56:07

             Count = 10
Total Elapsed Time = 0.888938 Seconds
  User+System Time = 0.408571 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 10.2   0.041  0.278      8   0.0052 0.0347  main::BEGIN
 8.29   0.033  0.034      3   0.0113 0.0113  plugin::ksksk::Install::load_confi
                                             g_hash
 6.16   0.025  0.124      8   0.0031 0.0155  Wiki::BEGIN
 4.87   0.019  0.032     22   0.0009 0.0014  Jcode::BEGIN
 3.98   0.016  0.034      5   0.0032 0.0068  Cwd::BEGIN
 3.57   0.014  0.014      5   0.0029 0.0029  CGI::_compile
 3.27   0.013  0.017      3   0.0044 0.0059  vars::BEGIN
 3.18   0.013  0.019     19   0.0006 0.0010  Wiki::install_plugin
 3.10   0.012  0.017     16   0.0007 0.0010  Wiki::get_plugin_instance
 2.96   0.012  0.048      5   0.0024 0.0096  CGI::Session::File::BEGIN
 2.96   0.012  0.078      4   0.0030 0.0195  CGI2::BEGIN
 2.59   0.010  0.024      4   0.0026 0.0060  CGI::Session::Serialize::Default::
                                             BEGIN
 2.32   0.009  0.010      3   0.0031 0.0033  CGI::BEGIN
 1.76   0.007  0.011     10   0.0007 0.0011  HTML::Template::BEGIN
 0.46   0.001  0.001      1   0.0019 0.0019  Fh::BEGIN
----- Average -----
URL = wiki.cgi?page=FrontPage
Run on 2009-07-23 02:02:57 -- 2009-07-23 02:07:21

             Count = 10
Total Elapsed Time = 1.667311 Seconds
  User+System Time = 0.989576 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 32.5   0.322  0.322     42   0.0076 0.0076  Wiki::Keyword::exists_keyword
 8.84   0.087  0.247      1   0.0875 0.2473  Wiki::Keyword::load_keywords
 5.15   0.051  0.069  10082   0.0000 0.0000  Wiki::DefaultStorage::get_page_lev
                                             el
 4.13   0.040  0.282      8   0.0051 0.0352  main::BEGIN
 4.02   0.039  0.039  10035   0.0000 0.0000  Wiki::Keyword::wiki_anchor
 3.57   0.035  0.035      3   0.0118 0.0118  plugin::ksksk::Install::load_confi
                                             g_hash
 3.43   0.034  0.131  10082   0.0000 0.0000  Wiki::can_show
 2.71   0.026  0.088  10082   0.0000 0.0000  Wiki::get_page_level
 2.40   0.023  0.124      8   0.0029 0.0155  Wiki::BEGIN
 2.05   0.020  0.035     22   0.0009 0.0016  Jcode::BEGIN
 1.57   0.015  0.030      5   0.0031 0.0061  Cwd::BEGIN
 1.18   0.011  0.011      5   0.0023 0.0023  CGI::_compile
 1.10   0.010  0.038      5   0.0021 0.0077  CGI::Session::File::BEGIN
 1.02   0.010  0.055      4   0.0025 0.0139  CGI2::BEGIN
 0.92   0.009  0.012     19   0.0004 0.0006  Wiki::install_plugin

レスポンス低下要因 1:Wiki::Keyword::exists_keyword()

上記の「ページの自動リンク」ON 時のプロファイル結果で最も重い処理は、キーワード検索処理である Wiki::Keyword::exists_keyword() です。これは、検索に使用している正規表現が遅いことが原因です。本提案プラグインでは、より高速な正規表現を生成するため、次の 2 つの方法を使用することにします。

  • パターン共通化した正規表現を使用する。
    • 例えば、「BugTrack-plugin/1」〜「BugTrack-plugin/405」 にマッチする正規表現として、従来法と本プラグインでは次のように異なる。
      • 従来法での正規表現:
BugTrack-plugin/405|BugTrack-plugin/404| … |BugTrack-plugin/2|BugTrack-plugin/1
      • 本プラグインでの正規表現:
BugTrack-plugin/\d+
  • キーワード全体の正規表現の生成に、CPAN モジュール Regexp::Assemble を使用する。

レスポンス低下要因 2:Wiki::Keyword::load_keywords()

上記の「ページの自動リンク」ON 時のプロファイル結果で 2 番目に重い処理は、Wiki::Keyword::load_keywords() です。この処理は、キーワードデータをキャッシュファイルからロードし、そのデータから検索用の正規表現を毎回の閲覧時に生成しています。しかし、次のような事象が発生しない限り生成される正規表現は同じになりますので、その間は同じ正規表現を繰り返し使用することによって正規表現生成処理を省くことが出来ます。

  • ページ「Keyword」の内容更新
  • ページ追加・削除
  • ページ閲覧権限設定の変更
  • 「ページの自動リンク」ON/OFF 設定の変更

よって、正規表現の生成のタイミングは、「上記事象のいずれかが発生したとき、もしくは、いずれかが発生後の最初の閲覧時」とし、生成した正規表現もキーワードキャッシュファイル ./log(/farm)/keywords2.cache に保存することにします。

本プラグインを使用した場合の表示処理時間

  • 表示処理時間比較結果
ページの自動リンク 本プラグイン 表示処理時間
OFF OFF 0.41 sec
ON OFF 0.99 sec
ON ON 0.44 sec
----- Average -----
URL = wiki.cgi?page=FrontPage
Run on 2009-07-23 02:31:21 -- 2009-07-23 02:35:15

             Count = 10
Total Elapsed Time = 0.823619 Seconds
  User+System Time = 0.437161 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 9.99   0.043  0.302      8   0.0054 0.0377  main::BEGIN
 8.25   0.036  0.036      3   0.0120 0.0120  plugin::ksksk::Install::load_confi
                                             g_hash
 5.87   0.025  0.132      8   0.0032 0.0166  Wiki::BEGIN
 4.55   0.019  0.037     22   0.0009 0.0016  Jcode::BEGIN
 4.48   0.019  0.038      5   0.0039 0.0077  Cwd::BEGIN
 3.84   0.016  0.023     21   0.0008 0.0011  Wiki::install_plugin
 3.49   0.015  0.050      5   0.0030 0.0101  CGI::Session::File::BEGIN
 3.40   0.014  0.083      4   0.0037 0.0208  CGI2::BEGIN
 3.17   0.013  0.013      5   0.0027 0.0027  CGI::_compile
 3.11   0.013  0.019      3   0.0045 0.0064  vars::BEGIN
 2.65   0.011  0.015     16   0.0007 0.0009  Wiki::get_plugin_instance
 2.19   0.009  0.021      4   0.0024 0.0054  CGI::Session::Serialize::Default::
                                             BEGIN
 1.96   0.008  0.013     10   0.0008 0.0013  HTML::Template::BEGIN
 1.80   0.007  0.008      3   0.0026 0.0028  CGI::BEGIN
 0.59   0.002  0.002     58   0.0000 0.0000  Wiki::InterWiki::exists_interwiki

なお、上記までの全てのプロファイル結果は、キーワードキャッシュ生成済みの状態での測定結果でしたが、キーワードキャッシュ無しの状態からの結果は次のようになりました。

  • 表示処理時間比較結果
ページの自動リンク 本プラグイン キーワードキャッシュ 表示処理時間 備考
ON ON 作成済み 0.44 sec 10 回平均
ON ON 無し 0.54 sec 1 回の結果
  • プロファイル結果:「ページの自動リンク」ON, FreeStyle Wiki 3.6.3.1 無改造 + 高速化するかも?プラグイン + 本プラグイン, キーワードキャッシュ無し状態からの実行
URL = wiki.cgi?page=FrontPage
Run on 2009-07-23 02:38:42

Total Elapsed Time = 0.617090 Seconds
  User+System Time = 0.537941 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 7.99   0.043  0.094      1   0.0435 0.0944  Wiki::Keyword::parse
 6.51   0.035  0.307      8   0.0044 0.0383  main::BEGIN
 6.32   0.034  0.034      3   0.0113 0.0114  plugin::ksksk::Install::load_confi
                                             g_hash
 4.83   0.026  0.136      8   0.0032 0.0170  Wiki::BEGIN
 4.28   0.023  0.036     22   0.0010 0.0016  Jcode::BEGIN
 3.35   0.018  0.041      5   0.0037 0.0081  Cwd::BEGIN
 3.35   0.018  0.022      3   0.0061 0.0074  vars::BEGIN
 2.97   0.016  0.018     16   0.0010 0.0011  Wiki::get_plugin_instance
 2.79   0.015  0.015      5   0.0030 0.0030  CGI::_compile
 2.79   0.015  0.051      5   0.0029 0.0101  CGI::Session::File::BEGIN
 2.60   0.014  0.020     21   0.0007 0.0010  Wiki::install_plugin
 2.60   0.014  0.014      3   0.0046 0.0047  CGI::BEGIN
 2.23   0.012  0.015      9   0.0013 0.0016  File::Path::BEGIN
 1.86   0.010  0.082      4   0.0026 0.0205  CGI2::BEGIN
 1.86   0.010  0.010     12   0.0008 0.0008  DynaLoader::dl_load_file

その他の機能強化

  • BugTrack-wiki/80:日本語一文字のページ名について に報告のある、「文字境界ズレによるキーワード誤マッチバグ(天井-薫問題)」を対策しました。
  • 半角英数文字を先頭・末尾とするキーワードの場合には、ワード境界を考慮したキーワードマッチを行うようにしました。

次のようなソース内容の Wiki ページについて、本プラグイン有り/無しでの表示の違いを下記に示します。

*文字境界ズレによるキーワード誤マッチ
明日の日曜日、天井裏を調べてくれないかなあ。ねえ、頼むよ、薫さん。

*ワード境界を考慮したキーワードマッチ:例文はページ「Help」からの抜粋
Header、Footer、Menuという名前のページを作成するとそれぞれヘッダ、フッタ、サイドバーが表示されます。
また、EditHelperというページを作成するとページの編集画面の下部にヘルプとして表示されます。
  • 本プラグイン無効時の表示結果
  • 本プラグイン有効時の表示結果

本プラグインパッケージの構成とインストール

  • 構成:添付ファイル keyword2.20090723.zip(268) に含まれるファイルは、次の 2 つです。
    • plugin/keyword2/Install.pm
    • plugin/keyword2/DeleteCache.pm
  • インストール:
    1. CPAN モジュール Regexp::Assemble のインストール
      • cpan shell, ppm(ActivePerl の場合)等のツールを使用してインストールして下さい。
      • cpan shell, ppm のどちらも使用できない環境の場合には、http://search.cpan.org/CPAN/authors/id/D/DL/DLAND/Regexp-Assemble-0.34.tar.gz をダウンロードして解凍し、Assemble.pm を新規作成フォルダ ./lib/Regexp/ 内に保存して下さい。pure perl モジュールなので多分問題なく動くと思います。
    1. keyword2.20090723.zip(268) をダウンロードし、FSWiki の動作しているサーバに展開して下さい。
    2. 管理メニューのプラグイン設定ページから、keyword2 プラグインパッケージを有効にして下さい。
    3. 「ページの自動リンク」ON/OFF 設定変更時にキーワードキャッシュを自動更新する機能は、BugTrack-plugin/406:各種フックを提供するプラグインと併用することにより実現されます。よって、同プラグインを導入下さい。

適用可能な FSWiki バージョン

FreeStyle Wiki 3.6.4 (2009-07-23 時点での SVN Head)以降、または、BugTrack-plugin/400:高速化するかも?プラグイン 2009-07-16 版以降を有効にした FreeStyle Wiki 3.6.3dev2 以降 (理由:Wiki::_get_can_show_max() メソッドを使用しているため)。

制限事項

  • 次の 7 メソッドをオーバーライドしているため、これらを独自改造している場合や、これらをオーバーライドする別プラグインと併用すると、どちらかが正しく機能しなくなります。
    • Wiki::Keyword::new()
    • Wiki::Keyword::exists_keyword()
    • Wiki::Keyword::load_keywords()
    • Wiki::Keyword::save_keywords()
    • Wiki::Keyword::parse()
    • Wiki::Keyword::url_anchor()
    • Wiki::Keyword::wiki_anchor()
  • 内部処理日本語コードが EUC であることに起因する「文字境界ズレによるキーワード誤マッチバグ」を対策するための処理が入っていますので、内部処理日本語コードを utf-8 化した FSWiki では動作しません。(2010-01-22 追記)

注意

上記のプロファイル結果は投稿者の自サイトにて得られたものであり、本プラグイン適用時の速度改善量は適用先の Wiki サイトに応じて異なります。特に今回の提案は、Wiki ページ数が多い Wiki サイトほど効果が出る内容になっていますので、Wiki ページ数が少ないサイトに適用するとかえって処理が遅くなる可能性もあります。適用しても効果がないと感じる場合には適用をお止め下さい。

更新履歴

2009-07-23 版:keyword2.20090723.zip(268)
初版公開

ライセンス

GPL

 コメント

  • 素晴らしいです。こちらのプラグインといい、高速化するかも?プラグインといい、何度も手を出そうかと考えたことのある部分ですが、影響範囲を図りかねて手を付けられずにいました。大絶賛させて頂きます。 - あき (2009年07月23日 09時40分26秒)
  • コメントありがとうございます。あきさんのプラグインはいつも参考にさせていただいております。あきさんには、プラグイン開発者としての視点から拙作プラグインをご評価いただいていろいろご指摘いただきたく、よろしくお願い致します。 - ぐうます (2009年07月23日 23時10分46秒)
  • 本プラグインにて「ページの自動リンク」ON/OFF 設定変更時にキーワードキャッシュを自動更新するために必要となる BugTrack-plugin/406:各種フックを提供するプラグインを投稿致しましたので、本プラグインと併せて導入下さい。 - ぐうます (2009年07月24日 01時23分08秒)
  • 取り込ませていただきました。SVNにコミット済みです。Assemble.pmも本体に同梱するようにしています。 - たけぞう (2009年08月12日 18時37分39秒)
お名前: コメント:
keyword2.20090723.zip sample11.png sample22.png

最終更新時間:2011年06月03日 08時55分53秒