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

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

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

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

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

  • Загрузка изображений с диска :37,76 мс 1%
  • Декодировать PNG :2816,97 мс 77%
  • Загрузка изображений на видеооборудование :196,67 мс 5%
  • Состав :87,80 мс 2%
  • Получение результата композиции от Video Hardware :166,21 мс 5%
  • Кодировать в PNG :318,13 мс 9%
  • Сохранить на диск :3,96 мс 0%
  • Очистка :53,00 мс 1%

Всего :3680,50 мс 100%

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

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

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

  • Тест имитирует загрузку 20 изображений в формате PNG и их компоновку. Это будет примерно соответствовать типу запросов, которые мы будем получать в производственной среде.
  • Каждое изображение, используемое в композиции, имеет размер 1600x1600.
  • Решение будет включать до 10 серверов с балансировкой нагрузки, таких как тот, который мы здесь обсуждаем. Таким образом, дополнительные усилия по разработке программного обеспечения могут стоить экономии на аппаратных средствах.
  • Кэширование декодированных исходных изображений — это то, что мы рассматриваем, но каждая композиция, скорее всего, будет выполняться с совершенно разными исходными изображениями, поэтому промахи кэша будут высокими, а прирост производительности — низким.
  • Тесты проводились с дрянной видеокартой, поэтому мы можем ожидать, что декодирование PNG будет еще большим узким местом производительности при использовании приличной видеокарты.
27
задан sboisse 3 July 2012 в 15:56
поделиться