8 void MyDoMinus64(LARGE_INTEGER
*R
,LARGE_INTEGER A
,LARGE_INTEGER B
)
10 R
->HighPart
= A
.HighPart
- B
.HighPart
;
11 if (A
.LowPart
>= B
.LowPart
)
12 R
->LowPart
= A
.LowPart
- B
.LowPart
;
15 R
->LowPart
= A
.LowPart
- B
.LowPart
;
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
)
25 // printf("rdtsc = %I64x\n",__rdtsc());
26 pbeginTime64
->QuadPart
=__rdtsc();
29 LARGE_INTEGER
GetResRdtsc(LARGE_INTEGER beginTime64
,BOOL fComputeTimeQueryPerf
)
32 unsigned _int64 res
=__rdtsc()-((unsigned _int64
)(beginTime64
.QuadPart
));
34 // printf("rdtsc = %I64x\n",__rdtsc());
39 void myGetRDTSC32(LARGE_INTEGER
* pbeginTime64
)
48 pbeginTime64
->LowPart
=dwEax
;
49 pbeginTime64
->HighPart
=dwEdx
;
52 void BeginCountRdtsc(LARGE_INTEGER
* pbeginTime64
)
54 myGetRDTSC32(pbeginTime64
);
57 LARGE_INTEGER
GetResRdtsc(LARGE_INTEGER beginTime64
,BOOL fComputeTimeQueryPerf
)
59 LARGE_INTEGER LIres
,endTime64
;
60 myGetRDTSC32(&endTime64
);
62 LIres
.LowPart
=LIres
.HighPart
=0;
63 MyDoMinus64(&LIres
,endTime64
,beginTime64
);
67 void myGetRDTSC32(LARGE_INTEGER
* pbeginTime64
)
71 void BeginCountRdtsc(LARGE_INTEGER
* pbeginTime64
)
75 LARGE_INTEGER
GetResRdtsc(LARGE_INTEGER beginTime64
,BOOL fComputeTimeQueryPerf
)
84 void BeginCountPerfCounter(LARGE_INTEGER
* pbeginTime64
,BOOL fComputeTimeQueryPerf
)
86 if ((!fComputeTimeQueryPerf
) || (!QueryPerformanceCounter(pbeginTime64
)))
88 pbeginTime64
->LowPart
= GetTickCount();
89 pbeginTime64
->HighPart
= 0;
93 DWORD
GetMsecSincePerfCounter(LARGE_INTEGER beginTime64
,BOOL fComputeTimeQueryPerf
)
95 LARGE_INTEGER endTime64
,ticksPerSecond
,ticks
;
96 DWORDLONG ticksShifted
,tickSecShifted
;
99 if ((!fComputeTimeQueryPerf
) || (!QueryPerformanceCounter(&endTime64
)))
100 dwRet
= (GetTickCount() - beginTime64
.LowPart
)*1;
103 MyDoMinus64(&ticks
,endTime64
,beginTime64
);
104 QueryPerformanceFrequency(&ticksPerSecond
);
108 ticksShifted
= Int64ShrlMod32(*(DWORDLONG
*)&ticks
,dwLog
);
109 tickSecShifted
= Int64ShrlMod32(*(DWORDLONG
*)&ticksPerSecond
,dwLog
);
113 dwRet
= (DWORD
)((((DWORD
)ticksShifted
)*1000)/(DWORD
)(tickSecShifted
));
119 int ReadFileMemory(const char* filename
,long* plFileSize
,void** pFilePtr
)
124 stream
=fopen(filename
, "rb");
128 fseek(stream
,0,SEEK_END
);
130 *plFileSize
=ftell(stream
);
131 fseek(stream
,0,SEEK_SET
);
132 ptr
=malloc((*plFileSize
)+1);
137 if (fread(ptr
, 1, *plFileSize
,stream
) != (*plFileSize
))
145 int main(int argc
, char *argv
[])
147 int BlockSizeCompress
=0x8000;
148 int BlockSizeUncompress
=0x8000;
149 int cprLevel
=Z_DEFAULT_COMPRESSION
;
151 unsigned char* FilePtr
;
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
;
163 printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n");
167 if (ReadFileMemory(argv
[1],&lFileSize
,&FilePtr
)==0)
169 printf("error reading %s\n",argv
[1]);
172 else printf("file %s read, %u bytes\n",argv
[1],lFileSize
);
175 BlockSizeCompress
=atol(argv
[2]);
178 BlockSizeUncompress
=atol(argv
[3]);
181 cprLevel
=(int)atol(argv
[4]);
183 lBufferSizeCpr
= lFileSize
+ (lFileSize
/0x10) + 0x200;
184 lBufferSizeUncpr
= lBufferSizeCpr
;
186 CprPtr
=(unsigned char*)malloc(lBufferSizeCpr
+ BlockSizeCompress
);
188 BeginCountPerfCounter(&li_qp
,TRUE
);
189 dwGetTick
=GetTickCount();
190 BeginCountRdtsc(&li_rdtsc
);
194 long lOrigToDo
= lFileSize
;
197 memset(&zcpr
,0,sizeof(z_stream
));
198 deflateInit(&zcpr
,cprLevel
);
200 zcpr
.next_in
= FilePtr
;
201 zcpr
.next_out
= CprPtr
;
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
);
215 lSizeCpr
=zcpr
.total_out
;
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
);
226 CprPtr
=(unsigned char*)realloc(CprPtr
,lSizeCpr
);
227 UncprPtr
=(unsigned char*)malloc(lBufferSizeUncpr
+ BlockSizeUncompress
);
229 BeginCountPerfCounter(&li_qp
,TRUE
);
230 dwGetTick
=GetTickCount();
231 BeginCountRdtsc(&li_rdtsc
);
235 long lOrigToDo
= lSizeCpr
;
238 memset(&zcpr
,0,sizeof(z_stream
));
241 zcpr
.next_in
= CprPtr
;
242 zcpr
.next_out
= UncprPtr
;
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
);
256 lSizeUncpr
=zcpr
.total_out
;
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
);
267 if (lSizeUncpr
==lFileSize
)
269 if (memcmp(FilePtr
,UncprPtr
,lFileSize
)==0)
270 printf("compare ok\n");