1275793eaSopenharmony_ci#include <stdio.h> 2275793eaSopenharmony_ci#include <stdlib.h> 3275793eaSopenharmony_ci#include <windows.h> 4275793eaSopenharmony_ci 5275793eaSopenharmony_ci#include "zlib.h" 6275793eaSopenharmony_ci 7275793eaSopenharmony_ci 8275793eaSopenharmony_civoid MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B) 9275793eaSopenharmony_ci{ 10275793eaSopenharmony_ci R->HighPart = A.HighPart - B.HighPart; 11275793eaSopenharmony_ci if (A.LowPart >= B.LowPart) 12275793eaSopenharmony_ci R->LowPart = A.LowPart - B.LowPart; 13275793eaSopenharmony_ci else 14275793eaSopenharmony_ci { 15275793eaSopenharmony_ci R->LowPart = A.LowPart - B.LowPart; 16275793eaSopenharmony_ci R->HighPart --; 17275793eaSopenharmony_ci } 18275793eaSopenharmony_ci} 19275793eaSopenharmony_ci 20275793eaSopenharmony_ci#ifdef _M_X64 21275793eaSopenharmony_ci// see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc 22275793eaSopenharmony_ciunsigned __int64 __rdtsc(void); 23275793eaSopenharmony_civoid BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) 24275793eaSopenharmony_ci{ 25275793eaSopenharmony_ci // printf("rdtsc = %I64x\n",__rdtsc()); 26275793eaSopenharmony_ci pbeginTime64->QuadPart=__rdtsc(); 27275793eaSopenharmony_ci} 28275793eaSopenharmony_ci 29275793eaSopenharmony_ciLARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) 30275793eaSopenharmony_ci{ 31275793eaSopenharmony_ci LARGE_INTEGER LIres; 32275793eaSopenharmony_ci unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart)); 33275793eaSopenharmony_ci LIres.QuadPart=res; 34275793eaSopenharmony_ci // printf("rdtsc = %I64x\n",__rdtsc()); 35275793eaSopenharmony_ci return LIres; 36275793eaSopenharmony_ci} 37275793eaSopenharmony_ci#else 38275793eaSopenharmony_ci#ifdef _M_IX86 39275793eaSopenharmony_civoid myGetRDTSC32(LARGE_INTEGER * pbeginTime64) 40275793eaSopenharmony_ci{ 41275793eaSopenharmony_ci DWORD dwEdx,dwEax; 42275793eaSopenharmony_ci _asm 43275793eaSopenharmony_ci { 44275793eaSopenharmony_ci rdtsc 45275793eaSopenharmony_ci mov dwEax,eax 46275793eaSopenharmony_ci mov dwEdx,edx 47275793eaSopenharmony_ci } 48275793eaSopenharmony_ci pbeginTime64->LowPart=dwEax; 49275793eaSopenharmony_ci pbeginTime64->HighPart=dwEdx; 50275793eaSopenharmony_ci} 51275793eaSopenharmony_ci 52275793eaSopenharmony_civoid BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) 53275793eaSopenharmony_ci{ 54275793eaSopenharmony_ci myGetRDTSC32(pbeginTime64); 55275793eaSopenharmony_ci} 56275793eaSopenharmony_ci 57275793eaSopenharmony_ciLARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) 58275793eaSopenharmony_ci{ 59275793eaSopenharmony_ci LARGE_INTEGER LIres,endTime64; 60275793eaSopenharmony_ci myGetRDTSC32(&endTime64); 61275793eaSopenharmony_ci 62275793eaSopenharmony_ci LIres.LowPart=LIres.HighPart=0; 63275793eaSopenharmony_ci MyDoMinus64(&LIres,endTime64,beginTime64); 64275793eaSopenharmony_ci return LIres; 65275793eaSopenharmony_ci} 66275793eaSopenharmony_ci#else 67275793eaSopenharmony_civoid myGetRDTSC32(LARGE_INTEGER * pbeginTime64) 68275793eaSopenharmony_ci{ 69275793eaSopenharmony_ci} 70275793eaSopenharmony_ci 71275793eaSopenharmony_civoid BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) 72275793eaSopenharmony_ci{ 73275793eaSopenharmony_ci} 74275793eaSopenharmony_ci 75275793eaSopenharmony_ciLARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) 76275793eaSopenharmony_ci{ 77275793eaSopenharmony_ci LARGE_INTEGER lr; 78275793eaSopenharmony_ci lr.QuadPart=0; 79275793eaSopenharmony_ci return lr; 80275793eaSopenharmony_ci} 81275793eaSopenharmony_ci#endif 82275793eaSopenharmony_ci#endif 83275793eaSopenharmony_ci 84275793eaSopenharmony_civoid BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf) 85275793eaSopenharmony_ci{ 86275793eaSopenharmony_ci if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64))) 87275793eaSopenharmony_ci { 88275793eaSopenharmony_ci pbeginTime64->LowPart = GetTickCount(); 89275793eaSopenharmony_ci pbeginTime64->HighPart = 0; 90275793eaSopenharmony_ci } 91275793eaSopenharmony_ci} 92275793eaSopenharmony_ci 93275793eaSopenharmony_ciDWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) 94275793eaSopenharmony_ci{ 95275793eaSopenharmony_ci LARGE_INTEGER endTime64,ticksPerSecond,ticks; 96275793eaSopenharmony_ci DWORDLONG ticksShifted,tickSecShifted; 97275793eaSopenharmony_ci DWORD dwLog=16+0; 98275793eaSopenharmony_ci DWORD dwRet; 99275793eaSopenharmony_ci if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64))) 100275793eaSopenharmony_ci dwRet = (GetTickCount() - beginTime64.LowPart)*1; 101275793eaSopenharmony_ci else 102275793eaSopenharmony_ci { 103275793eaSopenharmony_ci MyDoMinus64(&ticks,endTime64,beginTime64); 104275793eaSopenharmony_ci QueryPerformanceFrequency(&ticksPerSecond); 105275793eaSopenharmony_ci 106275793eaSopenharmony_ci 107275793eaSopenharmony_ci { 108275793eaSopenharmony_ci ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog); 109275793eaSopenharmony_ci tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog); 110275793eaSopenharmony_ci 111275793eaSopenharmony_ci } 112275793eaSopenharmony_ci 113275793eaSopenharmony_ci dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted)); 114275793eaSopenharmony_ci dwRet *=1; 115275793eaSopenharmony_ci } 116275793eaSopenharmony_ci return dwRet; 117275793eaSopenharmony_ci} 118275793eaSopenharmony_ci 119275793eaSopenharmony_ciint ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr) 120275793eaSopenharmony_ci{ 121275793eaSopenharmony_ci FILE* stream; 122275793eaSopenharmony_ci unsigned char* ptr; 123275793eaSopenharmony_ci int retVal=1; 124275793eaSopenharmony_ci stream=fopen(filename, "rb"); 125275793eaSopenharmony_ci if (stream==NULL) 126275793eaSopenharmony_ci return 0; 127275793eaSopenharmony_ci 128275793eaSopenharmony_ci fseek(stream,0,SEEK_END); 129275793eaSopenharmony_ci 130275793eaSopenharmony_ci *plFileSize=ftell(stream); 131275793eaSopenharmony_ci fseek(stream,0,SEEK_SET); 132275793eaSopenharmony_ci ptr=malloc((*plFileSize)+1); 133275793eaSopenharmony_ci if (ptr==NULL) 134275793eaSopenharmony_ci retVal=0; 135275793eaSopenharmony_ci else 136275793eaSopenharmony_ci { 137275793eaSopenharmony_ci if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize)) 138275793eaSopenharmony_ci retVal=0; 139275793eaSopenharmony_ci } 140275793eaSopenharmony_ci fclose(stream); 141275793eaSopenharmony_ci *pFilePtr=ptr; 142275793eaSopenharmony_ci return retVal; 143275793eaSopenharmony_ci} 144275793eaSopenharmony_ci 145275793eaSopenharmony_ciint main(int argc, char *argv[]) 146275793eaSopenharmony_ci{ 147275793eaSopenharmony_ci int BlockSizeCompress=0x8000; 148275793eaSopenharmony_ci int BlockSizeUncompress=0x8000; 149275793eaSopenharmony_ci int cprLevel=Z_DEFAULT_COMPRESSION ; 150275793eaSopenharmony_ci long lFileSize; 151275793eaSopenharmony_ci unsigned char* FilePtr; 152275793eaSopenharmony_ci long lBufferSizeCpr; 153275793eaSopenharmony_ci long lBufferSizeUncpr; 154275793eaSopenharmony_ci long lCompressedSize=0; 155275793eaSopenharmony_ci unsigned char* CprPtr; 156275793eaSopenharmony_ci unsigned char* UncprPtr; 157275793eaSopenharmony_ci long lSizeCpr,lSizeUncpr; 158275793eaSopenharmony_ci DWORD dwGetTick,dwMsecQP; 159275793eaSopenharmony_ci LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc; 160275793eaSopenharmony_ci 161275793eaSopenharmony_ci if (argc<=1) 162275793eaSopenharmony_ci { 163275793eaSopenharmony_ci printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n"); 164275793eaSopenharmony_ci return 0; 165275793eaSopenharmony_ci } 166275793eaSopenharmony_ci 167275793eaSopenharmony_ci if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0) 168275793eaSopenharmony_ci { 169275793eaSopenharmony_ci printf("error reading %s\n",argv[1]); 170275793eaSopenharmony_ci return 1; 171275793eaSopenharmony_ci } 172275793eaSopenharmony_ci else printf("file %s read, %ld bytes\n",argv[1],lFileSize); 173275793eaSopenharmony_ci 174275793eaSopenharmony_ci if (argc>=3) 175275793eaSopenharmony_ci BlockSizeCompress=atol(argv[2]); 176275793eaSopenharmony_ci 177275793eaSopenharmony_ci if (argc>=4) 178275793eaSopenharmony_ci BlockSizeUncompress=atol(argv[3]); 179275793eaSopenharmony_ci 180275793eaSopenharmony_ci if (argc>=5) 181275793eaSopenharmony_ci cprLevel=(int)atol(argv[4]); 182275793eaSopenharmony_ci 183275793eaSopenharmony_ci lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200; 184275793eaSopenharmony_ci lBufferSizeUncpr = lBufferSizeCpr; 185275793eaSopenharmony_ci 186275793eaSopenharmony_ci CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress); 187275793eaSopenharmony_ci 188275793eaSopenharmony_ci BeginCountPerfCounter(&li_qp,TRUE); 189275793eaSopenharmony_ci dwGetTick=GetTickCount(); 190275793eaSopenharmony_ci BeginCountRdtsc(&li_rdtsc); 191275793eaSopenharmony_ci { 192275793eaSopenharmony_ci z_stream zcpr; 193275793eaSopenharmony_ci int ret=Z_OK; 194275793eaSopenharmony_ci long lOrigToDo = lFileSize; 195275793eaSopenharmony_ci long lOrigDone = 0; 196275793eaSopenharmony_ci int step=0; 197275793eaSopenharmony_ci memset(&zcpr,0,sizeof(z_stream)); 198275793eaSopenharmony_ci deflateInit(&zcpr,cprLevel); 199275793eaSopenharmony_ci 200275793eaSopenharmony_ci zcpr.next_in = FilePtr; 201275793eaSopenharmony_ci zcpr.next_out = CprPtr; 202275793eaSopenharmony_ci 203275793eaSopenharmony_ci 204275793eaSopenharmony_ci do 205275793eaSopenharmony_ci { 206275793eaSopenharmony_ci long all_read_before = zcpr.total_in; 207275793eaSopenharmony_ci zcpr.avail_in = min(lOrigToDo,BlockSizeCompress); 208275793eaSopenharmony_ci zcpr.avail_out = BlockSizeCompress; 209275793eaSopenharmony_ci ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH); 210275793eaSopenharmony_ci lOrigDone += (zcpr.total_in-all_read_before); 211275793eaSopenharmony_ci lOrigToDo -= (zcpr.total_in-all_read_before); 212275793eaSopenharmony_ci step++; 213275793eaSopenharmony_ci } while (ret==Z_OK); 214275793eaSopenharmony_ci 215275793eaSopenharmony_ci lSizeCpr=zcpr.total_out; 216275793eaSopenharmony_ci deflateEnd(&zcpr); 217275793eaSopenharmony_ci dwGetTick=GetTickCount()-dwGetTick; 218275793eaSopenharmony_ci dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE); 219275793eaSopenharmony_ci dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE); 220275793eaSopenharmony_ci printf("total compress size = %u, in %u step\n",lSizeCpr,step); 221275793eaSopenharmony_ci printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.); 222275793eaSopenharmony_ci printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.); 223275793eaSopenharmony_ci printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart); 224275793eaSopenharmony_ci } 225275793eaSopenharmony_ci 226275793eaSopenharmony_ci CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr); 227275793eaSopenharmony_ci UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress); 228275793eaSopenharmony_ci 229275793eaSopenharmony_ci BeginCountPerfCounter(&li_qp,TRUE); 230275793eaSopenharmony_ci dwGetTick=GetTickCount(); 231275793eaSopenharmony_ci BeginCountRdtsc(&li_rdtsc); 232275793eaSopenharmony_ci { 233275793eaSopenharmony_ci z_stream zcpr; 234275793eaSopenharmony_ci int ret=Z_OK; 235275793eaSopenharmony_ci long lOrigToDo = lSizeCpr; 236275793eaSopenharmony_ci long lOrigDone = 0; 237275793eaSopenharmony_ci int step=0; 238275793eaSopenharmony_ci memset(&zcpr,0,sizeof(z_stream)); 239275793eaSopenharmony_ci inflateInit(&zcpr); 240275793eaSopenharmony_ci 241275793eaSopenharmony_ci zcpr.next_in = CprPtr; 242275793eaSopenharmony_ci zcpr.next_out = UncprPtr; 243275793eaSopenharmony_ci 244275793eaSopenharmony_ci 245275793eaSopenharmony_ci do 246275793eaSopenharmony_ci { 247275793eaSopenharmony_ci long all_read_before = zcpr.total_in; 248275793eaSopenharmony_ci zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress); 249275793eaSopenharmony_ci zcpr.avail_out = BlockSizeUncompress; 250275793eaSopenharmony_ci ret=inflate(&zcpr,Z_SYNC_FLUSH); 251275793eaSopenharmony_ci lOrigDone += (zcpr.total_in-all_read_before); 252275793eaSopenharmony_ci lOrigToDo -= (zcpr.total_in-all_read_before); 253275793eaSopenharmony_ci step++; 254275793eaSopenharmony_ci } while (ret==Z_OK); 255275793eaSopenharmony_ci 256275793eaSopenharmony_ci lSizeUncpr=zcpr.total_out; 257275793eaSopenharmony_ci inflateEnd(&zcpr); 258275793eaSopenharmony_ci dwGetTick=GetTickCount()-dwGetTick; 259275793eaSopenharmony_ci dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE); 260275793eaSopenharmony_ci dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE); 261275793eaSopenharmony_ci printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step); 262275793eaSopenharmony_ci printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.); 263275793eaSopenharmony_ci printf("uncpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.); 264275793eaSopenharmony_ci printf("uncpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart); 265275793eaSopenharmony_ci } 266275793eaSopenharmony_ci 267275793eaSopenharmony_ci if (lSizeUncpr==lFileSize) 268275793eaSopenharmony_ci { 269275793eaSopenharmony_ci if (memcmp(FilePtr,UncprPtr,lFileSize)==0) 270275793eaSopenharmony_ci printf("compare ok\n"); 271275793eaSopenharmony_ci 272275793eaSopenharmony_ci } 273275793eaSopenharmony_ci 274275793eaSopenharmony_ci return 0; 275275793eaSopenharmony_ci} 276