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