原创|其它|编辑:郝浩|2009-10-09 10:36:10.000|阅读 914 次
概述:遍历一个目录或者磁盘中的所有内容,常用的算法有两种:深度优先和广度优先。具体实现的时候,每种算法都可以有多种实现,一般来说,有递归和非递归两种。因为工作需要,所以bigtall实现了几种算法的对比。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
遍历一个目录或者磁盘中的所有内容,常用的算法有两种:深度优先和广度优先。具体实现的时候,每种算法都可以有多种实现,一般来说,有递归和非递归两种。因为工作需要,所以bigtall实现了几种算法的对比。
首先实现的是传统的深度优先的递归遍历算法,因为非递归算法和广度优先比较雷同所以没有实现。其次实现的是广度优先的递归和非递归算法,其中非递归广度算法采用一个先进先出的queue存储目录路径结果。最后实现的是基于非递归广度算法上实现的多线程搜索算法,因为现在已经是多核时代,不用多线程好像说不过去了。
测试代码附在文后。bigtall用于测试的环境是vista sp2,文件系统是ntfs,cpu intel T2300 1.66G双核,内存4G。测试所用的目录为两个,一个是含有2148个对象的d:\temp目录,另外一个是整个d盘,含54万个文件。
运行结果:
D:\work\delphi\findfirst>fastfind d:\temp 16 1
algorithm, files, total time(ms), repeat, average time(ms)
Deep walk, 2148, 46, 1, 46
Wide Recurse, 2148, 78, 1, 78
Wide Cycle, 2148, 16, 1, 16
Thread 2 walk, 2148, 31, 1, 31
Thread 4 walk, 2148, 61, 1, 61
Thread 6 walk, 2148, 93, 1, 93
Thread 8 walk, 2148, 124, 1, 124
Thread 10 walk, 2148, 156, 1, 156
Thread 12 walk, 2148, 186, 1, 186
Thread 14 walk, 2148, 218, 1, 218
Thread 16 walk, 2148, 249, 1, 249D:\work\delphi\findfirst>fastfind d:\temp 16 2
algorithm, files, total time(ms), repeat, average time(ms)
Deep walk, 2148, 93, 2, 46
Wide Recurse, 2148, 93, 2, 46
Wide Cycle, 2148, 63, 2, 31
Thread 2 walk, 2148, 61, 2, 30
Thread 4 walk, 2148, 124, 2, 62
Thread 6 walk, 2148, 186, 2, 93
Thread 8 walk, 2148, 250, 2, 125
Thread 10 walk, 2148, 311, 2, 155
Thread 12 walk, 2148, 373, 2, 186
Thread 14 walk, 2148, 437, 2, 218
Thread 16 walk, 2148, 514, 2, 257D:\work\delphi\findfirst>fastfind d:\temp 16 4
algorithm, files, total time(ms), repeat, average time(ms)
Deep walk, 2148, 171, 4, 42
Wide Recurse, 2148, 203, 4, 50
Wide Cycle, 2148, 109, 4, 27
Thread 2 walk, 2148, 139, 4, 34
Thread 4 walk, 2148, 249, 4, 62
Thread 6 walk, 2148, 373, 4, 93
Thread 8 walk, 2148, 500, 4, 125
Thread 10 walk, 2148, 623, 4, 155
Thread 12 walk, 2148, 747, 4, 186
Thread 14 walk, 2148, 874, 4, 218
Thread 16 walk, 2148, 997, 4, 249D:\work\delphi\findfirst>fastfind d:\temp 16 8
algorithm, files, total time(ms), repeat, average time(ms)
Deep walk, 2148, 264, 8, 33
Wide Recurse, 2148, 343, 8, 42
Wide Cycle, 2148, 219, 8, 27
Thread 2 walk, 2148, 248, 8, 31
Thread 4 walk, 2148, 499, 8, 62
Thread 6 walk, 2148, 747, 8, 93
Thread 8 walk, 2148, 999, 8, 124
Thread 10 walk, 2148, 1248, 8, 156
Thread 12 walk, 2148, 1496, 8, 187
Thread 14 walk, 2148, 1748, 8, 218
Thread 16 walk, 2148, 1995, 8, 249D:\work\delphi\findfirst>fastfind d:\ 16 1
algorithm, files, total time(ms), repeat, average time(ms)
Deep walk, 545519, 159447, 1, 159447
Wide Recurse, 545519, 15678, 1, 15678
Wide Cycle, 161792, 2042, 1, 2042
Thread 2 walk, 545519, 6552, 1, 6552
Thread 4 walk, 545519, 6771, 1, 6771
Thread 6 walk, 545519, 6941, 1, 6941
Thread 8 walk, 545519, 6753, 1, 6753
Thread 10 walk, 545519, 7066, 1, 7066
Thread 12 walk, 545519, 7036, 1, 7036
Thread 14 walk, 545519, 7691, 1, 7691
Thread 16 walk, 545519, 7065, 1, 7065D:\work\delphi\findfirst>fastfind d:\ 16 2
algorithm, files, total time(ms), repeat, average time(ms)
Deep walk, 545519, 21277, 2, 10638
Wide Recurse, 545519, 30201, 2, 15100
Wide Cycle, 161792, 3915, 2, 1957
Thread 2 walk, 545519, 13104, 2, 6552
Thread 4 walk, 545519, 13836, 2, 6918
Thread 6 walk, 545519, 13883, 2, 6941
Thread 8 walk, 545519, 14211, 2, 7105
Thread 10 walk, 545519, 13978, 2, 6989
Thread 12 walk, 545519, 14788, 2, 7394
Thread 14 walk, 545519, 15975, 2, 7987
Thread 16 walk, 545519, 16988, 2, 8494D:\work\delphi\findfirst>fastfind d:\ 16 4
algorithm, files, total time(ms), repeat, average time(ms)
Deep walk, 545519, 42010, 4, 10502
Wide Recurse, 545519, 64584, 4, 16146
Wide Cycle, 161792, 7814, 4, 1953
Thread 2 walk, 545519, 26317, 4, 6579
Thread 4 walk, 545519, 27205, 4, 6801
Thread 6 walk, 545519, 27487, 4, 6871
Thread 8 walk, 545519, 27877, 4, 6969
Thread 10 walk, 545519, 32994, 4, 8248
Thread 12 walk, 545519, 49841, 4, 12460
Thread 14 walk, 545519, 72072, 4, 18018
Thread 16 walk, 545519, 68047, 4, 17011D:\work\delphi\findfirst>fastfind d:\ 16 8
algorithm, files, total time(ms), repeat, average time(ms)
Deep walk, 545519, 106392, 8, 13299
Wide Recurse, 545519, 124331, 8, 15541
Wide Cycle, 161792, 15240, 8, 1905
Thread 2 walk, 545519, 53352, 8, 6669
Thread 4 walk, 545519, 64303, 8, 8037
Thread 6 walk, 545519, 132849, 8, 16606
Thread 8 walk, 545520, 156951, 8, 19618
Thread 10 walk, 545520, 67907, 8, 8488
Thread 12 walk, 545520, 59747, 8, 7468
Thread 14 walk, 545520, 62946, 8, 7868
Thread 16 walk, 545520, 102616, 8, 12827
结果分析:
由此我们得到结论:
附加代码如下:
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:博客园