トップページ⇒tech
18コメント7KB

perlから実行ファイルを作りたい

■ このスレッドは過去ログ倉庫に格納されています
0001テスト担当者NGNG
perlで書かれたソースから、実行ファイルを作りたいです。
現在perlで動いている処理があるのですが、動作が遅く、
高速化したいと考えています。
でもお客さんの期限が短く、Cとかで書き直す時間がありません。

とりあえず perlcc の存在を知り、試していますが、
実行ファイルは作られるものの、現在正しく動いてくれません。
また、ネットを探していると、
「perlcc使ってもあまり速くならないこともある」ということを
複数のページで見つけました。

perlcc のほかに、perlで書かれたものから実行ファイルを生成
してくれるものをご存知の方は教えてください。

また、perlの処理の高速化についてもヒントとかあれば教えてほしいです。

なお、OS は Linux(intel)です。

#UNIX板の話題かな?
0002デフォルトの名無しさんNGNG
chmod +x
0003あくまで憶測NGNG
perlccするだけで高速になる?遅くなりそう。
00043NGNG
あ、1でがいしゅつか。スマソスマソ。
0005デフォルトの名無しさんNGNG
>>1
プロファイラを使ってボトルネックを探せ。
そこの処理を最適化せよ。それでも遅いならCで拡張せよ。
0006デフォルトの名無しさんNGNG
Windowsならperl2exeやSOSを使う手があるな。
Linuxなら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テスト担当者NGNG
>>6
Linuxならchmod +xしてPerlのパスを合わしておけばいいだけじゃん。

そういうわけじゃなくて、インタプリタとして実行時に構文チェックとか
させるのではなく、コンパイル済みにしたいから実行ファイルをつくりたい、
というわけなのです。
0009デフォルトの名無しさんNGNG
C言語に移植すればいいじゃん。
0010デフォルトの名無しさんNGNG
PerlスクリプトのOPコードへのコンパイルにかかる時間なんて、そんなに気にするほど長くないと思うがなあ。
高速化したければ、perl -d:DProf script_name.pl でプロファイルを取ってボトルネックになっている箇所を
部分的にCで、XS, Swig, Inline::C とかを利用して書き直すのが一番良いんじゃないかな。
0011テスト担当者NGNG
>C言語に移植すればいいじゃん。

まぁそうなんですが、1にも書いてあるとおり、それだと
期限に間に合わないのです....
あと規模もでかいし、文字列をMIMEエンコードとかしてるんだけど、
perlだと超楽なのにCだとちょっとめんどうだし。
もっともCのそういう関数のサンプルは転がってますが。

というわけで5時間の格闘でだいぶ速くなったのですが、
Cで書き直したらもっと速くなるかもしれん....
0012デフォルトの名無しさんNGNG
>>11
そういうときこそ、Javaで書き直せばいいと思うよ。
0013デフォルトの名無しさんNGNG
>>12
それこそ、1の要求に沿わないのではないか?
0014デフォルトの名無しさんNGNG
便乗質問でスミマセンが、perlからWindowsのDLLにする方法とかないんですかねえ?
exeでもいいですが。

相手のPCにActivePerl等がインストールされていない状況で、VCとかからPerlを利用したいんですが。

やっぱり移植するしかないのかな…。
0015デフォルトの名無しさんNGNG
>>14
perl2exeで検索。シェアだが。
0016デフォルトの名無しさんNGNG
>>15
サンクス。こんなのがあったんですね。
シェアウェアなのが残念。
0017デフォルトの名無しさんNGNG
Perl For DotNet という手もあるがなあ.........。
http://aspn.activestate.com/ASPN/Downloads/PerlNET/
0018☆〜(σ σ)NGNG
そんな方法があったのね・・・
ためになりました。
■ このスレッドは過去ログ倉庫に格納されています