本貼對三種遍歷資料夾方法比較。
1. 使用file::find;
2. 遞迴遍歷。(遍歷函式為lsr)
3. 使用佇列或棧遍歷。(遍歷函式為lsr_s)
1.use file::find
#!/usr/bin/perl -w
## file: find.pl
# author: 路小佳
# license: gpl-2
use strict;
use warnings;
use file::find;
my ($size, $dircnt, $filecnt) = (0, 0, 0);
sub process
else
}find(\&process, '.');
print "$filecnt files, $dircnt directory. $size bytes.\n";
2. lsr遞迴遍歷
#!/usr/bin/perl -w
## file: lsr.pl
# author: 路小佳
# license: gpl-2
use strict;
use warnings;
sub lsr($)
foreach (readdir(dh))
my $file = $cwd.'/'.$_;
if (!-l $file && -d _)
process($file, $cwd);
}closedir(dh);
}my ($size, $dircnt, $filecnt) = (0, 0, 0);
sub process($$)
else
}lsr('.');
print "$filecnt files, $dircnt directory. $size bytes.\n";
3. lsr_s棧遍歷
#!/usr/bin/perl -w
## file: lsr_s.pl
# author: 路小佳
# license: gpl-2
use strict;
use warnings;
sub lsr_s($)
foreach (readdir(dh))
$file = $dir.$_;
if (!-l $file && -d _)
process($file, $dir);
}closedir(dh);}}
my ($size, $dircnt, $filecnt) = (0, 0, 0);
sub process($$)
else
}lsr_s('.');
print "$filecnt files, $dircnt directory. $size bytes.\n";
對我的硬碟/dev/hda6的測試結果。
1: file::find
26881 files, 1603 directory. 9052479946 bytes.
real 0m9.140s
user 0m3.124s
sys 0m5.811s
複製**
2: lsr
26881 files, 1603 directory. 9052479946 bytes.
real 0m8.266s
user 0m2.686s
sys 0m5.405s
複製**
3: lsr_s
26881 files, 1603 directory. 9052479946 bytes.
real 0m6.532s
user 0m2.124s
sys 0m3.952s
複製**
測試時考慮到cache所以要多測幾次取平均, 也不要同時列印檔案名, 因為控制台是慢裝置, 會形成瓶頸。
lsr_s之所以用棧而不是佇列來遍歷,是因為perl的push shift pop操作是基於陣列的, push pop這樣成對操作可能有優化。記憶體和cpu占用大小順序也是1>2>3.
cpu load memory
use file::find 97% 4540k
lsr 95% 3760k
lsr_s 95% 3590k
複製**
結論: 強烈推薦使用lsr_s來遍歷資料夾。
**********===再羅嗦幾句********************==
從執行效率上來看,find.pl比lsr.pl的差距主要在user上, 原因是file::find模組選項較多, 條件判斷費時較多,而lsr_s.pl比lsr.pl在作系統呼叫用時較少, 是因為遞迴時程式還在儲存原有的檔案控制代碼和函式恢復現場的資訊, 所以sys費時較多。 所以lsr_s在sys與user上同時勝出是不無道理的。
三種遍歷資料夾方法比較 PERL
一般黑客都常用遍歷方法來進行插入掛馬 等。三種遍歷資料夾方法比較 本貼對三種遍歷資料夾方法比較。1.使用file find 2.遞迴遍歷。遍歷函式為lsr 3.使用佇列或棧遍歷。遍歷函式為lsr s 1.use file find usr bin perl w file find.pl author...
Python遍歷資料夾的兩種方法比較
模組os中的walk 函式可以遍歷資料夾下所有的檔案。python view plain copy os.walk top,topdown ture,nerr r none followlinks false 該函式可以得到乙個三元tupple dirpath,dirnames,filenames ...
Python遍歷資料夾的兩種方法比較
遍歷資料夾是乙個很常用的功能吧。這裡分別用兩種方法實現 coding utf 8 import os def test1 rootdir list dirs os.walk rootdir for root,dirs,files in list dirs for d in dirs print os...