2013-07-03 5 views
0

Я переключил приложение Xamarin.Android, чтобы использовать async, ожидая вместо предыдущего использования ThreadPool.QueueUserWorker, и он появляется, не имея метрик, что он быстрее! Очевидно, что в этой новой версии Xamarin Android могут быть другие оптимизации, но мне любопытно с точки зрения C# (.NET 4.5), если на самом деле Task.Run будет быстрее, поскольку он запускает задачу по требованию и не ставит в очередь пул потоков?Является ли Task.Run быстрее, чем ThreadPool.QueueUserWorkerItem?

У кого-нибудь есть информация, которую async ждет может и будет быстрее, чем реализация ThreadPool.QueueUserWorkerItem?

+0

'async' сам не использует другие потоки. Возможно ли, что вы просто видите случайное улучшение использования пула потоков? Поэтому я имею в виду меньшее количество конфликтов, меньше голодания пула и т. Д. –

+0

Нет, Task.Run тоже использует пул потоков, если вы не планируете его на конкретном планировщике. Вы на самом деле * вызываете * Task.Run себя, хотя? Это помогло бы, если бы мы могли увидеть некоторый код ... –

+0

Да, я обертываю свой код с помощью: Return Task.Run (() => {code here}); – Neal

ответ

4

Нет. Это будет медленнее.

QUWI - вызов очень низкого уровня. Task.Run должен, по крайней мере, создать Task, а затем поставить его в очередь (что было бы похоже на QUWI).

Я подозреваю, что ваш тестовый код попадает в один из manypitfalls микро-бенчмаркинга.

+2

На самом деле, поскольку, похоже, он сменил всю свою программу с одной асинхронной системы на другую, мне кажется более вероятным, что он настолько изменился, что просто не может понять, откуда появились реальные улучшения производительности. Если он использовал лучший алгоритм, используя новая система, избегает создания/использования некоторых потоков или времени пула потоков и т. д., тогда это может быть, когда улучшение происходит от – Servy

+0

@Servy Got, чтобы согласиться с вами здесь, мое грубое предположение заключается в том, что изменения изменили, как пул потоков используется таким образом, что используется меньшее количество потоков или в разное время, и поскольку такое голодание нитей не происходит кольцо (например). –

+0

Я думаю, что есть некоторые угловые случаи, когда 'Task.Run()' будет быстрее (благодаря потоковым локальным очередям и/или задачам вложения), но в целом вы правы. – svick