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