.net - TaskFactory.StartNew versus ThreadPool.QueueUserWorkItem
performance (3)
Aparentemente, el método TaskFactory.StartNew
en .NET 4.0 está pensado como un reemplazo para ThreadPool.QueueUserWorkItem
(de acuerdo con esta publicación, de todos modos ). Mi pregunta es simple: ¿alguien sabe por qué?
¿ TaskFactory.StartNew
tiene mejor rendimiento? ¿Utiliza menos memoria? ¿O es principalmente para la funcionalidad adicional proporcionada por la clase de Task
? En el último caso, ¿ StartNew
posible que StartNew
tenga un rendimiento peor que QueueUserWorkItem
?
Me parece que StartNew
realmente usaría potencialmente más memoria que QueueUserWorkItem
, ya que devuelve un objeto de Task
con cada llamada y espero que eso resulte en una mayor asignación de memoria.
En cualquier caso, me interesa saber cuál es más apropiado para un escenario de alto rendimiento.
El rendimiento es un ... depende. Si está realizando muchas tareas paralelas, las tareas de .net 4 se desempeñarán mejor, y le brindarán un control más preciso (una cancelación más robusta, la capacidad de esperar en múltiples tareas simultáneamente, la capacidad de crear relaciones de tarea padre / hijo, la capacidad de Especifique LongRunning, etc., etc., etc., etc.)
Además, la capacidad de especificar su propio TaskScheduler significa que puede personalizarlo para sus necesidades. El programador de tareas integrado es mucho más compatible con varios núcleos que el antiguo ThreadPool.
En cuanto a usar más memoria. Cada hilo reserva un mínimo de 1 MB de memoria, la pequeña cantidad utilizada para almacenar un objeto de tarea es intrascendente. Realmente creo que esa es la última de tus preocupaciones.
Solo por el aspecto de las cosas, las clases de Tarea fueron diseñadas para funcionar con las nuevas funciones paralelas en .Net 4. También parece que puede usar Action
o Action<T>
directamente al iniciar / crear una tarea. Sin embargo, esta es una conjetura del 100%, basada en hojear los documentos :).
TaskFactory.StartNew es más apropiado para un escenario de alto rendimiento.
Obtendrá un beneficio de productividad por el conjunto de clases en System.Threading.Tash y la atención que recibió en su diseño + integración con los bucles y opciones paralelos.
También obtendrá un beneficio en el rendimiento porque System.Threading. Las tareas se basan en el robo de trabajo en el grupo de hilos, lo que es mejor para la localidad (cuando es importante).
-Almiar