1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <windows.h> 4 5 #include "zlib.h" 6 7 8 void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B) 9 { 10 R->HighPart = A.HighPart - B.HighPart; 11 if (A.LowPart >= B.LowPart) 12 R->LowPart = A.LowPart - B.LowPart; 13 else 14 { 15 R->LowPart = A.LowPart - B.LowPart; 16 R->HighPart --; 17 } 18 } 19 20 #ifdef _M_X64 21 // see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc 22 unsigned __int64 __rdtsc(void); 23 void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) 24 { 25 // printf("rdtsc = %I64x\n",__rdtsc()); 26 pbeginTime64->QuadPart=__rdtsc(); 27 } 28 29 LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) 30 { 31 LARGE_INTEGER LIres; 32 unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart)); 33 LIres.QuadPart=res; 34 // printf("rdtsc = %I64x\n",__rdtsc()); 35 return LIres; 36 } 37 #else 38 #ifdef _M_IX86 39 void myGetRDTSC32(LARGE_INTEGER * pbeginTime64) 40 { 41 DWORD dwEdx,dwEax; 42 _asm 43 { 44 rdtsc 45 mov dwEax,eax 46 mov dwEdx,edx 47 } 48 pbeginTime64->LowPart=dwEax; 49 pbeginTime64->HighPart=dwEdx; 50 } 51 52 void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) 53 { 54 myGetRDTSC32(pbeginTime64); 55 } 56 57 LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) 58 { 59 LARGE_INTEGER LIres,endTime64; 60 myGetRDTSC32(&endTime64); 61 62 LIres.LowPart=LIres.HighPart=0; 63 MyDoMinus64(&LIres,endTime64,beginTime64); 64 return LIres; 65 } 66 #else 67 void myGetRDTSC32(LARGE_INTEGER * pbeginTime64) 68 { 69 } 70 71 void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64) 72 { 73 } 74 75 LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) 76 { 77 LARGE_INTEGER lr; 78 lr.QuadPart=0; 79 return lr; 80 } 81 #endif 82 #endif 83 84 void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf) 85 { 86 if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64))) 87 { 88 pbeginTime64->LowPart = GetTickCount(); 89 pbeginTime64->HighPart = 0; 90 } 91 } 92 93 DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf) 94 { 95 LARGE_INTEGER endTime64,ticksPerSecond,ticks; 96 DWORDLONG ticksShifted,tickSecShifted; 97 DWORD dwLog=16+0; 98 DWORD dwRet; 99 if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64))) 100 dwRet = (GetTickCount() - beginTime64.LowPart)*1; 101 else 102 { 103 MyDoMinus64(&ticks,endTime64,beginTime64); 104 QueryPerformanceFrequency(&ticksPerSecond); 105 106 107 { 108 ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog); 109 tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog); 110 111 } 112 113 dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted)); 114 dwRet *=1; 115 } 116 return dwRet; 117 } 118 119 int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr) 120 { 121 FILE* stream; 122 unsigned char* ptr; 123 int retVal=1; 124 stream=fopen(filename, "rb"); 125 if (stream==NULL) 126 return 0; 127 128 fseek(stream,0,SEEK_END); 129 130 *plFileSize=ftell(stream); 131 fseek(stream,0,SEEK_SET); 132 ptr=malloc((*plFileSize)+1); 133 if (ptr==NULL) 134 retVal=0; 135 else 136 { 137 if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize)) 138 retVal=0; 139 } 140 fclose(stream); 141 *pFilePtr=ptr; 142 return retVal; 143 } 144 145 int main(int argc, char *argv[]) 146 { 147 int BlockSizeCompress=0x8000; 148 int BlockSizeUncompress=0x8000; 149 int cprLevel=Z_DEFAULT_COMPRESSION ; 150 long lFileSize; 151 unsigned char* FilePtr; 152 long lBufferSizeCpr; 153 long lBufferSizeUncpr; 154 long lCompressedSize=0; 155 unsigned char* CprPtr; 156 unsigned char* UncprPtr; 157 long lSizeCpr,lSizeUncpr; 158 DWORD dwGetTick,dwMsecQP; 159 LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc; 160 161 if (argc<=1) 162 { 163 printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n"); 164 return 0; 165 } 166 167 if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0) 168 { 169 printf("error reading %s\n",argv[1]); 170 return 1; 171 } 172 else printf("file %s read, %u bytes\n",argv[1],lFileSize); 173 174 if (argc>=3) 175 BlockSizeCompress=atol(argv[2]); 176 177 if (argc>=4) 178 BlockSizeUncompress=atol(argv[3]); 179 180 if (argc>=5) 181 cprLevel=(int)atol(argv[4]); 182 183 lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200; 184 lBufferSizeUncpr = lBufferSizeCpr; 185 186 CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress); 187 188 BeginCountPerfCounter(&li_qp,TRUE); 189 dwGetTick=GetTickCount(); 190 BeginCountRdtsc(&li_rdtsc); 191 { 192 z_stream zcpr; 193 int ret=Z_OK; 194 long lOrigToDo = lFileSize; 195 long lOrigDone = 0; 196 int step=0; 197 memset(&zcpr,0,sizeof(z_stream)); 198 deflateInit(&zcpr,cprLevel); 199 200 zcpr.next_in = FilePtr; 201 zcpr.next_out = CprPtr; 202 203 204 do 205 { 206 long all_read_before = zcpr.total_in; 207 zcpr.avail_in = min(lOrigToDo,BlockSizeCompress); 208 zcpr.avail_out = BlockSizeCompress; 209 ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH); 210 lOrigDone += (zcpr.total_in-all_read_before); 211 lOrigToDo -= (zcpr.total_in-all_read_before); 212 step++; 213 } while (ret==Z_OK); 214 215 lSizeCpr=zcpr.total_out; 216 deflateEnd(&zcpr); 217 dwGetTick=GetTickCount()-dwGetTick; 218 dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE); 219 dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE); 220 printf("total compress size = %u, in %u step\n",lSizeCpr,step); 221 printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.); 222 printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.); 223 printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart); 224 } 225 226 CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr); 227 UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress); 228 229 BeginCountPerfCounter(&li_qp,TRUE); 230 dwGetTick=GetTickCount(); 231 BeginCountRdtsc(&li_rdtsc); 232 { 233 z_stream zcpr; 234 int ret=Z_OK; 235 long lOrigToDo = lSizeCpr; 236 long lOrigDone = 0; 237 int step=0; 238 memset(&zcpr,0,sizeof(z_stream)); 239 inflateInit(&zcpr); 240 241 zcpr.next_in = CprPtr; 242 zcpr.next_out = UncprPtr; 243 244 245 do 246 { 247 long all_read_before = zcpr.total_in; 248 zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress); 249 zcpr.avail_out = BlockSizeUncompress; 250 ret=inflate(&zcpr,Z_SYNC_FLUSH); 251 lOrigDone += (zcpr.total_in-all_read_before); 252 lOrigToDo -= (zcpr.total_in-all_read_before); 253 step++; 254 } while (ret==Z_OK); 255 256 lSizeUncpr=zcpr.total_out; 257 inflateEnd(&zcpr); 258 dwGetTick=GetTickCount()-dwGetTick; 259 dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE); 260 dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE); 261 printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step); 262 printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.); 263 printf("uncpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.); 264 printf("uncpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart); 265 } 266 267 if (lSizeUncpr==lFileSize) 268 { 269 if (memcmp(FilePtr,UncprPtr,lFileSize)==0) 270 printf("compare ok\n"); 271 272 } 273 274 return 0; 275 }