Re: [問題] 讀文字檔及搜尋字串的效率

看板Perl作者 (Acoustic)時間16年前 (2008/05/11 17:44), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《banco (Acoustic)》之銘言: : 平常自己都在 Linux 下操作程式 : 後來發現把相同程式轉到 Windows 平台上執行 : 效率竟是天差地遠 [註] : 煩請諸位大德撥冗替小弟解惑 : (1) : 我手邊有個文字檔, 約 27MB : 在搜尋想要的字串時, : 我一向用 @file = <FH>; 把內容倒進 @file 後再處理 : 然後再針對 @file 的內容, 一列一列地進行檢查 : 不曉得 @file = <FH> 會不會是一個多餘的動作 : 會不會直接用 foreach (<FH>) 效率會比較好些? 自問自答 以下原始程式 Unihan.txt 為 27MB 的文字檔, 內含 1,116,642 行資料 程式執行花了 180 秒左右 1: open( Funi, "Unihan.txt" ) or die "no Unihan.txt"; 2: @UniInfo = <Funi>; 3: 4: foreach (@UniInfo){ 5: if( $_ =~ /^(U\S+)\t(\S+)\t(.*)$/ ){ 6: $Unihan{$1}{$2} = $3; 7: } 8: } 9: close( Funi ); ==修改一== 將第2行 @UniInfo = <Funi> 拿掉, 第4行換成 foreach( <Funi> ) 程式執行花了 100 秒左右 另外原本第2行 @UniInfo = <Funi> 花了約 6 秒 ==修改二== 同修改一, 另外在第5行的 regular expression 加上 modifier /g 程式執行花了 58 秒左右 ==修改三== 同原始程式, 另外在第5行的 regular expression 加上 modifier /g 程式執行花了 53 秒左右 ==粗略結論== 在不更改 regular expression、不增加任何 modifier 的條件下, foreach 直接對 FileHandle <Funi> 會比 @UniInfo = <Funi> 來得快 但加上 modifier /g 之後, 情況整個相反, 即便 @UniInfo = <Funi> 會多花 6 秒 但先將資料倒入記憶體的速度優勢在後來的 matching 展現出來 不過我一直對為何加上 /g 會提升速度感到好奇 因為從字面上的意義 global matching 來看, 無法想到為何會對速度產生影響? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.216.35.194

05/18 19:40, , 1F
foreach( <Funi> )改成while( <Funi> )
05/18 19:40, 1F
文章代碼(AID): #189i0L4x (Perl)
文章代碼(AID): #189i0L4x (Perl)