Самый быстрый PNG декодер для .NET

Наш веб-сервер должен обработать множество композиций больших изображений вместе перед отправкой результатов веб-клиентам. Этот процесс критичен к производительности, поскольку сервер может получать несколько тысяч запросов в час.

В настоящее время наше решение загружает файлы PNG (около 1 МБ каждый) с жесткого диска и отправляет их на видеокарту, чтобы выполнить композицию на графическом процессоре. Сначала мы попытались загрузить наши изображения с помощью декодера PNG, предоставляемого XNA API. Мы увидели, что представление было не слишком хорошим.

Чтобы понять, была ли проблема с загрузкой с HD или декодированием PNG, мы изменили это, загрузив файл в поток памяти, а затем отправив этот поток памяти в .NET PNG-декодер. Разница в производительности с использованием XNA или класса System.Windows.Media.Imaging.PngBitmapDecoder незначительна. Мы примерно получаем одинаковые уровни производительности.

Наши тесты показывают следующие результаты производительности:

Load images from disk: 37.76ms 1% Decode PNGs: 2816.97ms 77% Load images on Video Hardware: 196.67ms 5% Composition: 87.80ms 2% Get composition result from Video Hardware: 166.21ms 5% Encode to PNG: 318.13ms 9% Store to disk: 3.96ms 0% Clean up: 53.00ms 1%

Итого: 3680,50 мс 100%

Из этих результатов мы видим, что самые медленные части при декодировании PNG.

Таким образом, мы задаемся вопросом, не будет ли декодер PNG, который мы могли бы использовать, который позволил бы нам сократить время декодирования PNG. Мы также рассмотрели вопрос о том, как сохранить изображения на жестком диске в несжатом виде, но тогда каждое изображение будет иметь размер 10 МБ, а не 1 МБ, и поскольку на жестком диске хранится несколько десятков тысяч этих изображений, невозможно сохранить их все без сжатия.

РЕДАКТИРОВАТЬ: Более полезная информация:

The benchmark simulates loading 20 PNG images and compositing them together. This will roughly correspond to the kind of requests we will get in the production environment. Each image used in the composition is 1600x1600 in size. The solution will involve as many as 10 load balanced servers like the one we are discussing here. So extra software development effort could be worth the savings on the hardware costs. Caching the decoded source images is something we are considering, but each composition will most likely be done with completely different source images, so cache misses will be high and performance gain, low. The benchmarks were done with a crappy video card, so we can expect the PNG decoding to be even more of a performance bottleneck using a decent video card.

Ответы на вопрос(4)

Ваш ответ на вопрос