JPEG 라이브러리 성능 비교 (Visual C++)

무손실 이미지 포맷인 PNG나, 차세대 포맷 JPEG2000, JPEG XR[각주:1]이 나와도 역시 이미지 포맷의 대세는 JPEG이다.

하지만, JPEG은 실수 기반 연산[각주:2]이 기본이기 때문에, 압축/복원 속도가 느릴 수밖에 없다.


이런 문제를 해결하기 위해 개발된 고속 라이브러리들이 있다. 이들은 MMX/SIMD 등의 CPU 성능을 최대한 활용한다.

이러한 라이브러리들과 사실상 이 바닥 표준인 libjpeg(Independent JPEG Gruop)의 성능을 비교해봤다.



0. 비교 대상


- jpeglib 6b with SIMD Extension (VC++ 6.0에서 컴파일되는 유일한 고속 라이브러리, 이하 6b-SIMD)

- libjpeg 8c (VC++ 6.0 및 VC++ 2010에서 테스트)

- Intel JPEG Library(IJL) v1.51: 인텔이 예전에 공개한 JPEG 라이브러리[각주:3]

- libjpeg-turbo 1.1.1: 무려 크롬에서도 사용되는 가장 빠른 JPEG 라이브러리. VC++ 2005 이후에서만 사용 가능



1. 파일 크기


전체적인 성능을 테스트하기 위해 프로그램을 하나 만들었다.

이 프로그램은 대략 2가지 기능을 지원한다.

  - JPEG 파일을 여러번 읽었다 쓰며 시간을 측정

  - PNG 파일을 읽어 JPEG로 저장함


이 프로그램들 자체의 크기와 이들을 UPX로 압축했을 때의 크기를 비교했다.


비슷하게 MMX/SIMD를 사용하는 확장인데, 6b-SIMD는 파일 크기가 작고, libjpeg-turbo는 크기가 큼


인텔이 개발한 IJL을 사용한 경우가 파일 크기가 가장 컸다.

다른 방식에 비해 100KB 이상 컸다. 다행히(?) UPX로 압축한 크기는 서로 비슷했다.



2. JPEG 읽기/쓰기 시간


1680x1050 크기의 이미지를 하나 선정해서 500번씩 읽고 쓰는 테스트를 했다.

이미지는 그냥 인터넷에서 대충 골랐다. ^^;


역시 C/C++만으로 작성된 라이브러리보다는 MMX/SIMD 연산을 사용하는 쪽이 빠름


몇 가지 점이 눈에 띈다.

  - libjpeg-turbo는 6b-SIMD를 개선해 개발한 것이지만, 특이하게도 읽는 시간은 6b-SIMD보다 다소 오래 걸린다.

     하지만, 쓰는 속도는 30% 정도 빠르다.

  - IJL은 이 두 라이브러리에 비해 약간 느리기는 하지만, libjpeg에 비해서는 2배 이상 빠르다.

  - 같은 libjpeg-8c지만, VC10에서 컴파일한 것이 VC6에서 컴파일한 것보다 20% 가까이 빠르다.



3. JPEG 파일 크기


JPEG는 동영상처럼 압축률을 정해서 압축할 수는 없고, 압축 품질(1~100)을 지정하여 저장한다.

PNG 포맷의 이미지를 서로 다른 품질로 저장한 크기를 비교했다.


지정된 품질이 같으면 파일 크기도 비슷함


그래프에서 볼 수 있듯이, 저장된 파일의 크기는 압축 라이브러리 별로 비슷하다.



4. 화질


PSNR은 엄밀히 말해 화질을 비교하기보다는 왜곡도를 비교하는 척도다.

3.과 동일하게, PNG 포맷의 이미지를 서로 다른 품질로 저장해서 원본과의 PSNR을 계산했다.



앞에서 얘기한 속도 및 파일 크기와 비교해보면 몇 가지 눈에 띄는 점이 있다.

  - Q=95 이상에서의 화질은 libjpeg-8c가 최강임

  - Q=90 이상에서는 libjpeg-8c가 6b-SIMD 및 libjpeg-turbo보다 화질이 떨어짐

  - 6b-SIMD와 libjpeg-turbo의 품질은 대동소이

  - 전체적으로 IJL의 화질은 다른 라이브러리들에 비해 떨어지는 편임


여러모로 테스트해본 결과 내 결론은 다음과 같다.

- VC++ 6.0에서는 6b-SIMD를 사용

- VC++ 2005 이후 버전에서는 libjpeg-turbo를 사용



덧. 인텔 IJL 지못미. 당시엔 걸작이었겠지만, 지금은 좀 아닌 듯.


  1. MS가 만든 차세대 이미지 포맷. 2009년 3월 16일 JPEG XR은 ITU-T 권고안 T.832로 최종 승인됨. [본문으로]
  2. (분야에 따라서는 FFT라고 불리기도 하는) DCT라는 코사인 기반의 연산이 압축의 핵심이다. [본문으로]
  3. 최신 버전은 인텔이 IPP라는 패키지로 판매함. 1.51은 공개되었음. [본문으로]