Chris@43: #include Chris@43: #include Chris@43: #include Chris@43: Chris@43: #include "zlib.h" Chris@43: Chris@43: Chris@43: void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B) Chris@43: { Chris@43: R->HighPart = A.HighPart - B.HighPart; Chris@43: if (A.LowPart >= B.LowPart) Chris@43: R->LowPart = A.LowPart - B.LowPart; Chris@43: else Chris@43: { Chris@43: R->LowPart = A.LowPart - B.LowPart; Chris@43: R->HighPart --; Chris@43: } Chris@43: } Chris@43: Chris@43: #ifdef _M_X64 Chris@43: // see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc Chris@43: unsigned __int64 __rdtsc(void); Chris@43: void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) Chris@43: { Chris@43: // printf("rdtsc = %I64x\n",__rdtsc()); Chris@43: pbeginTime64->QuadPart=__rdtsc(); Chris@43: } Chris@43: Chris@43: LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) Chris@43: { Chris@43: LARGE_INTEGER LIres; Chris@43: unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart)); Chris@43: LIres.QuadPart=res; Chris@43: // printf("rdtsc = %I64x\n",__rdtsc()); Chris@43: return LIres; Chris@43: } Chris@43: #else Chris@43: #ifdef _M_IX86 Chris@43: void myGetRDTSC32(LARGE_INTEGER * pbeginTime64) Chris@43: { Chris@43: DWORD dwEdx,dwEax; Chris@43: _asm Chris@43: { Chris@43: rdtsc Chris@43: mov dwEax,eax Chris@43: mov dwEdx,edx Chris@43: } Chris@43: pbeginTime64->LowPart=dwEax; Chris@43: pbeginTime64->HighPart=dwEdx; Chris@43: } Chris@43: Chris@43: void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) Chris@43: { Chris@43: myGetRDTSC32(pbeginTime64); Chris@43: } Chris@43: Chris@43: LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) Chris@43: { Chris@43: LARGE_INTEGER LIres,endTime64; Chris@43: myGetRDTSC32(&endTime64); Chris@43: Chris@43: LIres.LowPart=LIres.HighPart=0; Chris@43: MyDoMinus64(&LIres,endTime64,beginTime64); Chris@43: return LIres; Chris@43: } Chris@43: #else Chris@43: void myGetRDTSC32(LARGE_INTEGER * pbeginTime64) Chris@43: { Chris@43: } Chris@43: Chris@43: void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) Chris@43: { Chris@43: } Chris@43: Chris@43: LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) Chris@43: { Chris@43: LARGE_INTEGER lr; Chris@43: lr.QuadPart=0; Chris@43: return lr; Chris@43: } Chris@43: #endif Chris@43: #endif Chris@43: Chris@43: void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf) Chris@43: { Chris@43: if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64))) Chris@43: { Chris@43: pbeginTime64->LowPart = GetTickCount(); Chris@43: pbeginTime64->HighPart = 0; Chris@43: } Chris@43: } Chris@43: Chris@43: DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) Chris@43: { Chris@43: LARGE_INTEGER endTime64,ticksPerSecond,ticks; Chris@43: DWORDLONG ticksShifted,tickSecShifted; Chris@43: DWORD dwLog=16+0; Chris@43: DWORD dwRet; Chris@43: if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64))) Chris@43: dwRet = (GetTickCount() - beginTime64.LowPart)*1; Chris@43: else Chris@43: { Chris@43: MyDoMinus64(&ticks,endTime64,beginTime64); Chris@43: QueryPerformanceFrequency(&ticksPerSecond); Chris@43: Chris@43: Chris@43: { Chris@43: ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog); Chris@43: tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog); Chris@43: Chris@43: } Chris@43: Chris@43: dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted)); Chris@43: dwRet *=1; Chris@43: } Chris@43: return dwRet; Chris@43: } Chris@43: Chris@43: int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr) Chris@43: { Chris@43: FILE* stream; Chris@43: unsigned char* ptr; Chris@43: int retVal=1; Chris@43: stream=fopen(filename, "rb"); Chris@43: if (stream==NULL) Chris@43: return 0; Chris@43: Chris@43: fseek(stream,0,SEEK_END); Chris@43: Chris@43: *plFileSize=ftell(stream); Chris@43: fseek(stream,0,SEEK_SET); Chris@43: ptr=malloc((*plFileSize)+1); Chris@43: if (ptr==NULL) Chris@43: retVal=0; Chris@43: else Chris@43: { Chris@43: if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize)) Chris@43: retVal=0; Chris@43: } Chris@43: fclose(stream); Chris@43: *pFilePtr=ptr; Chris@43: return retVal; Chris@43: } Chris@43: Chris@43: int main(int argc, char *argv[]) Chris@43: { Chris@43: int BlockSizeCompress=0x8000; Chris@43: int BlockSizeUncompress=0x8000; Chris@43: int cprLevel=Z_DEFAULT_COMPRESSION ; Chris@43: long lFileSize; Chris@43: unsigned char* FilePtr; Chris@43: long lBufferSizeCpr; Chris@43: long lBufferSizeUncpr; Chris@43: long lCompressedSize=0; Chris@43: unsigned char* CprPtr; Chris@43: unsigned char* UncprPtr; Chris@43: long lSizeCpr,lSizeUncpr; Chris@43: DWORD dwGetTick,dwMsecQP; Chris@43: LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc; Chris@43: Chris@43: if (argc<=1) Chris@43: { Chris@43: printf("run TestZlib [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n"); Chris@43: return 0; Chris@43: } Chris@43: Chris@43: if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0) Chris@43: { Chris@43: printf("error reading %s\n",argv[1]); Chris@43: return 1; Chris@43: } Chris@43: else printf("file %s read, %u bytes\n",argv[1],lFileSize); Chris@43: Chris@43: if (argc>=3) Chris@43: BlockSizeCompress=atol(argv[2]); Chris@43: Chris@43: if (argc>=4) Chris@43: BlockSizeUncompress=atol(argv[3]); Chris@43: Chris@43: if (argc>=5) Chris@43: cprLevel=(int)atol(argv[4]); Chris@43: Chris@43: lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200; Chris@43: lBufferSizeUncpr = lBufferSizeCpr; Chris@43: Chris@43: CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress); Chris@43: Chris@43: BeginCountPerfCounter(&li_qp,TRUE); Chris@43: dwGetTick=GetTickCount(); Chris@43: BeginCountRdtsc(&li_rdtsc); Chris@43: { Chris@43: z_stream zcpr; Chris@43: int ret=Z_OK; Chris@43: long lOrigToDo = lFileSize; Chris@43: long lOrigDone = 0; Chris@43: int step=0; Chris@43: memset(&zcpr,0,sizeof(z_stream)); Chris@43: deflateInit(&zcpr,cprLevel); Chris@43: Chris@43: zcpr.next_in = FilePtr; Chris@43: zcpr.next_out = CprPtr; Chris@43: Chris@43: Chris@43: do Chris@43: { Chris@43: long all_read_before = zcpr.total_in; Chris@43: zcpr.avail_in = min(lOrigToDo,BlockSizeCompress); Chris@43: zcpr.avail_out = BlockSizeCompress; Chris@43: ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH); Chris@43: lOrigDone += (zcpr.total_in-all_read_before); Chris@43: lOrigToDo -= (zcpr.total_in-all_read_before); Chris@43: step++; Chris@43: } while (ret==Z_OK); Chris@43: Chris@43: lSizeCpr=zcpr.total_out; Chris@43: deflateEnd(&zcpr); Chris@43: dwGetTick=GetTickCount()-dwGetTick; Chris@43: dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE); Chris@43: dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE); Chris@43: printf("total compress size = %u, in %u step\n",lSizeCpr,step); Chris@43: printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.); Chris@43: printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.); Chris@43: printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart); Chris@43: } Chris@43: Chris@43: CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr); Chris@43: UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress); Chris@43: Chris@43: BeginCountPerfCounter(&li_qp,TRUE); Chris@43: dwGetTick=GetTickCount(); Chris@43: BeginCountRdtsc(&li_rdtsc); Chris@43: { Chris@43: z_stream zcpr; Chris@43: int ret=Z_OK; Chris@43: long lOrigToDo = lSizeCpr; Chris@43: long lOrigDone = 0; Chris@43: int step=0; Chris@43: memset(&zcpr,0,sizeof(z_stream)); Chris@43: inflateInit(&zcpr); Chris@43: Chris@43: zcpr.next_in = CprPtr; Chris@43: zcpr.next_out = UncprPtr; Chris@43: Chris@43: Chris@43: do Chris@43: { Chris@43: long all_read_before = zcpr.total_in; Chris@43: zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress); Chris@43: zcpr.avail_out = BlockSizeUncompress; Chris@43: ret=inflate(&zcpr,Z_SYNC_FLUSH); Chris@43: lOrigDone += (zcpr.total_in-all_read_before); Chris@43: lOrigToDo -= (zcpr.total_in-all_read_before); Chris@43: step++; Chris@43: } while (ret==Z_OK); Chris@43: Chris@43: lSizeUncpr=zcpr.total_out; Chris@43: inflateEnd(&zcpr); Chris@43: dwGetTick=GetTickCount()-dwGetTick; Chris@43: dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE); Chris@43: dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE); Chris@43: printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step); Chris@43: printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.); Chris@43: printf("uncpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.); Chris@43: printf("uncpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart); Chris@43: } Chris@43: Chris@43: if (lSizeUncpr==lFileSize) Chris@43: { Chris@43: if (memcmp(FilePtr,UncprPtr,lFileSize)==0) Chris@43: printf("compare ok\n"); Chris@43: Chris@43: } Chris@43: Chris@43: return 0; Chris@43: }