CGIプログラムのDevel::NYTProf v4の出力を見ていたとき、レポートのソースコードファイルに出くわしました—排他的な時間と名前の順に並べられています。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ミリ秒の時間を節約できました。
perldocuse
no
がキーワードについて言っていることは次のとおりです。
使用によってインポートされた意味をインポート解除する対応するno宣言があります。つまり、インポートの代わりにunimportModuleLISTを呼び出します。インポートがVERSIONの場合と同じように動作するか、リストが省略または空であるか、インポートされていないメソッドが見つかりません。
no integer; no strict 'refs'; no warnings;
だからここに私の実際の質問があります:私が呼び出すとno diagnostics
、それがunimport
編集される前に実際にロードされると仮定して正しいですか?
の呼び出しはno diagnostics
このコードに似ていますか?
BEGIN {
require diagnostics.pm;
diagnostics->unimport;
}
結果として、インポートされたことのないものを単にアンインポートするのは悪い考えですか?それは実際に最初にロードされるからです。