Ruby: ext/zlib/zlib-1.2.13/contrib/testzlib/testzlib.c Source File

Ruby 3.0.5p211 (2022-11-24 revision ba5cf0f7c52d4d35cc6a173c89eda98ceffa2dcf)

testzlib.c
Go to the documentation of this file.
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
22unsigned __int64 __rdtsc(void);
23void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
24{
25 // printf("rdtsc = %I64x\n",__rdtsc());
26 pbeginTime64->QuadPart=__rdtsc();
27}
28
29LARGE_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
39void 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
52void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
53{
54 myGetRDTSC32(pbeginTime64);
55}
56
57LARGE_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
75LARGE_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}
main
int main(void)
Definition: closure_fn0.c:49
ptr
struct RIMemo * ptr
Definition: debug.c:88
deflateEnd
int ZEXPORT deflateEnd(z_streamp strm)
Definition: deflate.c:1130
deflate
int ZEXPORT deflate(z_streamp strm, int flush)
Definition: deflate.c:815
inflate
int ZEXPORT inflate(z_streamp strm, int flush)
Definition: inflate.c:625
inflateEnd
int ZEXPORT inflateEnd(z_streamp strm)
Definition: inflate.c:1304
filename
const char * filename
Definition: ioapi.h:137
stream
voidpf stream
Definition: ioapi.h:138
int
typedef int(ZCALLBACK *close_file_func) OF((voidpf opaque
memcmp
int memcmp(const void *s1, const void *s2, size_t len)
Definition: memcmp.c:7
TRUE
#define TRUE
Definition: nkf.h:175
NULL
#define NULL
Definition: regenc.h:69
argc
int argc
Definition: ruby.c:240
argv
char ** argv
Definition: ruby.c:241
R
#define R(b, x)
Definition: sha2.c:203
realloc
#define realloc
Definition: st.c:172
malloc
#define malloc
Definition: st.c:170
__sFILE
Definition: vsnprintf.c:169
A
Definition: nested_struct10.c:12
B
Definition: nested_struct10.c:17
z_stream_s
Definition: zlib.h:86
z_stream_s::avail_in
uInt avail_in
Definition: zlib.h:88
z_stream_s::avail_out
uInt avail_out
Definition: zlib.h:92
z_stream_s::next_in
z_const Bytef * next_in
Definition: zlib.h:87
z_stream_s::total_in
uLong total_in
Definition: zlib.h:89
z_stream_s::total_out
uLong total_out
Definition: zlib.h:93
z_stream_s::next_out
Bytef * next_out
Definition: zlib.h:91
myGetRDTSC32
void myGetRDTSC32(LARGE_INTEGER *pbeginTime64)
Definition: testzlib.c:67
BeginCountRdtsc
void BeginCountRdtsc(LARGE_INTEGER *pbeginTime64)
Definition: testzlib.c:71
MyDoMinus64
void MyDoMinus64(LARGE_INTEGER *R, LARGE_INTEGER A, LARGE_INTEGER B)
Definition: testzlib.c:8
GetMsecSincePerfCounter
DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64, BOOL fComputeTimeQueryPerf)
Definition: testzlib.c:93
BeginCountPerfCounter
void BeginCountPerfCounter(LARGE_INTEGER *pbeginTime64, BOOL fComputeTimeQueryPerf)
Definition: testzlib.c:84
ReadFileMemory
int ReadFileMemory(const char *filename, long *plFileSize, unsigned char **pFilePtr)
Definition: testzlib.c:119
GetResRdtsc
LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64, BOOL fComputeTimeQueryPerf)
Definition: testzlib.c:75
DWORD
IUnknown DWORD
Definition: win32ole.c:33
SEEK_SET
#define SEEK_SET
Definition: zip.c:88
SEEK_END
#define SEEK_END
Definition: zip.c:84
zlib.h
Z_FINISH
#define Z_FINISH
Definition: zlib.h:172
Z_OK
#define Z_OK
Definition: zlib.h:177
Z_SYNC_FLUSH
#define Z_SYNC_FLUSH
Definition: zlib.h:170
inflateInit
#define inflateInit(strm)
Definition: zlib.h:1812
deflateInit
#define deflateInit(strm, level)
Definition: zlib.h:1810
Z_DEFAULT_COMPRESSION
#define Z_DEFAULT_COMPRESSION
Definition: zlib.h:193