c# - 如何判断操作是否是 CPU 密集型的
问题描述
我有一些代码要查看:
Task.WhenAll(contracts.Select(x => Task.Run(() =>
{
// here some 30 lines of synchronous code
}))).GetAwaiter().GetResult();
我认为这段代码最好以简单的方式同步运行,foreach
因为 30 行代码在我看来并没有太多的 CPU 密集型操作。但我不太确定。
如果一个操作需要超过 50 毫秒才能完成,最好异步运行它。因此,我必须衡量它的性能。但是在审查拉取请求时这是不可能的。
那么,是否有其他方法可以确定该操作是否真的是 CPU 密集型的?
更新:
如果一个操作需要超过 50 毫秒才能完成,最好异步运行它。
我是从 Stephen Cleary 的博客中读到的: https ://blog.stephencleary.com/2013/04/ui-guidelines-for-async.html
解决方案
异步运行 CPU 操作根本没有意义,您只是增加了很多开销并在此之后也使用相同的 CPU 资源。
异步操作的要点是,如果你必须等待,那么你不需要阻塞胎面,所以它可以做其他事情。
因此,即使该操作运行 2 分钟纯 CPU,您也不会通过异步调用它来赢得任何东西。
此外,无论如何,您只是在同步等待所有操作完成。因此,您可以使用您Task.Run
的并行运行操作,但您不需要对此做任何其他事情。
据我所知,只是做.Result
和.GetAwaiter().GetResult()
将是你得到的异常类型之间的唯一区别。
所以我的观点是:你的代码中已经没有任何异步了,所以没有什么可以衡量的。
推荐阅读
- azure - 将 Azure DevOps 变量拉入 ARM 模板
- python - 在 3D 图中的 x 轴上添加日期标签(python)
- python - 我似乎无法删除值包含某个字符串的字典的键,为什么?
- django - Django 条件渲染模板
- deep-learning - IndexError: Target -1 is out of bounds error in tabular learner fatai2
- c - C 错误:无法将 'pile {aka pp}' 转换为 'pile** {aka pp**}
- ssl - 安全连接失败 - ColdFusion 2018
- javascript - 从变量 HTML 结果中解析特定字符串
- r - 将子集转换为前缀版本以使用管道
- amazon-web-services - 将 Cloudflare 配置为指向 AWS Amplify