annotate src/zlib-1.2.7/contrib/testzlib/testzlib.c @ 5:e582a1ccd5fe

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