zlib 사용 및 성능 테스트

전재 출처 를 밝 혀 주 십시오:http://blog.csdn.net/jmppok/article/details/18087685
zlib 는 가장 자주 사용 하 는 압축 도구 로 서 본 고 는 그 사용 에 대해 간단 한 설명 을 하고 간단 한 성능 테스트 를 실시한다.
1.컴 파일 다운로드
zlib 홈 페이지 에서 다운로드 가능:http://www.zlib.net/
다운로드 후 바로 make 가능 합 니 다.make 후 디 렉 터 리 에 libz.a 를 생 성 합 니 다.
2.사용
zlib.h 와 libz.a 를 참조 하 셔 도 됩 니 다.관건 은 zlib.h 입 니 다.일부 함 수 를 제공 합 니 다.
다음은 인용"http://www.cppblog.com/woaidongmao/archive/2009/09/07/95495.html"zlib.h 에 대한 설명:
모두 zlib.h 에서 매크로 가 어 지 럽 지 않 은 것 을 보 았 습 니 다.사실은 각종 컴 파일 러 와 일부 유형의 정 의 를 호 환 하기 위해 서 입 니 다.주요 함수 의 원형 성명 을 꽉 잡 으 면 이런 것들 의 영향 을 받 지 않 습 니 다.
관건 적 인 함 수 는 몇 가지 가 있다.
(1)int compress (Bytef *dest,   uLongf *destLen, const Bytef *source, uLong sourceLen);
원본 버퍼 를 목적 버퍼 로 압축 하면 그렇게 간단 합 니 다.함수 하나 로 해결 합 니 다.
(2) int compress2 (Bytef *dest,   uLongf *destLen,const Bytef *source, uLong sourceLen,int level);
기능 은 이전 함수 와 마찬가지 로 하나의 매개 변 수 는 압축 품질 과 압축 수도 간 의 관계(0-9)를 지정 할 수 있 습 니 다.이 매개 변 수 를 확신 하지 못 한다 면 너무 신경 쓰 지 않 고 이 치 를 알 았 으 면 좋 겠 습 니 다.높 은 압축 비 를 얻 으 려 면 시간 이 많이 걸 립 니 다.
(3) uLong compressBound (uLong sourceLen);
필요 한 버퍼 길 이 를 계산 합 니 다.압축 하기 전에 소스 렌 의 데이터 압축 후 얼마나 큰 지 알 고 싶다 고 가정 하면 이 함수 로 계산 할 수 있 습 니 다.이 함 수 는 정확 한 결 과 를 얻 을 수 없 지만 실제 출력 길 이 는 계산 한 길이 보다 작 을 것 입 니 다.
(4) int uncompress (Bytef *dest,   uLongf *destLen,const Bytef *source, uLong sourceLen);
압축 풀기(이름 만 봐 도 알 수 있다:)
(5) deflateInit() + deflate() + deflateEnd()
3 개의 함 수 를 결합 하여 사용 하여 압축 기능 을 완성 합 니 다.구체 적 인 용법 은 example.c 의 test 를 보십시오.deflate()함수 입 니 다.사실 copress()함수 내 부 는 이 세 가지 함수 로 이 루어 진 것 입 니 다.(공정 zlib 의 copress.c 파일)
(6) inflateInit() + inflate() + inflateEnd()
(5)와 유사 하여 압축 풀기 기능 을 완성 합 니 다.
(7)gz 로 시작 하 는 함수 입 니 다.*.gz 파일 을 조작 하 는 데 사 용 됩 니 다.파일 stdio 호출 방식 과 유사 합 니 다.어떻게 사용 하 는 지 알 고 싶 으 면 example.c 의 testgzio()함수,아주 쉬 워 요.
(8)
버 전 획득 과 같은 다른 함 수 는 말 하지 않 겠 습 니 다.
결론:사실은 copress()와 uncompress()두 함수 만 있 으 면 대부분의 응용 에서 충분 합 니 다.
3.성능 테스트
1M 데이터 에 대해 각각 copress 압축 과 uncompress 압축 을 호출 하고 10 회 순환 합 니 다.
코드 는 다음 과 같 습 니 다:
#include <stdio.h>
#include <time.h>
#include "zlib.h"



const int MAX_BUFFER_SIZE = 1024*1024*4;
unsigned char DATA_BUFFER[MAX_BUFFER_SIZE];

void testCompress()
{
	const char * file = "/tmp/e2.txt.backup";
	FILE *f1 = fopen(file,"r");
	if(f1)
	{
		fseek(f1,0,2);
		int len = ftell(f1);
		fseek(f1,0,0);
		
		char * data = new char[len];
		fread(data,1,len,f1);
		fclose(f1);
		

		//uLong dst_len = MAX_BUFFER_SIZE;
		//Bytef * dst = (Bytef*)DATA_BUFFER;
			
		clock_t start = clock();	
		for(int i=0; i<10; i++)	
		{
			uLong dst_len = MAX_BUFFER_SIZE;
			Bytef * dst = (Bytef*)DATA_BUFFER;
			compress(dst,&dst_len,(Bytef *)data,(uLong)len);
		}
		clock_t end = clock();
		printf("time used(ms):%.2f
",1000.0*(end-start)/CLOCKS_PER_SEC); delete [] data; } } void testunCompress() { const char * file = "/tmp/2.gz"; FILE *f1 = fopen(file,"r"); if(f1) { fseek(f1,0,2); int len = ftell(f1); fseek(f1,0,0); char * data = new char[len]; fread(data,1,len,f1); fclose(f1); //uLong dst_len = MAX_BUFFER_SIZE; //Bytef * dst = (Bytef*)DATA_BUFFER; clock_t start = clock(); for(int i=0; i<10; i++) { uLong dst_len = MAX_BUFFER_SIZE; Bytef * dst = (Bytef*)DATA_BUFFER; uncompress(dst,&dst_len,(Bytef *)data,(uLong)len); } clock_t end = clock(); printf("time used(ms):%.2f
",1000.0*(end-start)/CLOCKS_PER_SEC); delete [] data; } } int main(int argc, char **argv) { testCompress(); testunCompress(); return 0; }

테스트 결과:
time used(ms):470.00
time used(ms):40.00

4.총화
zlib 는 1M 데 이 터 를 압축 하 는 데 47ms 정도 걸 리 고 4ms 정도 압축 을 풀 었 습 니 다.스트레스 해소 가 매우 빠르다.

좋은 웹페이지 즐겨찾기