perlから実行ファイルを作りたい
■ このスレッドは過去ログ倉庫に格納されています
0001テスト担当者
NGNG現在perlで動いている処理があるのですが、動作が遅く、
高速化したいと考えています。
でもお客さんの期限が短く、Cとかで書き直す時間がありません。
とりあえず perlcc の存在を知り、試していますが、
実行ファイルは作られるものの、現在正しく動いてくれません。
また、ネットを探していると、
「perlcc使ってもあまり速くならないこともある」ということを
複数のページで見つけました。
perlcc のほかに、perlで書かれたものから実行ファイルを生成
してくれるものをご存知の方は教えてください。
また、perlの処理の高速化についてもヒントとかあれば教えてほしいです。
なお、OS は Linux(intel)です。
#UNIX板の話題かな?
0002デフォルトの名無しさん
NGNG0003あくまで憶測
NGNG00043
NGNG0005デフォルトの名無しさん
NGNGプロファイラを使ってボトルネックを探せ。
そこの処理を最適化せよ。それでも遅いならCで拡張せよ。
0006デフォルトの名無しさん
NGNGLinuxならchmod +xしてPerlのパスを合わしておけばいいだけじゃん。
0007テスト担当者
NGNG先ほどまでの状況では、perlccして実行ファイルは作られるものの、
実行すると
panic: mapstart at /usr/lib/perl5/5.6.0/File/Basename.pm line 220.
となってエラーが出ていました。
実際に perlプログラム内で、自プログラム名を得るために
File::Basename を使っていたのですが、ここで詰まっているみたいです。
perlccするときに、いろいろエラーが出たので
========================
No definition for sub Fcntl::LOC_SH
とかがだーっと...
========================
モジュール類が見つけられないかなと思っていたのですが、
自プログラムを得るのははっきり言って固定文字列だし、1箇所しか
使ってないので、とりあえずハードコーディングしてみたら、
作られた実行ファイルがきちんと動作しました!!
上記の No definition も出まくっているのですが、
perlプログラム内で使っているモジュール類もうまく機能している
模様です。
とりあえず速度は体感してわかるほど、速くなっています。
# time ./myProg -v
myProg.pl version is 3.0.1
0.31user 0.05system 0:00.36elapsed 98%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (565major+202minor)pagefaults 0swaps
# time ./myProg.pl -v
myProg.pl version is 3.0.1
1.01user 0.07system 0:01.09elapsed 98%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (333major+352minor)pagefaults 0swaps
バージョン表示だけさせる処理をさせるとこんなかんじ。
つーか time コマンドの見方教えて....
別の処理をかますと、なんかCPU使用率が小さいような気がすることを示す
結果が出ました。
# time cat testdata | ./myProg
0.01user 0.01system 0:00.04elapsed 45%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (104major+15minor)pagefaults 0swaps
# time cat testdata | ./myProg.pl
0.01user 0.01system 0:00.01elapsed 142%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (104major+15minor)pagefaults 0swaps
あ、でもこれって cat コマンドの時間だけしか調べてないのかも....
いずれにせよ、なんか速いです。
現在、よりちゃんとした性能評価、結合テストの再テストを行っています。
0008テスト担当者
NGNGLinuxならchmod +xしてPerlのパスを合わしておけばいいだけじゃん。
そういうわけじゃなくて、インタプリタとして実行時に構文チェックとか
させるのではなく、コンパイル済みにしたいから実行ファイルをつくりたい、
というわけなのです。
0009デフォルトの名無しさん
NGNG0010デフォルトの名無しさん
NGNG高速化したければ、perl -d:DProf script_name.pl でプロファイルを取ってボトルネックになっている箇所を
部分的にCで、XS, Swig, Inline::C とかを利用して書き直すのが一番良いんじゃないかな。
0011テスト担当者
NGNGまぁそうなんですが、1にも書いてあるとおり、それだと
期限に間に合わないのです....
あと規模もでかいし、文字列をMIMEエンコードとかしてるんだけど、
perlだと超楽なのにCだとちょっとめんどうだし。
もっともCのそういう関数のサンプルは転がってますが。
というわけで5時間の格闘でだいぶ速くなったのですが、
Cで書き直したらもっと速くなるかもしれん....
0012デフォルトの名無しさん
NGNGそういうときこそ、Javaで書き直せばいいと思うよ。
0013デフォルトの名無しさん
NGNGそれこそ、1の要求に沿わないのではないか?
0014デフォルトの名無しさん
NGNGexeでもいいですが。
相手のPCにActivePerl等がインストールされていない状況で、VCとかからPerlを利用したいんですが。
やっぱり移植するしかないのかな…。
0015デフォルトの名無しさん
NGNGperl2exeで検索。シェアだが。
0016デフォルトの名無しさん
NGNGサンクス。こんなのがあったんですね。
シェアウェアなのが残念。
0017デフォルトの名無しさん
NGNGhttp://aspn.activestate.com/ASPN/Downloads/PerlNET/
0018☆〜(σ σ)
NGNGためになりました。
■ このスレッドは過去ログ倉庫に格納されています