あき
attin****@kk*****
2005年 11月 6日 (日) 02:11:30 JST
あきです。 私がFSWikiに興味を持ったきっかけでもありますが、現在、仕事でよくPerlを 使っています。 FSWikiを知った当時はまだ、Perlでプログラミングできることが「楽しみ楽しみ で…」という状況で、それほど奥深い部分にはまだ興味が無く、また必要もない、 という状況下で使っていました。 が、最近、メイン開発言語がPerlにシフトしてきている関係もあり(てか、私が 勧めてるんですが)、モジュールの使用やクラスの使用、高速化等のカスタイズ も本格的に行うようになって来ました。(そういった意味では、FSWikiのソース からはかなり勉強させてもらっています。ありがとうございます) そんなこんなで、ここのところ高速化について研究したりしているのですが、 よく竹添殿がFSWikiの速度について気にされている、という現状にもマッチして いるかと思いますので、参考になりそうなものを挙げておきたいと思います。 以下、技術的内容です。 サブルーチンから戻り値で、ページの全内容を返してもらうような場合、 「普通に戻り値を変数に代入する、といった使用法では丸々コピーが発生します ので、パフォーマンス低下の主な原因となってしまいます。 $page_data = &get_page_data($fname); ↑これでは遅い これを、書き込み先を参照渡しするなどしてサブルーチン内で直接その変数に 書き込んでもらうと飛躍的に速度が向上します。 &get_page_data(\$page_data, $fname); ↑こんな感じ &get_page_data($page_data, $fname); ↑サブルーチン内の記述によってはこう書かせる手段もある でもこれだと、「中で書き込んでもらってる」というのがイメージがしに くいかな、と…。 サブルーチンを呼ぶのが1段階くらいなら問題にならないかもしれませんが、 構造化プログラミングを拡張していくと、これらが何段階にもなって、 パフォーマンスの低下が無視できないものになってきますよね? 試しにベンチマークをとってみましたので、そのソースと結果を掲載しておき ます。 1回目 1:abcacabcab→bbcbcbbcbb 35 2:abcacabcab→bbcbcbbcbb 22 1:abcacabcab→bbcbcbbcbb 35 2:abcacabcab→bbcbcbbcbb 22 1:abcacabcab→bbcbcbbcbb 36 2:abcacabcab→bbcbcbbcbb 23 1:abcacabcab→bbcbcbbcbb 67 2:abcacabcab→bbcbcbbcbb 48 1:abcacabcab→bbcbcbbcbb 77 2:abcacabcab→bbcbcbbcbb 42 2回目 1:abcacabcab→bbcbcbbcbb 35 2:abcacabcab→bbcbcbbcbb 23 1:abcacabcab→bbcbcbbcbb 37 2:abcacabcab→bbcbcbbcbb 23 1:abcacabcab→bbcbcbbcbb 35 2:abcacabcab→bbcbcbbcbb 24 1:abcacabcab→bbcbcbbcbb 64 2:abcacabcab→bbcbcbbcbb 45 1:abcacabcab→bbcbcbbcbb 72 2:abcacabcab→bbcbcbbcbb 44 先頭が1:通常の戻り値として受け取った場合。 先頭が2:参照渡しで書き込んでもらった場合。 末尾の数字:実行にかかった秒数。 それぞれ5回ずつを2セット流した結果です。 (それぞれのセットで後半遅くなっているのはこちらのリソースの問題?) ただ、FSWikiの場合、パフォーマンスのネックになっているのは上記のような 代入文とかではなくて、明らかにファイルI/Oの多さがネックになっていると 思います。 これについては、改善方法は無いものでしょうか? 余談: 以前、RAMディスク上に置いて試運用したことがあったのですが、とても高速で した。同様に、USBメモリ上に置いて動かしてみると、使い物にならないほど 激遅でした。(笑) -------------- next part -------------- テキスト形式以外の添付ファイルを保管しました... ファイル名: sample.pl 型: application/octet-stream サイズ: 849 バイト 説明: 無し Download