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