많은 무손실 압축 방식들이 창궐하지만, 역시 여전히 이 바닥 거목은 zip이다.

그리고, 이 zip의 압축률을 향상시키기 위한 시도는 계속되고 있다.


대표적으로는 구글에서 공개한 Zopfli가 있다. (이전 블로그 글 참조)

하지만, 이 Zopfli는 뛰어난 압축률에도 불구하고 속도가 너무 느려 일상적으로 사용하기에는 무리가 따른다.


또 하나의 시도가 바로 fast_zlib이다.




이 추가 라이브러리는 기존 zlib에서 longest_match()를 최적화하는 것이 핵심이다.

이 라이브러리의 특징은 더 작은 파일더 빠른 시간에 생성해내는 것이 특징이다.


C 버전과 어셈블리 버전 두 가지로 구현되어 있어 상황에 맞게 적용할 수 있다.

참고로, 어셈블리 버전은 x86 용으로만 개발되어 있어 x64 환경 등에서는 적용이 곤란하다.



1. C버전


zlib의 deflate.c에 있는 longest_match() 함수를 교체하면 사용할 수 있다.

원문을 읽어보면 설명이 다소 모호한 점[각주:1]이 있는데, 아마도 deflate.c 자체를 뜯어고치라는 글을 git에 쓰기 부담되서 그런 것 같다.


사실 이런 부분은 fast_zlib의 제작자인 gildor2가 너무 조심하는 것 같은 것이 뜯어고쳐 배포해도 아무 문제가 없기 때문이다.


This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.

Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu
If you use the zlib library in a product, we would appreciate *not* receiving lengthy legal documents to sign. The sources are provided for free but without warranty of any kind. The library has been entirely written by Jean-loup Gailly and Mark Adler; it does not include third-party code.
If you redistribute modified sources, we would appreciate that you include in the file ChangeLog history information documenting your changes. Please read the FAQ for more information on the distribution of modified source versions.


요약: 이 소프트웨어로 인해 발생하는 어떠한 피해도 우린 책임 안 지며, 마음대로 배포해도 되고, 수정해도 됨.

단, 니가 짰다고 구라는 치지 마. 이건 우리가 직접 짠 코드임. 고쳤으면 고쳤다고 명시해주면 더욱 좋고.


각설하고, C 버전을 적용하려면 fast_zlib를 다운받아 match.h에 있는 longest_match() 함수를 deflate.c에 적용하면 된다.

물론, 이 과정에서 이와 관련된 #define 등을 모두 적용해야 함은 물론이고.


레퍼런스에 있는 방식으로 적용해도 별 문제 없겠지만, 오히려 더 복잡해지는 느낌이다.


원본을 삭제하는 것이 부담스럽다면 #ifdef를 하나 추가해서 기본적으로는 fast_zlib의 longest_match()를 사용하고, 원본은 비활성화시키는 방법도 가능하다.



2. 어셈블리 버전

다시 한 번 얘기하는데, 어셈블리 버전은 x86 버전만 만들어져있다. 즉, x64 버전은 없다.

이 버전을 사용하기 위해선 일단 zlib을 컴파일하기 전에 ASMV를 미리 선언해두어야 한다.
그렇게 하고 zlib를 컴파일하면 longest_match()match_init()가 선언만 되어있고, 본체가 없는 상태로 컴파일 된다.

다음으로 fast_zlib에 들어있는 match32.asm를 어셈블해서 match.obj를 생성한다.
어셈블러는 반드시 nasm만 사용해야 한다.

nasm match32.asm -f win32 -o match.obj


마지막으로 실행파일을 컴파일할 때 정적 라이브러리들과 함께 이 match.obj를 포함하면 된다.


3. 테스트 결과

HEIF 파일 15개를 모두 png로 변환하는데 소요되는 시간을 비교했다.

즉, 이 테스트 결과의 소요시간에는 HEIF 디코딩 시간이 포함되므로 시간의 비율을 계산하는 것은 아무런 의미가 없다.


- zlib 원본으로 변환시 3분 7초 소요, 결과 파일은 15개 총합 157,617kB

- fast_zlib의 C 버전과 어셈블리 버전은 (당연히) 동일한 크기의 파일이 생성되며 크기는 150,858kB

- C 버전은 2분 51초 소요, 어셈블리 버전은 2분 52초가 소요됨



4. 결론


압축 파일의 크기는 약 5% 정도가 줄어들었으며, 시간도 단축되었다.

즉, 이 라이브러리는 충분히 사용할만한 가치가 있다.


단, 굳이 어셈블리 버전을 쓸 필요는 없고, C 버전을 사용하면 충분하다.



  1. C버전은 ASMV를 선언하지 않아야 정상인데, 선언하는 것으로 되어있어 처음엔 왜 이렇게 하는지 이해를 못했음 [본문으로]

+ Recent posts