annotate src/zlib-1.2.8/contrib/testzlib/testzlib.c @ 83:ae30d91d2ffe

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