xref: /netbsd-src/external/gpl3/gdb/dist/zlib/contrib/testzlib/testzlib.c (revision ba340e457da88a40806d62ac0f140844ca1436e9)
1212397c6Schristos #include <stdio.h>
2212397c6Schristos #include <stdlib.h>
3212397c6Schristos #include <windows.h>
4212397c6Schristos 
5212397c6Schristos #include "zlib.h"
6212397c6Schristos 
7212397c6Schristos 
MyDoMinus64(LARGE_INTEGER * R,LARGE_INTEGER A,LARGE_INTEGER B)8212397c6Schristos void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B)
9212397c6Schristos {
10212397c6Schristos     R->HighPart = A.HighPart - B.HighPart;
11212397c6Schristos     if (A.LowPart >= B.LowPart)
12212397c6Schristos         R->LowPart = A.LowPart - B.LowPart;
13212397c6Schristos     else
14212397c6Schristos     {
15212397c6Schristos         R->LowPart = A.LowPart - B.LowPart;
16212397c6Schristos         R->HighPart --;
17212397c6Schristos     }
18212397c6Schristos }
19212397c6Schristos 
20212397c6Schristos #ifdef _M_X64
21212397c6Schristos // see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc
22212397c6Schristos unsigned __int64 __rdtsc(void);
BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)23212397c6Schristos void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
24212397c6Schristos {
25212397c6Schristos  //   printf("rdtsc = %I64x\n",__rdtsc());
26212397c6Schristos    pbeginTime64->QuadPart=__rdtsc();
27212397c6Schristos }
28212397c6Schristos 
GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)29212397c6Schristos LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
30212397c6Schristos {
31212397c6Schristos     LARGE_INTEGER LIres;
32212397c6Schristos     unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart));
33212397c6Schristos     LIres.QuadPart=res;
34212397c6Schristos    // printf("rdtsc = %I64x\n",__rdtsc());
35212397c6Schristos     return LIres;
36212397c6Schristos }
37212397c6Schristos #else
38212397c6Schristos #ifdef _M_IX86
myGetRDTSC32(LARGE_INTEGER * pbeginTime64)39212397c6Schristos void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
40212397c6Schristos {
41212397c6Schristos     DWORD dwEdx,dwEax;
42212397c6Schristos     _asm
43212397c6Schristos     {
44212397c6Schristos         rdtsc
45212397c6Schristos         mov dwEax,eax
46212397c6Schristos         mov dwEdx,edx
47212397c6Schristos     }
48212397c6Schristos     pbeginTime64->LowPart=dwEax;
49212397c6Schristos     pbeginTime64->HighPart=dwEdx;
50212397c6Schristos }
51212397c6Schristos 
BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)52212397c6Schristos void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
53212397c6Schristos {
54212397c6Schristos     myGetRDTSC32(pbeginTime64);
55212397c6Schristos }
56212397c6Schristos 
GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)57212397c6Schristos LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
58212397c6Schristos {
59212397c6Schristos     LARGE_INTEGER LIres,endTime64;
60212397c6Schristos     myGetRDTSC32(&endTime64);
61212397c6Schristos 
62212397c6Schristos     LIres.LowPart=LIres.HighPart=0;
63212397c6Schristos     MyDoMinus64(&LIres,endTime64,beginTime64);
64212397c6Schristos     return LIres;
65212397c6Schristos }
66212397c6Schristos #else
myGetRDTSC32(LARGE_INTEGER * pbeginTime64)67212397c6Schristos void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
68212397c6Schristos {
69212397c6Schristos }
70212397c6Schristos 
BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)71212397c6Schristos void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
72212397c6Schristos {
73212397c6Schristos }
74212397c6Schristos 
GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)75212397c6Schristos LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
76212397c6Schristos {
77212397c6Schristos     LARGE_INTEGER lr;
78212397c6Schristos     lr.QuadPart=0;
79212397c6Schristos     return lr;
80212397c6Schristos }
81212397c6Schristos #endif
82212397c6Schristos #endif
83212397c6Schristos 
BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)84212397c6Schristos void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)
85212397c6Schristos {
86212397c6Schristos     if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64)))
87212397c6Schristos     {
88212397c6Schristos         pbeginTime64->LowPart = GetTickCount();
89212397c6Schristos         pbeginTime64->HighPart = 0;
90212397c6Schristos     }
91212397c6Schristos }
92212397c6Schristos 
GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)93212397c6Schristos DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
94212397c6Schristos {
95212397c6Schristos     LARGE_INTEGER endTime64,ticksPerSecond,ticks;
96212397c6Schristos     DWORDLONG ticksShifted,tickSecShifted;
97212397c6Schristos     DWORD dwLog=16+0;
98212397c6Schristos     DWORD dwRet;
99212397c6Schristos     if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64)))
100212397c6Schristos         dwRet = (GetTickCount() - beginTime64.LowPart)*1;
101212397c6Schristos     else
102212397c6Schristos     {
103212397c6Schristos         MyDoMinus64(&ticks,endTime64,beginTime64);
104212397c6Schristos         QueryPerformanceFrequency(&ticksPerSecond);
105212397c6Schristos 
106212397c6Schristos 
107212397c6Schristos         {
108212397c6Schristos             ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog);
109212397c6Schristos             tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog);
110212397c6Schristos 
111212397c6Schristos         }
112212397c6Schristos 
113212397c6Schristos         dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted));
114212397c6Schristos         dwRet *=1;
115212397c6Schristos     }
116212397c6Schristos     return dwRet;
117212397c6Schristos }
118212397c6Schristos 
ReadFileMemory(const char * filename,long * plFileSize,unsigned char ** pFilePtr)119*ba340e45Schristos int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr)
120212397c6Schristos {
121212397c6Schristos     FILE* stream;
122*ba340e45Schristos     unsigned char* ptr;
123212397c6Schristos     int retVal=1;
124212397c6Schristos     stream=fopen(filename, "rb");
125212397c6Schristos     if (stream==NULL)
126212397c6Schristos         return 0;
127212397c6Schristos 
128212397c6Schristos     fseek(stream,0,SEEK_END);
129212397c6Schristos 
130212397c6Schristos     *plFileSize=ftell(stream);
131212397c6Schristos     fseek(stream,0,SEEK_SET);
132212397c6Schristos     ptr=malloc((*plFileSize)+1);
133212397c6Schristos     if (ptr==NULL)
134212397c6Schristos         retVal=0;
135212397c6Schristos     else
136212397c6Schristos     {
137212397c6Schristos         if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize))
138212397c6Schristos             retVal=0;
139212397c6Schristos     }
140212397c6Schristos     fclose(stream);
141212397c6Schristos     *pFilePtr=ptr;
142212397c6Schristos     return retVal;
143212397c6Schristos }
144212397c6Schristos 
main(int argc,char * argv[])145212397c6Schristos int main(int argc, char *argv[])
146212397c6Schristos {
147212397c6Schristos     int BlockSizeCompress=0x8000;
148212397c6Schristos     int BlockSizeUncompress=0x8000;
149212397c6Schristos     int cprLevel=Z_DEFAULT_COMPRESSION ;
150212397c6Schristos     long lFileSize;
151212397c6Schristos     unsigned char* FilePtr;
152212397c6Schristos     long lBufferSizeCpr;
153212397c6Schristos     long lBufferSizeUncpr;
154212397c6Schristos     long lCompressedSize=0;
155212397c6Schristos     unsigned char* CprPtr;
156212397c6Schristos     unsigned char* UncprPtr;
157212397c6Schristos     long lSizeCpr,lSizeUncpr;
158212397c6Schristos     DWORD dwGetTick,dwMsecQP;
159212397c6Schristos     LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc;
160212397c6Schristos 
161212397c6Schristos     if (argc<=1)
162212397c6Schristos     {
163212397c6Schristos         printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n");
164212397c6Schristos         return 0;
165212397c6Schristos     }
166212397c6Schristos 
167212397c6Schristos     if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0)
168212397c6Schristos     {
169212397c6Schristos         printf("error reading %s\n",argv[1]);
170212397c6Schristos         return 1;
171212397c6Schristos     }
172212397c6Schristos     else printf("file %s read, %u bytes\n",argv[1],lFileSize);
173212397c6Schristos 
174212397c6Schristos     if (argc>=3)
175212397c6Schristos         BlockSizeCompress=atol(argv[2]);
176212397c6Schristos 
177212397c6Schristos     if (argc>=4)
178212397c6Schristos         BlockSizeUncompress=atol(argv[3]);
179212397c6Schristos 
180212397c6Schristos     if (argc>=5)
181212397c6Schristos         cprLevel=(int)atol(argv[4]);
182212397c6Schristos 
183212397c6Schristos     lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200;
184212397c6Schristos     lBufferSizeUncpr = lBufferSizeCpr;
185212397c6Schristos 
186212397c6Schristos     CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress);
187212397c6Schristos 
188212397c6Schristos     BeginCountPerfCounter(&li_qp,TRUE);
189212397c6Schristos     dwGetTick=GetTickCount();
190212397c6Schristos     BeginCountRdtsc(&li_rdtsc);
191212397c6Schristos     {
192212397c6Schristos         z_stream zcpr;
193212397c6Schristos         int ret=Z_OK;
194212397c6Schristos         long lOrigToDo = lFileSize;
195212397c6Schristos         long lOrigDone = 0;
196212397c6Schristos         int step=0;
197212397c6Schristos         memset(&zcpr,0,sizeof(z_stream));
198212397c6Schristos         deflateInit(&zcpr,cprLevel);
199212397c6Schristos 
200212397c6Schristos         zcpr.next_in = FilePtr;
201212397c6Schristos         zcpr.next_out = CprPtr;
202212397c6Schristos 
203212397c6Schristos 
204212397c6Schristos         do
205212397c6Schristos         {
206212397c6Schristos             long all_read_before = zcpr.total_in;
207212397c6Schristos             zcpr.avail_in = min(lOrigToDo,BlockSizeCompress);
208212397c6Schristos             zcpr.avail_out = BlockSizeCompress;
209212397c6Schristos             ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH);
210212397c6Schristos             lOrigDone += (zcpr.total_in-all_read_before);
211212397c6Schristos             lOrigToDo -= (zcpr.total_in-all_read_before);
212212397c6Schristos             step++;
213212397c6Schristos         } while (ret==Z_OK);
214212397c6Schristos 
215212397c6Schristos         lSizeCpr=zcpr.total_out;
216212397c6Schristos         deflateEnd(&zcpr);
217212397c6Schristos         dwGetTick=GetTickCount()-dwGetTick;
218212397c6Schristos         dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
219212397c6Schristos         dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
220212397c6Schristos         printf("total compress size = %u, in %u step\n",lSizeCpr,step);
221212397c6Schristos         printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
222212397c6Schristos         printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
223212397c6Schristos         printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
224212397c6Schristos     }
225212397c6Schristos 
226212397c6Schristos     CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr);
227212397c6Schristos     UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress);
228212397c6Schristos 
229212397c6Schristos     BeginCountPerfCounter(&li_qp,TRUE);
230212397c6Schristos     dwGetTick=GetTickCount();
231212397c6Schristos     BeginCountRdtsc(&li_rdtsc);
232212397c6Schristos     {
233212397c6Schristos         z_stream zcpr;
234212397c6Schristos         int ret=Z_OK;
235212397c6Schristos         long lOrigToDo = lSizeCpr;
236212397c6Schristos         long lOrigDone = 0;
237212397c6Schristos         int step=0;
238212397c6Schristos         memset(&zcpr,0,sizeof(z_stream));
239212397c6Schristos         inflateInit(&zcpr);
240212397c6Schristos 
241212397c6Schristos         zcpr.next_in = CprPtr;
242212397c6Schristos         zcpr.next_out = UncprPtr;
243212397c6Schristos 
244212397c6Schristos 
245212397c6Schristos         do
246212397c6Schristos         {
247212397c6Schristos             long all_read_before = zcpr.total_in;
248212397c6Schristos             zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress);
249212397c6Schristos             zcpr.avail_out = BlockSizeUncompress;
250212397c6Schristos             ret=inflate(&zcpr,Z_SYNC_FLUSH);
251212397c6Schristos             lOrigDone += (zcpr.total_in-all_read_before);
252212397c6Schristos             lOrigToDo -= (zcpr.total_in-all_read_before);
253212397c6Schristos             step++;
254212397c6Schristos         } while (ret==Z_OK);
255212397c6Schristos 
256212397c6Schristos         lSizeUncpr=zcpr.total_out;
257212397c6Schristos         inflateEnd(&zcpr);
258212397c6Schristos         dwGetTick=GetTickCount()-dwGetTick;
259212397c6Schristos         dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
260212397c6Schristos         dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
261212397c6Schristos         printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step);
262212397c6Schristos         printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
263212397c6Schristos         printf("uncpr  time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
264212397c6Schristos         printf("uncpr  result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
265212397c6Schristos     }
266212397c6Schristos 
267212397c6Schristos     if (lSizeUncpr==lFileSize)
268212397c6Schristos     {
269212397c6Schristos         if (memcmp(FilePtr,UncprPtr,lFileSize)==0)
270212397c6Schristos             printf("compare ok\n");
271212397c6Schristos 
272212397c6Schristos     }
273212397c6Schristos 
274212397c6Schristos     return 0;
275212397c6Schristos }
276