25

CGIプログラムのDevel::NYTProf v4の出力を見ていたとき、レポートのソースコードファイルに出くわしました—排他的な時間と名前の順に並べられています。diagnostics.pm

Diagnostics.pm

最初は、なぜそれが本番コードに含まれるのか理解できませんでした。レポートを詳しく調べてみると、によって呼び出されていることがわかりましたmain::BEGIN@17。これは、次の行です。

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

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

# spent 36µs making 1 call to main::BEGIN@16 # spent 19µs making 1 call to warnings::import

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

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

したがって、これが原因のようです。回線を削除するno diagnosticsと、通話が切れ、実質的に約300ミリ秒の時間を節約できました。

perldocusenoがキーワードについて言っていることは次のとおりです。

使用によってインポートされた意味をインポート解除する対応するno宣言があります。つまり、インポートの代わりにunimportModuleLISTを呼び出します。インポートがVERSIONの場合と同じように動作するか、リストが省略または空であるか、インポートされていないメソッドが見つかりません。

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

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

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

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

結果として、インポートされたことのないものを単にアンインポートするのは悪い考えですか?それは実際に最初にロードされるからです。

4

1 に答える 1

22

no diagnosticsを呼び出すと、アンインポートされる前に実際にロードされると仮定するのは正しいですか?

はい。それは確かに完全に同等です

BEGIN {
  require diagnostics;
  diagnostics->unimport;
}

したがって、no moduleコマンドは実際にモジュールをロードしてコンパイルします。subや BEGIN ブロックなどに含まれていないコードの実行を含む。特定のモジュールのすべての依存関係について同じです(すべての使用/内部で必要です)。

于 2012-11-26T14:38:06.217 に答える