首页 > 解决方案 > 如何判断操作是否是 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

标签: c#asynchronoustaskmeasure

解决方案


异步运行 CPU 操作根本没有意义,您只是增加了很多开销并在此之后也使用相同的 CPU 资源。

异步操作的要点是,如果你必须等待,那么你不需要阻塞胎面,所以它可以做其他事情。

因此,即使该操作运行 2 分钟纯 CPU,您也不会通过异步调用它来赢得任何东西。

此外,无论如何,您只是在同步等待所有操作完成。因此,您可以使用您Task.Run的并行运行操作,但您不需要对此做任何其他事情。

据我所知,只是做.Result.GetAwaiter().GetResult()将是你得到的异常类型之间的唯一区别。

所以我的观点是:你的代码中已经没有任何异步了,所以没有什么可以衡量的。


推荐阅读