El decodificador PNG más rápido para .NET

Nuestro servidor web necesita procesar muchas composiciones de imágenes grandes juntas antes de enviar los resultados a los clientes web. Este proceso es crítico para el rendimiento porque el servidor puede recibir varios miles de solicitudes por hora.

En este momento, nuestra solución carga archivos PNG (aproximadamente 1 MB cada uno) desde el disco duro y los envía a la tarjeta de video para que la composición se realice en la GPU. Primero intentamos cargar nuestras imágenes usando el decodificador PNG expuesto por la API XNA. Vimos que el rendimiento no era demasiado bueno.

Para comprender si el problema se estaba cargando desde el disco duro o la decodificación del PNG, lo modificamos cargando el archivo en una secuencia de memoria y luego enviándolo al decodificador .NET PNG. La diferencia de rendimiento con XNA o con System.Windows.Media.Imaging.PngBitmapDecoder no es significativa. Aproximadamente tenemos los mismos niveles de rendimiento.

Nuestros puntos de referencia muestran los siguientes resultados de rendimiento:

Cargar imágenes desde disco: 37.76ms 1%Decodificar PNGs: 2816.97ms 77%Cargar imágenes en Video Hardware: 196.67ms 5%Composición: 87.80ms 2%.Obtenga el resultado de la composición del hardware de video: 166.21ms 5%Codificar a PNG: 318.13ms 9%Almacenar en disco: 3.96ms 0%Limpieza: 53.00ms 1%.

Total: 3680.50ms 100%

De estos resultados, vemos que las partes más lentas son cuando se decodifica el PNG.

Así que nos preguntamos si no habría un decodificador PNG que pudiéramos usar que nos permita reducir el tiempo de decodificación PNG. También consideramos mantener las imágenes sin comprimir en el disco duro, pero entonces cada imagen tendría un tamaño de 10 MB en lugar de 1 MB y, dado que hay varias decenas de miles de estas imágenes almacenadas en el disco duro, no es posible almacenarlas todas sin compresión.

EDITAR: Más información útil:

El punto de referencia simula la carga de 20 imágenes PNG y su composición. Esto corresponderá aproximadamente al tipo de solicitudes que recibiremos en el entorno de producción.Cada imagen utilizada en la composición tiene un tamaño de 1600x1600.La solución incluirá hasta 10 servidores con carga equilibrada como el que estamos discutiendo aquí. Por lo tanto, un esfuerzo adicional de desarrollo de software podría valer los ahorros en costos de hardware.El almacenamiento en caché de las imágenes de origen descodificadas es algo que estamos considerando, pero lo más probable es que cada composición se realice con imágenes de origen completamente diferentes, por lo que las fallas de caché serán altas y la ganancia de rendimiento será baja.Los puntos de referencia se realizaron con una tarjeta de video de mala calidad, por lo que podemos esperar que la decodificación PNG sea aún más un cuello de botella de rendimiento al usar una tarjeta de video decente.

Respuestas a la pregunta(4)

Su respuesta a la pregunta