Decodificador de PNG mais rápido para .NET

Nosso servidor da Web precisa processar muitas composições de imagens grandes antes de enviar os resultados para os clientes da Web. Esse processo é crítico para o desempenho porque o servidor pode receber vários milhares de solicitações por hora.

Neste momento nossa solução carrega arquivos PNG (cerca de 1MB cada) do HD e os envia para a placa de vídeo para que a composição seja feita na GPU. Primeiro, tentamos carregar nossas imagens usando o decodificador PNG exposto pela API do XNA. Vimos que o desempenho não foi bom demais.

Para entender se o problema estava carregando do HD ou a decodificação do PNG, modificamos isso carregando o arquivo em um fluxo de memória e, em seguida, enviando esse fluxo de memória para o decodificador .net PNG. A diferença de desempenho usando XNA ou usando a classe System.Windows.Media.Imaging.PngBitmapDecoder não é significativa. Nós obtemos aproximadamente os mesmos níveis de desempenho.

Nossos benchmarks mostram os seguintes resultados de desempenho:

Carregar imagens do disco: 37.76ms 1%Decode PNGs: 2816.97ms 77%Carregar imagens no hardware de vídeo: 196.67ms 5%Composição: 87,80ms 2%Obter o resultado da composição de Video Hardware: 166.21ms 5%Codificar para PNG: 318.13ms 9%Armazenar em disco: 3.96ms 0%Limpeza: 53,00 ms 1%

Total: 3680,50 ms 100%

A partir desses resultados, vemos que as partes mais lentas são quando decodificam o PNG.

Então, estamos nos perguntando se não haveria um decodificador de PNG que pudéssemos usar, o que nos permitiria reduzir o tempo de decodificação do PNG. Também consideramos manter as imagens descompactadas no disco rígido, mas cada imagem teria 10MB de tamanho em vez de 1MB e como há várias dezenas de milhares dessas imagens armazenadas no disco rígido, não é possível armazená-las sem compressão.

EDIT: mais informações úteis:

O benchmark simula o carregamento de 20 imagens PNG e sua composição em conjunto. Isso corresponderá aproximadamente ao tipo de solicitações que obteremos no ambiente de produção.Cada imagem usada na composição tem 1600x1600 de tamanho.A solução envolverá até 10 servidores com carga balanceada, como o que estamos discutindo aqui. Assim, o esforço extra de desenvolvimento de software poderia valer a economia nos custos de hardware.Armazenar em cache as imagens de origem decodificadas é algo que estamos considerando, mas cada composição provavelmente será feita com imagens de origem completamente diferentes, portanto, as falhas de cache serão altas e o ganho de desempenho, baixo.Os benchmarks foram feitos com uma placa de vídeo de baixa qualidade, então podemos esperar que a decodificação do PNG seja um gargalo de desempenho ainda maior usando uma placa de vídeo decente.

questionAnswers(4)

yourAnswerToTheQuestion