三種遍歷資料夾方法比較 PERL

2021-05-24 02:34:24 字數 3291 閱讀 7882

一般黑客都常用遍歷方法來進行插入掛馬**等。

三種遍歷資料夾方法比較

本貼對三種遍歷資料夾方法比較。

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上同時勝出是不無道理的。

#!/usr/bin/perl-w

#讀取目錄下的目錄,並且去除..和.目錄以及隱藏的目錄

opendir (dir,/"/root/") or die /"could not open /root/";

@dots=grep readdir(dir);

foreach (@dots)

closedir dir;

#!/usr/bin/perl

# a small program to read the contents

# of a directory and print them to screen

@dir_contents;

$dir_to_open=/"/home/sant/dcs/teaching/internet_systems/lectures/";

# open file with handle dir

opendir(dir,$dir_to_open) || die(/"cannot open directory !n/");

# get contents of directory

@dir_contents= readdir(dir);

遍歷資料夾的方法比較

本貼對三種遍歷資料夾方法比較。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...

VBA遍歷資料夾常用有三種方法

vba遍歷資料夾常用有三種方法,這三種方法中,filesearch不適合2007和2010版本,而且速度比較慢,遞迴法速度也慢。只有用dir加迴圈的方法,速度飛快。下面是三種方法的 1 filesearch法 sub test3 dim wb as workbook dim i as long di...

Qt 遍歷資料夾的三種方式

github dome 今天的心態被搞崩潰了,在多年的程式設計經驗裡。普遍的經驗認為在遍歷資料夾這件事情上,肯定是佇列優於遞迴的。但在qt 由於有一些庫函式,我發現使用遞迴的速度盡然比佇列還快,而且佇列的遍歷還特別的慢,估計是我寫的佇列遍歷那個地方又問題,請大神指導一下,這是為什麼呢?我乙個qt初學...