2011-12-21 17 views
5

Como todos sabemos, en el desarrollo de software, se nos pueden pedir cosas muy ambiciosas relacionadas con la tecnología.Ejecutar una tarea intensiva de CPU/memoria: ¿qué enfoque de codificación es el más eficaz?

Recientemente me preguntaron sobre la forma más rápida de convertir 4000 documentos de Word a PDF. El código/software para hacer la conversión está en su lugar, y se ejecuta en un servidor dedicado, por lo que el hardware también está allí (esta es una tarea recurrente). Pero desde una perspectiva de rendimiento C#, ¿cuál es la mejor manera de hacer esto?

Sigo pensando en la línea de dividir esto en trozos (es decir, 40 documentos) y convertirlos (es decir, 40 documentos únicos x 1000 tareas paralelas), que se ejecutan al mismo tiempo. ¿Es esta la idea correcta, en cuanto al rendimiento? El más simple (y el más largo) es un bucle en serie que pasa por cada documento.

¿Qué recomendarías? No hay restricciones de idioma, por lo que C# 4.0, LINQ, etc. están todos disponibles.

+1

¿Sabes cuáles serían los cuellos de botella? IO? ¿UPC? ¿Memoria? – Oded

+5

No tiene sentido hablar de optimizaciones a menos que * medido * y saber exactamente dónde está el cuello de botella. – Jon

+0

Me quedé con la memoria cuando vi la tarea que se estaba ejecutando (y el disco). El proceso no come CPU. – dotnetdev

Respuesta

2

1000 tareas en paralelo? ¿Desea ejecutar 1,000 hilos al mismo tiempo? Pasará más tiempo cambiando la secuencia que haciendo el trabajo real. Si tiene una máquina de cuatro núcleos, debe ejecutar cuatro hilos, cada uno de los cuales convierte un único documento a la vez.

Probablemente la mejor manera de comenzar es utilizar un simple Parallel.ForEach, y deje que la biblioteca de tiempo de ejecución se preocupe por la programación de las tareas. Algo así como:

List<string> DocumentsToConvert = new List<string>(); 
// here, load the file names of all the documents you want to convert. 
// Then, process them with: 
Parallel.Foreach(DocumentsToConvert, (doc) => { ConvertDocument(doc); }); 

Usted podría hacer el mismo tipo de cosa con el TPL y tareas:

foreach (var doc in DocumentsToConvert) 
{ 
    // Create and start a task to convert that document 
} 

En cualquiera de los casos, se dejó que la figura biblioteca de tiempo de ejecución de cuántas tareas a ejecutar en paralelo.

+0

podría elaborar en su segundo enfoque, "Podría hacer el mismo tipo de cosas con el TPL y las tareas:". No veo qué código seguiría a continuación (no está familiarizado con TPL y qué se puede hacer con él) – MedicineMan

+0

@MedicineMan: Consulte http://msdn.microsoft.com/en-us/library/dd460717.aspx Sin embargo, en en este caso, el 'Parallel.ForEach' es probablemente la mejor forma de hacerlo. –

2

Tome tres documentos y trátelos secuencialmente. Tome el tiempo promedio y multiplíquelo por el número total de documentos. Si ese tiempo es razonable, detenga la codificación y publíquelo en el servidor. Acaba de ahorrar los costos de desarrollo de la empresa a su tasa de desarrollo, ya que el ahorro de tiempo puede ahorrarle más que perder 30 minutos de una ejecución de servidor que le llevó lograr una semana de codificación.

De lo contrario, comience a buscar en la programación en paralelo con .Net cuatro y pruebe en 30 documentos y realice cálculos similares a los anteriores para ver si es razonable. Si ese tiempo es razonable, detenga la codificación y publíquelo en el servidor.

Si ese tiempo no es razonable, discuta el uso de más servidores para dividir el trabajo aún más.

HTH

Cuestiones relacionadas