Asynchronous 对Azure存储中ListBlob的并行调用不';不会导致性能改进
我有代码(用F#编写,但我相信语言的选择并不重要)为Azure blob目录列表中的每个条目调用ListBlob,总共大约50个条目。所有通话的总时间约为20秒。以下是原始代码的外观:Asynchronous 对Azure存储中ListBlob的并行调用不';不会导致性能改进,asynchronous,f#,azure-storage-blobs,parallel.foreach,Asynchronous,F#,Azure Storage Blobs,Parallel.foreach,我有代码(用F#编写,但我相信语言的选择并不重要)为Azure blob目录列表中的每个条目调用ListBlob,总共大约50个条目。所有通话的总时间约为20秒。以下是原始代码的外观: enumerateDirectories container |> Seq.map (fun x -> listBlobs x) |> Seq.concat 函数“listBlobs”是Azure blob存储listBlobs方法的简单包装器。由于blob列表彼此独立,我尝试异步运行它们:
enumerateDirectories container
|> Seq.map (fun x -> listBlobs x)
|> Seq.concat
函数“listBlobs”是Azure blob存储listBlobs方法的简单包装器。由于blob列表彼此独立,我尝试异步运行它们:
enumerateDirectories container
|> Seq.map (fun x ->
async {
printfn "listBlobs %s" x
return listBlobs x
})
|> Async.Parallel
|> Async.RunSynchronously
|> Seq.concat
但执行时间没有任何改善。然后,我使用pseq模块的并行序列调用更改了F#异步工作流:
enumerateDirectories container
|> PSeq.map (fun x -> listBlobs x)
|> Seq.concat
这提高了执行时间,因此只需要以前的一半。不过,与单个ListBlob调用不到一秒钟相比,它需要大约10秒钟。我想知道为什么。对ListBlob的调用不应该同时执行,这样总时间就可以与单个调用时间加上一些开销相比较吗?并行查询可能无法获得更高的性能,特别是对于像ListBlob这样的扫描操作。此类操作应受到限制,且不依赖于对延迟敏感的操作,因为性能与对象的数量成正比,并且在需要的资源超过允许的范围时以较低的优先级执行 这就是说,您可以查看存储分析,以确保所有调用实际上都是并发调度的,并且e2e延迟和服务器延迟之间的差异最小 有关更多有用信息,请查看以下链接: