Desempenho na Web

Há pouco tempo atrás O Google lançou seu codificador JPEG Guetzlique alega uma melhoria de 20 a 30% no tamanho do arquivo em relação ao libjpeg. Como fiquei intrigado, decidi experimentar. Minha ferramenta preferida para otimizar JPEGs tem sido o jpeg-recompress, um dos binários disponíveis no diretório projeto jpeg-archive. Ele é altamente configurável, razoavelmente rápido e realmente oferece otimização de JPEGs. Mas como o Guetzli se compara?

Um caso de teste rudimentar

Para começar, usei um retrato meu:

Autorretrato!

O que o senhor vê acima é uma versão muito menor da fonte JPEG não otimizada com a qual trabalhei. A imagem original tem 2560×2561 e pesa 861 KB. Quando processei essa imagem com o Guetzli, usei o seguinte comando:


guetzli unoptimized.jpg guetzli.jpg

Isso demorou um pouco. Bastante um bom tempo, na verdade. No entanto, isso não é uma surpresa, considerando que o Google explica no readme do projeto que o senhor deve esperar cerca de um minuto de tempo de CPU para cada megapixel (minha imagem de teste tinha 2,5 megapixels). Quando Guetzli terminou, o tamanho do arquivo de saída era de 770 KB. Cerca de 11% menor que o arquivo de origem. Nada mal. Em seguida, executei o jpeg-recompress na fonte não otimizada usando este comando:


jpeg-recompress --accurate --strip unoptimized.jpg guetzli.jpg

O jpeg-recompress se saiu um pouco melhor para mim, com um tamanho de arquivo de saída de 662 KB, cerca de 23% menor do que a fonte não otimizada e 15% menor do que a versão otimizada por Guetzli. Isso significa que a compressão de jpeg é a vencedora indiscutível? Depende muito. A maneira como o jpeg-recompress funciona é iterando sobre uma imagem dentro de um intervalo de qualidade padrão de 40 a 95 para encontrar o melhor compromisso entre qualidade e tamanho do arquivo. O usuário pode especificar a quantidade de loops, mas o padrão (que geralmente é suficiente) é 6. Ao otimizar meu JPEG de retrato, o jpeg-recompress chegou a uma qualidade de 80. A configuração de qualidade padrão do Guetzli é 95. Então, o que acontece se eu definir o Guetzli em uma configuração comparável? Infelizmente, não consegui. O Guetzli não permite que o senhor especifique uma configuração de qualidade inferior a 84. Portanto, para tornar as coisas um pouco mais comparáveis à saída de compressão jpeg, optei pela configuração mínima permitida de 84:


guetzli --quality 84 unoptimized.jpg guetzli-q84.jpg

O resultado final? Após uma (longa) espera, a versão otimizada por Guetzli em uma configuração de qualidade de 84 foi 636 KB. 26 KB menor do que a compressão jpeg em uma configuração de qualidade de 80. Como a Guetzli se compara à concorrência no que diz respeito à qualidade visual? No caso da minha imagem de retrato, as duas versões otimizadas são praticamente indistinguíveis.

Comparações de imagens otimizadas

É claro que esse é apenas um exemplo isolado. Como é o desempenho do Guetzli em um conjunto completo de imagens? Vamos dar uma olhada!

Desempenho da Guetzli em um conjunto de imagens

Um único caso de teste de alguns otimizadores de imagem pode ser útil, mas realmente fornece apenas uma visão limitada do desempenho. Se quisermos ter uma noção mais ampla de como um otimizador funciona, devemos testá-lo em um grande conjunto de imagens. Usei vários otimizadores de imagem em um conjunto de quase 500 imagens não otimizadas. Essas imagens eram de vários alimentos. O tipo de imagem que o senhor estaria acostumado a ver em um site de receitas. Usei o find para processar o lote de imagens (usando a técnica que descrevi em esta postagem do blog). A carga útil não otimizada dessas imagens foi de 37.388 kilobytes. Em cada caso, busquei uma qualidade-alvo de 84, a menor qualidade permitida pelo codificador Guetzli. Também usei o time para ter uma ideia de quanto tempo cada otimizador leva. Abaixo estão os resultados que mostram o comando usado para cada otimizador, o tempo que cada um levou para processar o lote de imagens não otimizadas e o tamanho cumulativo da saída otimizada:








Comando Optimizer Tempo Tamanho (KB)
(Não otimizado) n/a 37,388
jpegoptim -m84 -s --all-progressive 16s 16,136
jpeg-recompress -n 84 -x 84 -a -s 4m 45s 15,320
guetzli --quality 84 150m 41s 13,636
cjpeg -optimize -quality 84 -progressive 38s 15,364

Observação: O binário cjpeg usado é do mozjpeg 3.1

Agora vamos ao que interessa: O Guetzli supera todos os outros otimizadores na configuração de qualidade mais baixa permitida de 84, mas é preciso um brutal tempo para fazer isso. Embora a maioria dos otimizadores chegue razoavelmente perto, eles podem fazer isso várias ordens de magnitude mais rapidamente.

Além disso, uma configuração de qualidade mínima de 84 não é tão baixa quanto a que temos deveria quando se trata de imagens da Web. Temos que tratar a qualidade da imagem como uma questão subjetiva, pois há inúmeras variáveis envolvidas na forma como o usuário avalia a qualidade da imagem. E quanto à distância de visualização, ao tamanho do dispositivo físico ou à resolução da tela? As regras são simples: Se o senhor não consegue perceber a diferença entre uma imagem não otimizada e uma otimizada, seus usuários também não conseguirão. Se o senhor puder perceber a diferença, isso ainda não é garantia de que seus usuários conseguirão discernir a qualidade, pois provavelmente não terão uma versão superior da mesma imagem como referência.

Ao executar o jpeg-recompress com um intervalo de qualidade especificado de 30 a 70 no mesmo conjunto de imagens, consegui obter um tamanho de saída de 11.114 KB. Isso é mais alguns megabytes abaixo do melhor que o Guetzli conseguiu fazer. Embora a qualidade de saída tenha sido menor, os resultados ainda foram aceitáveis (embora subjetivamente).

Outro aspecto a ser considerado é que o Guetzli não pode codificar JPEGs progressivos. Os JPEGs progressivos geralmente são um pouco menores que os JPEGs de linha de base. Melhor ainda, devido à forma como os JPEGs progressivos são carregados, eles minimizam a mudança de layout. Menos mudança de layout significa menos renderização de página. Menos renderização significa menos consumo de bateria do dispositivo para processamento.

Embora o Guetzli seja altamente eficaz em situações em que a qualidade é a principal preocupação, eu pessoalmente prefiro outros otimizadores. Embora o Guetzli supere com folga a concorrência em configurações de qualidade comparáveis, ele não permite que o senhor otimize imagens em uma configuração inferior a 84. Devido a essa limitação, ao fato de exigir muito da CPU e à falta de suporte a JPEG progressivo, não me sinto à vontade para recomendá-lo. Mas não acredite em minha palavra. Dê uma olhada nesta lista de artigos sobre o Guetzli e forme suas próprias opiniões:

Independentemente de como o senhor decidir otimizar suas imagens, saiba que algo é sempre melhor do que nada. Independentemente do otimizador que usar, o senhor estará fazendo o que é certo para seus usuários, e isso é o que realmente importa.