【问题标题】:Is Task.Run faster than ThreadPool.QueueUserWorkerItem?Task.Run 是否比 ThreadPool.QueueUserWorkerItem 快?
【发布时间】:2013-07-01 09:12:55
【问题描述】:

我将我的 Xamarin.Android 应用程序切换为使用 async await 来代替之前的 ThreadPool.QueueUserWorker 项目使用情况,它看起来虽然没有指标,但速度更快!在这个新的 Xamarin Android 版本中显然可能还有其他优化,但我很好奇从 C# 的角度(.NET 4.5)如果事实上 Task.Run 会更快,因为它是按需启动任务而不是排队线程池?

任何人都知道异步等待可以并且将会比 ThreadPool.QueueUserWorkerItem 实现更快?

【问题讨论】:

  • async 本身不使用其他线程。您是否可能只是偶然发现线程池得到了更好的使用?所以我的意思是减少线程争用,减少池饥饿等。
  • 不,Task.Run 也使用线程池,除非您将其安排在特定的调度程序上。您实际上是在 call Task.Run 自己吗?如果我们能看到一些代码会有所帮助...
  • 是的,我用以下代码包装我的代码:Return Task.Run( ()=> { code here });
  • 问题(和可能的答案)如果它显示在哪里使用 async/await w.r.t. 会对其他人更有用。 Task.Run 调用。这是await Task.Run(() => { ... DoStuff(); ... },还是Task.Run(() => { ... await DoStuff(); ... }?而faster 可能表示UI is less laggy(但实际工作可能仍需要很长时间或更长),也可能表示the work completes faster。思考关于这个主题的有用问题和答案。

标签: c# threadpool .net-4.5 async-await xamarin


【解决方案1】:

没有。会慢一些。

QUWI 是一个非常低级的调用。 Task.Run 必须至少创建一个Task 然后将其排队(类似于QUWI)。

我怀疑您的测试代码属于微基准测试的 many pitfalls 之一。

【讨论】:

  • 实际上,由于他似乎将他的整个程序从一个异步系统更改为另一个异步系统,在我看来,他更可能发生了如此大的变化,以至于他无法判断实际的性能改进来自哪里。如果他在新系统中使用了更好的算法,避免创建/使用某些线程或线程池时间等,那么这可能就是改进的来源
  • @Servy 在这里同意你的看法,我粗略的猜测是,这些变化已经改变了线程池的使用方式,从而减少了整体使用的线程,或者在不同的时间和这样的线程没有发生饥饿(例如)。
  • 我认为在某些极端情况下Task.Run() 会更快(感谢线程本地队列和/或任务内联),但总的来说,您是对的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-14
  • 2023-03-25
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多