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