Наш веб-сервер должен обрабатывать множество композиций больших изображений вместе перед отправкой результатов веб-клиентам. Этот процесс критичен по производительности, поскольку сервер может получать несколько тысяч запросов в час.
Сейчас наше решение загружает PNG файлы (около 1 МБ каждый) из HD и отправляет их на видеокарту, поэтому композиция выполняется на графическом процессоре. Сначала мы попытались загрузить наши изображения, используя PNG-декодер, открытый API XNA. Мы видели, что производительность не слишком хорошая.
Чтобы понять, загружалась ли проблема с HD или декодирования PNG, мы изменили это, загрузив файл в поток памяти, а затем отправив этот поток памяти в декодер .NET PNG. Разница в производительности с использованием XNA или с использованием класса System.Windows.Media.Imaging.PngBitmapDecoder незначительна. Мы грубо получаем одинаковые уровни производительности.
Наши тесты показывают следующие результаты:
- Загрузка изображений с диска: 37.76ms 1%
- Декодирование PNG: 2816.97мс 77%
- Загрузка изображений на видеооборудование: 196.67ms 5%
- Состав: 87.80ms 2%
- Получить результат композиции из видеооборудования: 166.21ms 5%
- Кодировать в PNG: 318.13ms 9%
- Сохранение на диск: 3.96ms 0%
- Очистка: 53.00ms 1%
Всего: 3680.50ms 100%
Из этих результатов видно, что самые медленные части при декодировании PNG.
Итак, нам интересно, не будет ли декодер PNG, который мы могли бы использовать, что позволило бы сократить время декодирования PNG. Мы также рассматривали сохранение несжатых изображений на жестком диске, но тогда каждое изображение будет размером 10 МБ, а не 1 МБ, и поскольку на жестком диске хранится несколько десятков тысяч этих изображений, их невозможно сохранить без сжатия.
EDIT: дополнительная информация:
- Тест сравнивает загрузку 20 изображений PNG и их компоновку. Это примерно соответствует запросам, которые мы получим в производственной среде.
- Каждое изображение, используемое в композиции, имеет размер 1600x1600.
- В решении будет задействовано до 10 серверов с балансировкой нагрузки, подобных тем, которые мы обсуждаем здесь. Таким образом, дополнительные усилия по разработке программного обеспечения могут стоить экономии на стоимости оборудования.
- Кэширование декодированных исходных изображений - это то, что мы рассматриваем, но каждая композиция, скорее всего, будет выполнена с совершенно разными исходными изображениями, поэтому кэш-промахи будут высокими и производительность будет низкой.
- Тесты были сделаны с дрянной видеокартой, поэтому мы можем ожидать, что декодирование PNG станет еще более узким местом производительности с использованием достойной видеокарты.