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