如何确定操作是否 CPU 密集
How to figure out whether the operation is CPU intensive or not
我有一些代码要审查:
Task.WhenAll(contracts.Select(x => Task.Run(() =>
{
// here some 30 lines of synchronous code
}))).GetAwaiter().GetResult();
我认为此代码在普通 foreach
中同步 运行 更好,因为 30 行代码在我看来并没有太多 CPU 密集操作。但我不是很确定。
如果一个操作需要超过 50 毫秒才能完成,最好 运行 它是异步的。因此,我必须衡量它的性能。但是在review pull request的时候是不可能的。
那么,还有其他方法可以确定操作是否真的 CPU 密集吗?
更新:
如果一个操作需要超过 50 毫秒才能完成,最好 运行 它是异步的。
我是从 Stephen Cleary 的博客上读到的:
https://blog.stephencleary.com/2013/04/ui-guidelines-for-async.html
运行宁 CPU 异步操作根本没有意义,你只是增加了很多开销,然后也使用相同的 CPU 资源。
异步操作的要点是,如果你必须等待,那么你就不需要阻塞线程,所以它可以做其他事情。
所以即使操作 运行s 2 分钟纯 CPU,你也不会通过异步调用它来赢得任何东西。
此外,您只是在同步等待所有操作完成。因此,您可以并行使用 Task.Run
到 运行 操作,但您不需要为此做任何其他事情。
据我所知,仅执行 .Result
和 .GetAwaiter().GetResult()
之间的唯一区别将是您获得的异常类型。
所以我的观点是:您的代码中已经没有任何异步,因此没有什么可衡量的。
我有一些代码要审查:
Task.WhenAll(contracts.Select(x => Task.Run(() =>
{
// here some 30 lines of synchronous code
}))).GetAwaiter().GetResult();
我认为此代码在普通 foreach
中同步 运行 更好,因为 30 行代码在我看来并没有太多 CPU 密集操作。但我不是很确定。
如果一个操作需要超过 50 毫秒才能完成,最好 运行 它是异步的。因此,我必须衡量它的性能。但是在review pull request的时候是不可能的。
那么,还有其他方法可以确定操作是否真的 CPU 密集吗?
更新:
如果一个操作需要超过 50 毫秒才能完成,最好 运行 它是异步的。
我是从 Stephen Cleary 的博客上读到的: https://blog.stephencleary.com/2013/04/ui-guidelines-for-async.html
运行宁 CPU 异步操作根本没有意义,你只是增加了很多开销,然后也使用相同的 CPU 资源。
异步操作的要点是,如果你必须等待,那么你就不需要阻塞线程,所以它可以做其他事情。
所以即使操作 运行s 2 分钟纯 CPU,你也不会通过异步调用它来赢得任何东西。
此外,您只是在同步等待所有操作完成。因此,您可以并行使用 Task.Run
到 运行 操作,但您不需要为此做任何其他事情。
据我所知,仅执行 .Result
和 .GetAwaiter().GetResult()
之间的唯一区别将是您获得的异常类型。
所以我的观点是:您的代码中已经没有任何异步,因此没有什么可衡量的。