BugTrack/2171
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
* do_search()の効率化 [#l53ddc40]
- ページ: [[BugTrack2]]
- 投稿者: [[Cue]]
- 優先順位: 低
- 状態: 完了
- カテゴリー: その他
- 投稿日: 2006-04-14 (金) 13:58:15
- バージョン:
** メッセージ [#see2d2ff]
"PukiWiki/1.4/ちょっと便利に/do_search()の改造実験" (削除...
** do_search()の改造実験 by [[Cue]] [#s8e783f7]
検索文字列の含まれるページをリストアップする関数ですが、...
** 期待する効果 [#y3371182]
1.4.6の配布ファイルで呼び出している以下の2箇所の処理が軽...
- searchプラグインの単語検索
- Autolink対象となるページが新設された場合に、そのページ...
** 改造点 [#oaf054bd]
+ pregの呼出し回数が多いのでパターンをstudyさせてみる。(...
+ キーワードを含むか否かの判定にpreg_grep()を使っているが...
+ ↑の結果、ページ内容を配列で取得しなくても良いのでfread(...
+ ファイル内容を読んだ場合にはfstat()で取得した時刻情報を...
+ links_update()から呼ばれる場合(($non_formatが真の時はli...
** パッチ [#d26d1df8]
1.4.6(func.php,v 1.46)からの差分
--- lib/func.php Mon Jul 04 00:09:28 2005
+++ lib/func.new.php Thu Mar 30 21:42:50 2006
@@ -190,32 +190,37 @@
$retval = array();
$b_type = ($type == 'AND'); // AND:TRUE OR:FALSE
- $keys = get_search_words(preg_split('/\s+/', $word, -1...
+ $keys = $non_format ? array(preg_quote($word, '/')) :
+ get_search_words(preg_split('/\s+/', $word, -1, PREG_...
+ $keys = preg_replace('/^.*$/', '/$0/S', $keys);
$_pages = get_existpages();
$pages = array();
$non_list_pattern = '/' . $non_list . '/';
- foreach ($_pages as $page) {
+ foreach ($_pages as $file=>$page) {
if ($page == $whatsnew || (! $search_non_list && preg...
continue;
+ $source = $non_format ? '' : $page . "\n";
// 検索対象ページの制限をかけるかどうか (ページ名は制...
if ($search_auth && ! check_readable($page, false, fa...
- $source = get_source(); // Empty
+ $stat = NULL;
} else {
- $source = get_source($page);
+ if (($fp = fopen(DATA_DIR . $file, 'rb')) === FALSE)
+ continue; // ページが消えている?
+ flock($fp, LOCK_SH);
+ $stat = fstat($fp);
+ $source .= fread($fp, $stat['size']);
+ fclose($fp);
}
- if (! $non_format)
- array_unshift($source, $page); // ページ名も検索対象に
- $b_match = FALSE;
foreach ($keys as $key) {
- $tmp = preg_grep('/' . $key . '/', $source);
- $b_match = ! empty($tmp);
+ $b_match = preg_match($key, $source);
if ($b_match xor $b_type) break;
}
- if ($b_match) $pages[$page] = get_filetime($page);
+ if ($b_match) $pages[$page] = isset($stat) ?
+ $stat['mtime'] - LOCALZONE : get_filetime($page);
}
if ($non_format) return array_keys($pages);
--------
** コメント [#d905ba4f]
- 違うところからアプローチしていたのですが、改造点2につい...
- 移行してコミットしました。-- [[teanan]] &new{2006-04-14...
-- [[cvs:lib/func.php]] (1.55)
-- [[cvs:lib/html.php]] (1.55)
-- 'preg_grep' => 'preg_match'へ修正(改善点2)
-- get_search_words()でアルファベットの大文字/小文字の考...
その代わり、preg_matchにおいて、大文字/小文字を区別しない...
- 改善点3(freadで一括読み出し)の件、実装しました。get_sou...
-- [[cvs:lib/file.php]] (1.61)
-- [[cvs:lib/func.php]] (1.56)
- 私は約2000ページのテスト環境ですが、ここまでの対応で大...
- 本来あるべき実装かどうかを確認し追究する、という良いサ...
|Search words|func.php| Hits/2020 | Time |h
| | |RIGHT:|RIGHT:|c
| "BugTrack" | r1.54 | 1428pages | 20.4sec |
|~| r1.57 |~| 6.2sec |
| "開発日記" | r1.54 | 618pages | 3.9sec |
|~| r1.57 |~| 2.0sec |
| "Web委員" | r1.54 | 52pages | 4.1sec |
|~| r1.57 | &color(red){51pages};|&color(red){...
| "b委" | r1.54 | 52pages | 5.8sec |
|~| r1.57 | &color(red){51pages};|&color(red){...
| "b" | r1.54 | 1845pages | 18.3sec |
|~| r1.57 |~| 3.3sec |
| "委" | r1.54 | 58pages | 3.6sec |
|~| r1.57 |~| 1.8sec |
- おはようございます。検証ありがとうございます。get_searc...
-- %%get_search_words() に対する修正だけを含んでいる func...
- 他に気になっている部分・・・(観察中) -- [[henoheno]] &n...
-- get_source(): それぞれの挙動のポイントをコメントにした...
-- get_source(): $join 時に str_replace("\r", '') してい...
-- do_search(): ページ名だけで検索条件が成立するならば、...
-- [[cvs:func.php]] (r1.55) のコメントログの指摘「'get_se...
--- mb_convert_kana('A') の部分ですね -- [[henoheno]] &ne...
--- あ、foreachがなくなっているので、entity reference の...
- get_search_words() についてはbackoutするのがいいかもし...
-- なるほど、ご指摘のとおりです。元に戻します。ありがとう...
-- [[cvs:lib/func.php]] (1.58)
-- [[cvs:lib/html.php]] (1.56)
-- 正規表現を長くするよりも、preg_matchで大小区別しない方...
- 言われてみれば顔文字に見えますね (^^; これで「Web委員」...
-- back out した時は、コミットログにどのリビジョンに対す...
-- 了解です。コミットログを修正しました。正規表現のオプシ...
-- back out する修正は直前のものとは限りませんから、back ...
-- すみません、なかなか難しいです (^^; お手数をおかけしま...
- どの件もそうですが、日常生活に支障が出ない程度に、休み...
-- お気遣いありがとうございます。やれる範囲でやらせて頂い...
- 現在の状況は以下の通り。do_search() の中にある get_sear...
|Search words|func.php| Hits/2020 | Time |h
| | |RIGHT:|RIGHT:|c
| "BugTrack" | r1.54 | 1428pages | 20.4sec |
|~| r1.58 |~| 7.5sec |
| "開発日記" | r1.54 | 618pages | 3.9sec |
|~| r1.58 |~| 2.1sec |
| "Web委員" | r1.54 | 52pages | 4.1sec |
|~| r1.58 |~|&color(red){13.0sec};|
| "b委" | r1.54 | 52pages | 5.8sec |
|~| r1.58 |~|&color(red){14.8sec};|
| "b" | r1.54 | 1845pages | 18.3sec |
|~| r1.58 |~| 3.7sec |
| "委" | r1.54 | 58pages | 3.6sec |
|~| r1.58 |~| 1.9sec |
- PCRE装飾子 S または i を付けるかどうかによって速度が変...
-- [[cvs:lib/func.php]] (1.59)
-- [[cvs:lib/html.php]] (1.57)
http://jp.php.net/manual/ja/reference.pcre.pattern.mod...
パターン修飾子
S
あるパターンを複数回使用する場合は、マッチングにかか...
高速化することを目的として、パターンの分析に幾分か時...
良いでしょう。この修飾子を設定すると、追加のパターン...
行われます。現在、パターン分析は、最初の文字が単一で...
かつ固定でないパターンに対してのみ有用です。
-- そう、マニュアルには具体的に何をやっているか書かれてい...
- 次に、一致したページ名を記録する部分で、$non_formatがtr...
-- [[cvs:lib/func.php]] (1.60)
- 今回の修正の中で、ページ名とページ本文を収めた変数が直...
-- ご指摘ありがとうございます。確かにそのとおりです (^^; ...
--- [[cvs:lib/func.php]] (1.61)
-- r1.61で、今までのコンセプトに沿った本来の実装になった...
- 現状は以下の通り。 "S" オプションは他の要所でも使えそう...
|Search words|func.php| Hits/2020 | Time |h
| | |RIGHT:|RIGHT:|c
| "BugTrack" | r1.54 | 1428pages |20.3sec |
|~| r1.61 |~| 2.6sec |
|~| r1.64 |~| 1.9sec |
|~| r1.67 |~| 1.9sec |
| "開発日記" | r1.54 | 618pages | 3.9sec |
|~| r1.61 |~| 2.1sec |
|~| r1.64 |~| 1.8sec |
|~| r1.67 |~| 1.8sec |
| "Web委員" | r1.54 | 52pages | 4.1sec |
|~| r1.61 |~| 2.2sec|
|~| r1.64 |~| 2.1sec|
|~| r1.67 |~| 2.2sec|
| "b委" | r1.54 | 52pages | 5.8sec |
|~| r1.61 |~| 2.1sec|
|~| r1.64 |~| 2.1sec|
|~| r1.67 |~| 2.2sec |
| "b" | r1.54 | 1845pages | 18.1sec|
|~| r1.61 |~| 2.7sec |
|~| r1.64 |~| 1.9sec |
|~| r1.67 |~| 1.9sec |
| "委" | r1.54 | 58pages | 3.6sec |
|~| r1.61 |~| 1.9sec |
|~| r1.64 |~| 1.8sec |
|~| r1.67 |~| 1.9sec |
- $search_non_list, $search_auth の除外処理を事前に行って...
- tracker_listとかにSオプションつけると効果がありそうです...
- というわけで、他のこまごました修正と、ピーク時に大変に...
- おっと、検索結果が $show_passage の設定を無視している事...
- 確認しました、お疲れ様です。私もこの辺で一段落付いたと...
- ざっと見ただけですが、蒸し返し用に[[改造点>#oaf054bd]]...
-- はい、私も同じ認識です。 -- [[teanan]] &new{2006-04-17...
-- にぶんのにさん、チェックありがとうございます。Cueさん...
- searchプラグインで検索対象のページを指定した場合、正し...
- [[BugTrack2/330]] -- &new{2010-08-17 (火) 22:05:08};
#comment
** 取り込まれたコードを見て [#d943037f]
取り込み作業お疲れ様でした。遅まきながら感想など。
*** fstat()とstat()の速度差に関する補足説明 [#i2558509]
4番目の改造点を効果微妙と評しましたが、これは''多数のペ...
私[[Cue]]が書き込んだパッチの当該部分を見てもらうと$b_mat...
*** どの程度無視できないのか? [#wd8e417c]
速度の計測は裏で何が動いているか把握できる隔絶された環境...
下の結果は''`''と''*''を使ってPlus!の公式サイトで検索した...
|検索文字|convert time|hitしたページ数|h
|`|0.21sec程度|7|
|*|0.30sec程度|689|
多数のページにヒットする検索があまりないなら構う事もない...
*** links_update()からの呼び出し [#hf0b2cd4]
link.phpには踏み込みたくなかったので5番目の改造点で留めて...
終了行:
* do_search()の効率化 [#l53ddc40]
- ページ: [[BugTrack2]]
- 投稿者: [[Cue]]
- 優先順位: 低
- 状態: 完了
- カテゴリー: その他
- 投稿日: 2006-04-14 (金) 13:58:15
- バージョン:
** メッセージ [#see2d2ff]
"PukiWiki/1.4/ちょっと便利に/do_search()の改造実験" (削除...
** do_search()の改造実験 by [[Cue]] [#s8e783f7]
検索文字列の含まれるページをリストアップする関数ですが、...
** 期待する効果 [#y3371182]
1.4.6の配布ファイルで呼び出している以下の2箇所の処理が軽...
- searchプラグインの単語検索
- Autolink対象となるページが新設された場合に、そのページ...
** 改造点 [#oaf054bd]
+ pregの呼出し回数が多いのでパターンをstudyさせてみる。(...
+ キーワードを含むか否かの判定にpreg_grep()を使っているが...
+ ↑の結果、ページ内容を配列で取得しなくても良いのでfread(...
+ ファイル内容を読んだ場合にはfstat()で取得した時刻情報を...
+ links_update()から呼ばれる場合(($non_formatが真の時はli...
** パッチ [#d26d1df8]
1.4.6(func.php,v 1.46)からの差分
--- lib/func.php Mon Jul 04 00:09:28 2005
+++ lib/func.new.php Thu Mar 30 21:42:50 2006
@@ -190,32 +190,37 @@
$retval = array();
$b_type = ($type == 'AND'); // AND:TRUE OR:FALSE
- $keys = get_search_words(preg_split('/\s+/', $word, -1...
+ $keys = $non_format ? array(preg_quote($word, '/')) :
+ get_search_words(preg_split('/\s+/', $word, -1, PREG_...
+ $keys = preg_replace('/^.*$/', '/$0/S', $keys);
$_pages = get_existpages();
$pages = array();
$non_list_pattern = '/' . $non_list . '/';
- foreach ($_pages as $page) {
+ foreach ($_pages as $file=>$page) {
if ($page == $whatsnew || (! $search_non_list && preg...
continue;
+ $source = $non_format ? '' : $page . "\n";
// 検索対象ページの制限をかけるかどうか (ページ名は制...
if ($search_auth && ! check_readable($page, false, fa...
- $source = get_source(); // Empty
+ $stat = NULL;
} else {
- $source = get_source($page);
+ if (($fp = fopen(DATA_DIR . $file, 'rb')) === FALSE)
+ continue; // ページが消えている?
+ flock($fp, LOCK_SH);
+ $stat = fstat($fp);
+ $source .= fread($fp, $stat['size']);
+ fclose($fp);
}
- if (! $non_format)
- array_unshift($source, $page); // ページ名も検索対象に
- $b_match = FALSE;
foreach ($keys as $key) {
- $tmp = preg_grep('/' . $key . '/', $source);
- $b_match = ! empty($tmp);
+ $b_match = preg_match($key, $source);
if ($b_match xor $b_type) break;
}
- if ($b_match) $pages[$page] = get_filetime($page);
+ if ($b_match) $pages[$page] = isset($stat) ?
+ $stat['mtime'] - LOCALZONE : get_filetime($page);
}
if ($non_format) return array_keys($pages);
--------
** コメント [#d905ba4f]
- 違うところからアプローチしていたのですが、改造点2につい...
- 移行してコミットしました。-- [[teanan]] &new{2006-04-14...
-- [[cvs:lib/func.php]] (1.55)
-- [[cvs:lib/html.php]] (1.55)
-- 'preg_grep' => 'preg_match'へ修正(改善点2)
-- get_search_words()でアルファベットの大文字/小文字の考...
その代わり、preg_matchにおいて、大文字/小文字を区別しない...
- 改善点3(freadで一括読み出し)の件、実装しました。get_sou...
-- [[cvs:lib/file.php]] (1.61)
-- [[cvs:lib/func.php]] (1.56)
- 私は約2000ページのテスト環境ですが、ここまでの対応で大...
- 本来あるべき実装かどうかを確認し追究する、という良いサ...
|Search words|func.php| Hits/2020 | Time |h
| | |RIGHT:|RIGHT:|c
| "BugTrack" | r1.54 | 1428pages | 20.4sec |
|~| r1.57 |~| 6.2sec |
| "開発日記" | r1.54 | 618pages | 3.9sec |
|~| r1.57 |~| 2.0sec |
| "Web委員" | r1.54 | 52pages | 4.1sec |
|~| r1.57 | &color(red){51pages};|&color(red){...
| "b委" | r1.54 | 52pages | 5.8sec |
|~| r1.57 | &color(red){51pages};|&color(red){...
| "b" | r1.54 | 1845pages | 18.3sec |
|~| r1.57 |~| 3.3sec |
| "委" | r1.54 | 58pages | 3.6sec |
|~| r1.57 |~| 1.8sec |
- おはようございます。検証ありがとうございます。get_searc...
-- %%get_search_words() に対する修正だけを含んでいる func...
- 他に気になっている部分・・・(観察中) -- [[henoheno]] &n...
-- get_source(): それぞれの挙動のポイントをコメントにした...
-- get_source(): $join 時に str_replace("\r", '') してい...
-- do_search(): ページ名だけで検索条件が成立するならば、...
-- [[cvs:func.php]] (r1.55) のコメントログの指摘「'get_se...
--- mb_convert_kana('A') の部分ですね -- [[henoheno]] &ne...
--- あ、foreachがなくなっているので、entity reference の...
- get_search_words() についてはbackoutするのがいいかもし...
-- なるほど、ご指摘のとおりです。元に戻します。ありがとう...
-- [[cvs:lib/func.php]] (1.58)
-- [[cvs:lib/html.php]] (1.56)
-- 正規表現を長くするよりも、preg_matchで大小区別しない方...
- 言われてみれば顔文字に見えますね (^^; これで「Web委員」...
-- back out した時は、コミットログにどのリビジョンに対す...
-- 了解です。コミットログを修正しました。正規表現のオプシ...
-- back out する修正は直前のものとは限りませんから、back ...
-- すみません、なかなか難しいです (^^; お手数をおかけしま...
- どの件もそうですが、日常生活に支障が出ない程度に、休み...
-- お気遣いありがとうございます。やれる範囲でやらせて頂い...
- 現在の状況は以下の通り。do_search() の中にある get_sear...
|Search words|func.php| Hits/2020 | Time |h
| | |RIGHT:|RIGHT:|c
| "BugTrack" | r1.54 | 1428pages | 20.4sec |
|~| r1.58 |~| 7.5sec |
| "開発日記" | r1.54 | 618pages | 3.9sec |
|~| r1.58 |~| 2.1sec |
| "Web委員" | r1.54 | 52pages | 4.1sec |
|~| r1.58 |~|&color(red){13.0sec};|
| "b委" | r1.54 | 52pages | 5.8sec |
|~| r1.58 |~|&color(red){14.8sec};|
| "b" | r1.54 | 1845pages | 18.3sec |
|~| r1.58 |~| 3.7sec |
| "委" | r1.54 | 58pages | 3.6sec |
|~| r1.58 |~| 1.9sec |
- PCRE装飾子 S または i を付けるかどうかによって速度が変...
-- [[cvs:lib/func.php]] (1.59)
-- [[cvs:lib/html.php]] (1.57)
http://jp.php.net/manual/ja/reference.pcre.pattern.mod...
パターン修飾子
S
あるパターンを複数回使用する場合は、マッチングにかか...
高速化することを目的として、パターンの分析に幾分か時...
良いでしょう。この修飾子を設定すると、追加のパターン...
行われます。現在、パターン分析は、最初の文字が単一で...
かつ固定でないパターンに対してのみ有用です。
-- そう、マニュアルには具体的に何をやっているか書かれてい...
- 次に、一致したページ名を記録する部分で、$non_formatがtr...
-- [[cvs:lib/func.php]] (1.60)
- 今回の修正の中で、ページ名とページ本文を収めた変数が直...
-- ご指摘ありがとうございます。確かにそのとおりです (^^; ...
--- [[cvs:lib/func.php]] (1.61)
-- r1.61で、今までのコンセプトに沿った本来の実装になった...
- 現状は以下の通り。 "S" オプションは他の要所でも使えそう...
|Search words|func.php| Hits/2020 | Time |h
| | |RIGHT:|RIGHT:|c
| "BugTrack" | r1.54 | 1428pages |20.3sec |
|~| r1.61 |~| 2.6sec |
|~| r1.64 |~| 1.9sec |
|~| r1.67 |~| 1.9sec |
| "開発日記" | r1.54 | 618pages | 3.9sec |
|~| r1.61 |~| 2.1sec |
|~| r1.64 |~| 1.8sec |
|~| r1.67 |~| 1.8sec |
| "Web委員" | r1.54 | 52pages | 4.1sec |
|~| r1.61 |~| 2.2sec|
|~| r1.64 |~| 2.1sec|
|~| r1.67 |~| 2.2sec|
| "b委" | r1.54 | 52pages | 5.8sec |
|~| r1.61 |~| 2.1sec|
|~| r1.64 |~| 2.1sec|
|~| r1.67 |~| 2.2sec |
| "b" | r1.54 | 1845pages | 18.1sec|
|~| r1.61 |~| 2.7sec |
|~| r1.64 |~| 1.9sec |
|~| r1.67 |~| 1.9sec |
| "委" | r1.54 | 58pages | 3.6sec |
|~| r1.61 |~| 1.9sec |
|~| r1.64 |~| 1.8sec |
|~| r1.67 |~| 1.9sec |
- $search_non_list, $search_auth の除外処理を事前に行って...
- tracker_listとかにSオプションつけると効果がありそうです...
- というわけで、他のこまごました修正と、ピーク時に大変に...
- おっと、検索結果が $show_passage の設定を無視している事...
- 確認しました、お疲れ様です。私もこの辺で一段落付いたと...
- ざっと見ただけですが、蒸し返し用に[[改造点>#oaf054bd]]...
-- はい、私も同じ認識です。 -- [[teanan]] &new{2006-04-17...
-- にぶんのにさん、チェックありがとうございます。Cueさん...
- searchプラグインで検索対象のページを指定した場合、正し...
- [[BugTrack2/330]] -- &new{2010-08-17 (火) 22:05:08};
#comment
** 取り込まれたコードを見て [#d943037f]
取り込み作業お疲れ様でした。遅まきながら感想など。
*** fstat()とstat()の速度差に関する補足説明 [#i2558509]
4番目の改造点を効果微妙と評しましたが、これは''多数のペ...
私[[Cue]]が書き込んだパッチの当該部分を見てもらうと$b_mat...
*** どの程度無視できないのか? [#wd8e417c]
速度の計測は裏で何が動いているか把握できる隔絶された環境...
下の結果は''`''と''*''を使ってPlus!の公式サイトで検索した...
|検索文字|convert time|hitしたページ数|h
|`|0.21sec程度|7|
|*|0.30sec程度|689|
多数のページにヒットする検索があまりないなら構う事もない...
*** links_update()からの呼び出し [#hf0b2cd4]
link.phpには踏み込みたくなかったので5番目の改造点で留めて...
ページ名: