annotate src/zlib-1.2.8/contrib/testzlib/testzlib.c @ 128:5b4145a0d408

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