출처 : http://javawork.egloos.com/1813530

 

miniLZO와 zlib 두가지 압축 라이브러리로 테스트 해보았습니다.

zlib은 많이들 아실테고 miniLZO는 LZO 경량화 버젼인데 compress는 pretty fast하고 decompress는 very fast 하다는 군요. :)
아래 URL에서 받으실 수 있습니다.
miniLZO : http://www.oberhumer.com/opensource/lzo/
zlib : http://www.zlib.net/

* 간단 사용법
 - compress( unsigned char* dstBuffer, unsigned long* dstBufferLen, unsigned char* srcBuffer, unsigned long srcBufferLen )
 - decompress( unsigned char* dstBuffer, unsigned long* dstBufferLen, unsigned char* srcBuffer, unsigned long srcBufferLen )
 -  대략 이런 형식입니다.

* 버퍼 사이즈에 따른 압축율 및 압축/해제시간 비교 (size:byte, 압축/해제 시간:ms)

size

zlib com

zlib decom

zlib rate

lzo com

lzo decom

lzo rate

2046

0.28

0.06

0.58

0.10

0.007

0.92

1696

0.22

0.03

0.53

0.05

0.007

0.9

1396

0.20

0.02

0.5

0.07

0.006

0.88

1096

0.19

0.02

0.45

0.02

0.006

0.85

796

0.15

0.01

0.41

0.01

0.005

0.8

496

0.11

0.01

0.41

0.009

0.004

0.8

196

0.08

0.01

0.49

0.005

0.001

0.88

146

0.07

0.009

0.56

0.003

0.001

0.88

96

0.07

0.008

0.63

0.002

0.001

0.91

46

0.06

0.002

0.89

0.001

0

1.09



  • 압축/해제에 걸리는 시간은 miniLZO가 빠르고 압축율은 zlib이 좋습니다.
  • 대략 50 byte 이하의 패킷은 압축하면 추가 정보 기록으로 인해 오히려 크기가 커집니다. 패킷을 선택적으로 압축을 하는 기능이 필수일것  같습니다.
  • miniLZO의 경우 효율을 기대하려면 200 byte 이상은 되어야 할듯 합니다.(0.8)
  • 원래의 의도는 이동 패킷을 압축해볼 생각이었는데 보통 x/y/z를 하나의 위치로 보면 좌표값은 12 byte인데(float 3개) 이 좌표값이 16개는 들어가야 200 byte가 되니 현실성이 없을것 같습니다.
  • 처음 로그인시에 사용하는 정보들(캐릭터, 인벤토리 정보)이나 기타 자주 보내지 않는 덩치큰 패킷들(200 byte이상)을 보낼때 선택적으로 사용해야 할 듯 합니다.
  • 이전에 만든 MMORPG의 캐릭터, 인벤토리 정보 패킷을 보니 각각 200 byte 정도 되는군요.
  • 다시 테스트 해보니 50 byte 이하의 패킷은 압축을 하면 크기가 늘어나는 것은 사실이지만 100 byte 이상의 패킷은 크기와 압축율과의 상관관계는 없어 보이네요.
안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스
,