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