2012-11-26 22 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一行,並且呼叫不見了,有效地節省了大約300毫秒的時間。

這裏是perldoc use說對no關鍵字:

有一個相應的不聲明unimports通過使用進口含義 ,即,它會調用unimport模塊列表,而不是 進口。它的行爲與VERSION相同,省略或 空LIST或找不到unimport方法。

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

因此,這裏是我的實際問題:我是在假設如果我叫no diagnostics,它實際上是加載之前,它是unimport版糾正?

是否調用no diagnostics類似於這段代碼?

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

因此,是否只是取消導入從未導入過的東西是一個壞主意,因爲它實際上首先加載它?

+1

之前有人指出:我沒有試圖優化任何東西(但),我只是試圖瞭解什麼是所謂的。 – simbabque

回答

22

我是否正確地假設如果我打電話給no diagnostics,它實際上是在它未被導入之前加載的?

是的。它確實充分等同於

BEGIN { 
    require diagnostics; 
    diagnostics->unimport; 
} 

所以no module命令實際負載和編譯的模塊;包括執行不在任何sub中的代碼,BEGIN塊等;對於給定模塊的所有依賴關係相同(對於每個使用/需要裏面)。

+4

在「普通」情況下,模塊已經被加載,因爲你在某處使用了它,所以'require'是一個空操作,只有'unimport'很重要。但是,是的,假設模塊在以前的任何時候都沒有被要求,「不」會這樣做。 – hobbs

+0

感謝您爲我清理。 – simbabque

相關問題