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