ErlangからPerlを使う
ただ、今のところは、RBridgeにせよErlang::Portにせよ、粗結合型のbridgeなので、作りやすく使いやすい一方、密結合--組み込み型もちょっと欲しくなってくる。これはむしろErlang⇔Perlの通信に絡むoverheadの方が大きいと思う。粗結合型の一番の欠点がこれ。小さなタスクだと、サーバー側(RBridgeではerlang, Erlang::Port では perl)の処理よりも通信コストの方が高い。これを何とかしたいところなのだけど....
もちろん,密結合の組み込み型でも試してもらってある.
「限界までチューン」してもらうところで,Perlを別プロセスではなくライブラリで呼び出す形への埋め込み,通信内容をバイナリにしたり,Erlang側のコードの最適化,Perl側のコードのXS化などあらゆる手を尽くしてもらった・・・と思う.
それでも,残念ながら十分に速くならなかった.
Perl側で正規表現を実行するためには,Erlang側から2つの文字列を渡し,関数を1回呼び出し,その結果を戻す必要がある.
この2つの文字列を渡して関数を呼び出して戻す,というだけでかなり時間がかかってしまう.
Perlは,正規表現を直接使うI/FがXSレベルで用意されていないようなので,これ以上の改善は無理そう.
(さすがにPerlのソースを切り貼りしてやるのは死ぬほど大変そうなので)
oregexpは,正規表現ライブラリの鬼車を使うものだけど,正規表現をコンパイルした結果をキャッシュして使うことが可能で,これを使うと非常に速かった.
正規表現のエンジン自体はPerlの方がずっと良いと思うのだけど,密結合させても呼び出し時のオーバーヘッドが大きすぎてダメだった.
正規表現のループだけなら,0.2秒なのに,呼び出しオーバーヘッドで1.2秒ほどかかるような状況なので...
% 詳しくは氷魚にゃがブログに書いてくれると思う.たぶん.
今度は逆に、Perl側からErlangを呼び出すモジュールも欲しい。このあたりが参考になる。
これは何に使うのでしょう?
Perl側からErlangを呼び出せてもうれしくなさそうなものだけども...
ErlangはVM環境とセットになっているので,起動・終了のオーバーヘッドが大きいので,Erlangを内部で使ってもあまりうれしくない気がする.
1回起動して,そのインスタンスと通信を行うような形にすると,Perl側がメッセージを受け取るためにイベントループみたいなのを用意しないといけないし,使い勝手が悪いように思う...
相互で通信したいのであれば,Perl側を Erlang の C Node のような形にして,Erlang Node と対等に通信させるのが一番じゃないかと思うのだけど,どうでしょう.
まぁ,これでも使うのは結構めんどくさそうだけども...
The comments to this entry are closed.
Comments