|
讀取文件命令測(cè)試比較,僅供參考 ; 因?yàn)槲募袛?shù)少了測(cè)試不出來(lái)效果,我特意做了包含整1萬(wàn)行的數(shù)據(jù),大小170K。 本機(jī)雷鳥(niǎo)1.1GHZ,內(nèi)存256兆,IIS5.0 perliisdll環(huán)境 #################### 方案一 while 輸出 最常用 open (FILES, "index"); while (<FILES>){ print; } close(FILES); 程序占用 CPU 時(shí)間:0.23 usr + 0.22 sys 合計(jì)運(yùn)行時(shí)間 450 毫秒 ####################### 方案二: 數(shù)組讀取輸出 open (FILES, "index"); @reads=<FILES>; print @reads; 程序占用 CPU 時(shí)間:4.18 usr + 0.09 sys 合計(jì)運(yùn)行時(shí)間 4270 毫秒 這個(gè)方法也常用,但效率最低的 換為@_; open (FILES, "index"); @_=<FILES>; print @_; 程序占用 CPU 時(shí)間:3.64 usr + 0.11 sys 合計(jì)運(yùn)行時(shí)間 3750 毫秒 節(jié)省一點(diǎn)時(shí)間:) ################################ 方案三: open (FILES, "index"); @_=<FILES>; #print @_; close(FILES); foreach (@_){ print; } 程序占用 CPU 時(shí)間:3.79 usr + 0.15 sys 合計(jì)運(yùn)行時(shí)間 3940 毫秒 很奇怪,和上面相同,說(shuō)明,只要打印數(shù)組,就和foreach處理方式相同 ############################## 方案4 不打印 open (FILES, "index"); @_=<FILES>; #print @_; close(FILES); 程序占用 CPU 時(shí)間:3.45 usr + 0.00 sys 合計(jì)運(yùn)行時(shí)間 3450 毫秒 還是相同 更奇怪,少一次循環(huán),為什么時(shí)間還相同 ######################################### 方案6,用變量代替數(shù)組直接讀取輸出。 open (FILES, "index"); $/=""; $reads=<FILES>; print $reads; close(FILES); $/="\n"; 程序占用 CPU 時(shí)間:0.04 usr + 0.00 sys 合計(jì)運(yùn)行時(shí)間 40 毫秒 真快丫 ############################################## 方案7 用分割變量來(lái)從新生成數(shù)組,代替數(shù)組@_=<FILES> 直接讀取方式,循環(huán)輸出 open (FILES, "index"); $/=""; $reads=<FILES> close(FILES); $/="\n"; @_=split ( /\n/,$reads); foreach (@_){ print $_; } 程序占用 CPU 時(shí)間:0.34 usr + 0.11 sys 合計(jì)運(yùn)行時(shí)間 450 毫秒 有趣,比普通@_=<FILES> 直接讀的方法要快10倍,但很是不解 如果數(shù)組不全部輸出,單純賦值占用時(shí)間很短 open (FILES, "index"); $/=""; $reads=<FILES> close(FILES); $/="\n"; @_=split ( /\n/,$reads); 程序占用 CPU 時(shí)間:0.05 usr + 0.00 sys 合計(jì)運(yùn)行時(shí)間 50 毫秒 ############################################### 散列 -------------------------------------------------------------------------------- open (FILES, "index"); while (<FILES>){$i++; $hash{$i}=($_) } print %hash; close(FILES); 程序占用 CPU 時(shí)間:0.66 usr + 0.41 sys 合計(jì)運(yùn)行時(shí)間 1070 毫秒 數(shù)組的最快方式是450毫秒,散列全部輸出時(shí)間大概比數(shù)組慢一倍 散列不輸出 open (FILES, "index"); while (<FILES>){$i++; $hash{$i}=($_) } #print %hash; close(FILES); 程序占用 CPU 時(shí)間:0.09 usr + 0.04 sys 合計(jì)運(yùn)行時(shí)間 130 毫秒 還是比數(shù)組慢 從hash中取出一個(gè)元素 open (FILES, "index"); while (<FILES>){$i++; $hash{$i}=($_) } close(FILES); print $hash{8900}; 程序占用 CPU 時(shí)間:0.13 usr + 0.00 sys 合計(jì)運(yùn)行時(shí)間 130 毫秒 幾乎不增加時(shí)間 數(shù)組也是,測(cè)不出時(shí)間 open (FILES, "index"); $/=""; $reads=<FILES>; close(FILES); $/="\n"; @_=split ( /\n/,$reads); print $_[8900]; 程序占用 CPU 時(shí)間:0.05 usr + 0.00 sys 合計(jì)運(yùn)行時(shí)間 50 毫秒 ########################## 以上測(cè)試結(jié)果有的差別很大,有的差別不大。 即使有些差別雖然是細(xì)微的,程序中如果把這些命令都采用最優(yōu)化方式,相信會(huì)有效果的 我最近在把我的論壇調(diào)用比較頻繁的核心代碼進(jìn)行逐行檢查,反復(fù)測(cè)試優(yōu)化中~~~~ 誰(shuí)把其他的方法都測(cè)試以下,拿出來(lái)給愛(ài)好者繼續(xù)分享,我也繼續(xù)測(cè)試中,今晚測(cè)試系統(tǒng)級(jí)IO命令,看有沒(méi)有差別 僅供參考。 附,my測(cè)試方法 ######################### use CGI::Carp qw(fatalsToBrowser); use Benchmark; $TT0 = new Benchmark; print "Content-type: text/html\n\n"; open (FILES, "index"); $/=""; $reads=<FILES>; close(FILES); $/="\n"; @_=split ( /\n/,$reads); print @_; ########################### print"<hr>"; $TT1 = new Benchmark; $td = Benchmark::timediff($TT1, $TT0); $td = Benchmark::timestr($td); $td =~ /(\d+)\s*wallclock secs \(\s*?(\d*?\.\d*?)\s*usr\s*\+\s*(\d*?\.\d*?)\s*sys/i; my $alltimas=($2+$3)*1000; print "<center><font color=$cpudispcolor>程序占用 CPU 時(shí)間:$2 usr + $3 sys 合計(jì)運(yùn)行時(shí)間 $alltimas 毫秒"; exit;
|