2009-06-12 14 views
8

私はいつもこれを疑問に思ってきました。私はいつも追加する習慣を持っています。私が書いたすべてのスクリプトの先頭には、常に追加する習慣があります。一番上の「使用....」はPerlスクリプトのオーバーヘッドを追加しますか?

use strict; 
use warnings; 
use Data::Dumper; 

Dumper機能を使用していない場合でも、オーバーヘッドがかかりますか?また、ほとんどの場合、Data :: Dumperは別のパッケージで先に呼び出されましたが、私はこのパッケージに必要です。この場合、追加のオーバーヘッドが発生しますか?

答えて

10

これらのルーチンにBEGINブロックまたはimportルーチンがある場合、それは常にオーバーヘッドを追加します。また、任意のメインラインコードが最終的に実行され、INITCHECK、およびENDブロックも実行されます。

オーバーヘッドを追加しない唯一の方法は、userequireのようなものに過ぎないと予測する場合です。 (もちろん、requireimportルーチン以外のすべてを実行しますが、私はuse -dモジュールからの眺めを言及した理由です。それは簡単requireが、何もありませんし、「期待する」。)

あなたがしたい場合はその行を保持して、なんらかの理由でコメントアウトしてください。開発時には、使用しないモジュールを用意しても構いません。 QAや生産では、それは間違いです、IMO。

+1

しかし、開発は可能な限り生産を反映しなければなりません。私はData :: Dumperのようなものを開発に含まれているよりも常に含んでいます。 – ysth

+1

確かに、それをチェックアウトすると、 "#use Data :: Dumper;"その中に。あなたはしばしば開発中のものを変えようとしているので、行のコメントを外してください。本番環境でどのように動作するのかを確認したい場合は、再度コメントアウトしてください。 – Axeman

9

PerlはコードをDumper.pmに解析する必要があるため、プログラムの起動が遅くなります。これは通常、パフォーマンスにとって非常に些細なヒットです。また、関数またはインポート関数にないコードも実行されます。これは起動時間に軽微な影響を与える可能性があります。さらに多くのメモリ(コードとそのコードが構築するデータ構造のAST)を消費します。あなたができる最善のことではありませんが、それは最悪のものから遠いです。あなたのプログラムが非常に頻繁に(1分に複数回)されていない限り、その行を削除することでスピードの実際の改善に気付かないでください。

1

これは、スクリプトが繰り返し実行され、待ち時間や実行時制約がある場合に重要になります。

たとえば、Webページがレンダリングされるたびにプロセスがフォークされる場合は、未使用のモジュールを削除して読み込み中に解析するコードの量を最小限に抑えたいことがあります。

xargsの右側でperlを実行している場合。

Webサーバーの状況でこのようなオーバーヘッドを削除する方法は他にもあります。

4

スクリプトを起動するまでに時間がかかるため、スクリプトのメモリフットプリントが増加する可能性があります。オーバーヘッドをテストするには、次のスクリプトを実行します。

C:\Temp> cat zzz.pl 
#!/usr/bin/perl 
sleep 10; 

C:\Temp> timethis zzz.pl 
TimeThis : Elapsed Time : 00:00:10.172 

タスクマネージャのメモリフットプリントは2548Kでした。

今再び

use Data::Dumper; 

とテストを追加します。

TimeThis : Elapsed Time : 00:00:10.266 

この時間は、メモリフットプリントは3408Kでした。したがって、あなたが使用しているモジュールが本当に使われていないのであれば、時間とメモリを無駄にするでしょう。

起動時間は、繰り返し実行されるスクリプト(CGIなど)と、長時間実行されるスクリプトやスクリプトでのメモリフットプリントの重要な点です。

1

あなたがそれに気をつけていただければ幸いです。はい、それはいくらかのオーバーヘッドを追加します。コード:それはそれはまだ行っていない場合を除きにおけるコンパイル時のデータ:: Dumperのモジュールが解析され、身体が実行されていることを、意味

BEGIN { 
    require Data::Dumper; 
    Data::Dumper->import(); 
} 

use Data::Dumper; 

のほぼ完全に同等です。これは、多くのモジュールがあり、このオーバーヘッドごとにData :: Dumperを使用すると、一度だけ発生することを意味します。既に完了していることを確認することは、非常に速く、本当に非常に速いです。 2行目はインポート呼び出しを行い、現在のパッケージの名前空間(呼び出し側が取得)にインポートをインストールします。使用されるすべてのモジュールでは時間がかかります。あなたがDumper()を呼び出すことはできませんたより

use Data::Dumper(); 

いますが、Data::Dumper::Dumper()を使用する必要があります:あなたは避けたい場合には、使用しています。私はData::Dumper->Dump([vars], [names])を使って、もっと好きな出力を得るのが好きです。

0

これはあなたが尋ねたものではありませんが、私はData :: Dumperに頼りにして、傷つけるほどの価値のある松葉杖であることがわかりました。 Perlは悪意のあるコードではなくフレンドリーなコードを推測するという哲学に従うので、プログラマーはData :: Dumpを使って内部構造の保存方法を発見し、内部構造に直接アクセスするのではなく、提供されたインターフェイスData :: DumperはInside-Outオブジェクトが作成された理由の1つであり、鋭いが、気難しかったプログラマーが内部を巡回するのが難しい/不可能にするための理由の1つです。

関連する問題