[Gfoss] libjpeg sucks

a.furieri a lqt.it a.furieri a lqt.it
Lun 26 Lug 2010 09:14:14 CEST


oggi tocca abbassare la cresta (e chiedere umilmente scusa):
anche nel mondo FLOSS ogni tanto si scopre qualche "cappella"

ho appena scoperto che libjpeg [la libreria open source
che gestisce *tutte* le immagini JPEG] è lenta da morire.

Ancor peggio: libjpeg quasi sicuramente è il codec JPEG
più inefficiente e lento oggi disponibile sul mercato: 
qualsiasi equivalente proprietario gli bagna il naso,
quanto meno su piattaforme x86 / amd64

la causa: 
=========
fin dal tempo dei primi Pentium Intel ha introdotto in 
hardware il set di istruzioni MMX/SSE con lo scopo di 
supportare i codecs multimediali.
Con i Core 2, i7, i5 etc è stato introdotto SSE2 che
è ancora più potente.
Ma libjpeg ignora del tutto queste istruzioni, mentre
invece i codes proprietari le sfruttano al meglio.

la cura:
========
fortunatamente esiste il progetto libjpeg-turbo.
in pratica è un clone esattamanente identico a libjpeg (stesse
identiche API/ABI), che però gestisce (da assembler) le estensioni 
MMX/SSE2 - in questo modo praticamente di dimezzano i tempi di coding
e decoding. risultati misurati personalmente sul campo (su i5):

coding: 2.5secs -> 1.1secs
decoding: 1.7secs -> 0.9secs

licenza: wxWidgets [LGPL, ma consente static linkage]

riferimenti:
============
http://libjpeg-turbo.virtualgl.org/
http://sourceforge.net/projects/libjpeg-turbo/

commento:
=========
probabilmente una "sega mentale" per qualsiasi uso ordinario.
ma in alcuni ambiti applicativi (penso in particolare ai
server WMS) potrebbe anche segnare una differenza significativa.
ovviamente il beneficio si estende anche ai Tiff/Jpeg

ad ogni modo libjpeg-turbo mi pare assolutamente stabile
ed affidabile.
- fare la build è un piacere (anche su WinOZ MSYS+MinGW)
- occorre preinstallare l'assembler NASM
- dopo di che basta copiare la "nuova" libjpeg al posto
  di quella "di sistema" ... voila, il gioco è fatto :-)

ciao Sandro

P.S. (per Frankie) 
fare un pensierino per debianizzare libjpeg-turbo: perchè no ???


Maggiori informazioni sulla lista Gfoss