Re: [問題] 讀文字檔及搜尋字串的效率
※ 引述《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
05/18 19:40, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):