[Fswiki-dev] Perl Tips 参照渡し

Zurück zum Archiv-Index

あき 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 


Fswiki-dev メーリングリストの案内
Zurück zum Archiv-Index