gpt4 book ai didi

c# - 就性能而言,使用 CloudBlob.ExistsAsync 与 catch StorageException.BlobNotFound 比较?

转载 作者:太空宇宙 更新时间:2023-11-03 22:48:13 25 4
gpt4 key购买 nike

我想从 Azure Blob 存储下载一个可能尚不存在的文件。我正在寻找最可靠、最高效的方法来处理这个问题。为此,我发现了两个都有效的选项:

选项 1:使用 ExistsAsync()
持续时间:大约需要 1000~1100 毫秒才能完成。

if (await blockBlob.ExistsAsync())
{
await blockBlob.DownloadToStreamAsync(ms);
return ms;
}
else
{
throw new FileNotFoundException();
}

选项 2:捕获异常
持续时间:每次至少需要+1600ms。

try
{
await blockBlob.DownloadToStreamAsync(ms);
return ms;
}
catch (StorageException e)
{
// note: there is no 'StorageErrorCodeStrings.BlobNotFound'
if (e.RequestInformation.ErrorCode == "BlobNotFound")
throw new FileNotFoundException();

throw;
}

这些指标是通过 webapi 上的简单 API 调用来完成的,该调用使用上述函数并返回适当的消息。我在这里通过 Postman 手动测试了端到端场景。当然,这种方法有一些开销。但总的来说,ExistsAsync() 操作似乎节省了至少 500 毫秒。至少在我的本地机器上,同时进行调试。这有点值得注意,因为 ExistsAsync() 上的 DoesServiceRequest 属性似乎表明这是另一个需要进行的昂贵的 http 调用。

此外,ExistsAsync API docs不要谈论它的用法或任何副作用。

基于穷人的测试,一个直率的结论将导致我选择No。 1、因为:

  • 在 debug/localhost 中速度更快(问题是;没有提到在 prod 中编译)
  • 对我来说,它更有说服力,特别是因为 ErrorCode 也需要手动检查特定代码
  • 假设 ExistsAsync() 操作正是出于这个原因

但这是我的实际问题:这是对 ExistsAsync() 用法的正确解释吗?
例如。它存在的“原因”是不是比简单地捕获未找到的异常更有效,特别是出于性能原因?

谢谢!

最佳答案

But here is my actual question: is this the correct interpration of the usage of ExistsAsync()?

您可以轻松查看the implementation你自己。

ExistsAsync()只是一个 http 调用的包装器,如果 blob 不存在,则返回 http 未找到状态并返回 false在这种情况下。 True否则。

我会说选择 ExistsAsync,因为它似乎是最理想的方法,特别是如果您认为有时 blob 不存在的话。 DownloadToStreamAsyncmore work to do将异常包装在 StorageException 中也许还可以做一些更多的清理工作。

I would assume the ExistsAsync() operation is there for this exact reason

考虑一下:有时您只想知道给定的 blob 是否存在,而不对其内容感兴趣。例如,警告上传时某些内容将被覆盖。在这种情况下使用 ExistsAsync是一个很好的用例,因为使用 DownloadToStreamAsync仅检查存在性将是昂贵的,因为如果 blob 存在,它将下载内容。

关于c# - 就性能而言,使用 CloudBlob.ExistsAsync 与 catch StorageException.BlobNotFound 比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48869187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com