2012-11-26 2 views
25

Devel::NYTProf v4の出力をCGI programにすると、ソースコードファイル -という名前のレポートでdiagnostics.pmが見つかった。私のコードに診断機能がないとPerlがdiagnostics.pmをコンパイルするのはなぜですか?

diagnostics.pm

まずそれは製品コードになりますなぜ私は理解していませんでした。私は報告書をさらに深く掘り下げ、それがmain::[email protected]によって呼び出されたことを知った。これは次の行です。

# spent 34µs (26+8) within main::[email protected] which was called: # once (26µs+8µs) by main::RUNTIME at line 15 
use strict; 
# spent 34µs making 1 call to main::[email protected] # spent 8µs making 1 call to strict::import 

# spent 36µs (17+19) within main::[email protected] which was called: # once (17µs+19µs) by main::RUNTIME at line 16 
use warnings; 

# spent 36µs making 1 call to main::[email protected] # spent 19µs making 1 call to warnings::import 

# spent 292ms (171+121) within main::[email protected] which was called: # once (171ms+121ms) by main::RUNTIME at line 17 
no diagnostics; 
# spent 292ms making 1 call to main::[email protected] 

# spent 135µs (27+108) within main::[email protected] which was called: # once (27µs+108µs) by main::RUNTIME at line 18 
use Carp qw(carp croak); 

これは原因であるようです。私はno diagnostics行を削除し、コールは消え、効果的に約300msの時間を節約しました。 、

使用して、インポートの意味 をunimports該当する宣言がありませんつまり、それは代わりに 輸入のunimportモジュールリストを呼び出します。ここでは

perldoc usenoキーワードについて言っているのです。これは、VERSION、省略または の空のLIST、またはインポート方法が見つからない場合のインポートと同じように動作します。

no integer; 
no strict 'refs'; 
no warnings; 

だからここに私の実際の質問です:私はno diagnosticsを呼び出す場合、それはunimport EDがある前に、それが実際にロードされていると仮定して、正しいですか?

no diagnosticsへの呼び出しは、このコードと似ていますか?

BEGIN { 
    require diagnostics.pm; 
    diagnostics->unimport; 
} 

結果的に、インポートされていないものをインポートするのは悪い考えですか?それは実際に最初に読み込まれるためです。

+1

誰もが指摘する前に:私は(まだ)何かを最適化しようとはしていませんが、私は単に何が呼び出されているのかを理解しようとしています。 – simbabque

答えて

22

私がno diagnosticsを呼び出すと、それは実際に読み込まれる前にロードされていると仮定して正しいですか?

はい。

BEGIN { 
    require diagnostics; 
    diagnostics->unimport; 
} 

への実際の完全な同等だから、no moduleコマンドが実際にロードし、モジュールをコンパイルします。 サブにないコードをBEGINブロックなどで実行することを含みます。与えられたモジュールのすべての依存関係について同じです(を使用する場合は、/にはが必要です)。

+4

"普通"の場合、モジュールはどこかで '使用 'しているので既に読み込まれているので、' require'はno-opで 'unimport'だけが重要です。しかし、モジュールが前の時点で 'require'dされていなかったと仮定すると、' no'がそうするでしょう。 – hobbs

+0

私のためにそれをクリアしていただきありがとうございます。 – simbabque

関連する問題