【发布时间】:2011-08-16 21:17:32
【问题描述】:
为什么Solution 2 比Solution 1 效率更高?
(时间是100次运行的平均值,他们经过的文件夹总数是13217)
// Solution 1 (2608,9ms)
let rec folderCollector path =
async { let! dirs = Directory.AsyncGetDirectories path
do! [for z in dirs -> folderCollector z]
|> Async.Parallel |> Async.Ignore }
// Solution 2 (2510,9ms)
let rec folderCollector path =
let dirs = Directory.GetDirectories path
for z in dirs do folderCollector z
我原以为Solution 1 会更快,因为它是异步的,并且我以并行方式运行它。我错过了什么?
【问题讨论】:
-
您要处理多少个文件夹?
async有一些开销,在某些情况下,可能会抵消好处。 -
对于这个特殊的问题,你会创建很多短命的
asyncs。也就是说,成本/收益比特别高。对于树形结构,最好使用固定数量的异步遍历器。 -
我认为在这种情况下,您几乎不进行任何受 CPU 限制的计算,而只遍历受 IO 限制的文件系统,您不会从运行中获得任何加速并行,只是开销。
-
AsyncGetDirectories是从哪里来的?
标签: f#