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