14e00368fSchristos #include <stdio.h>
24e00368fSchristos #include <stdlib.h>
34e00368fSchristos #include <windows.h>
44e00368fSchristos
54e00368fSchristos #include "zlib.h"
64e00368fSchristos
74e00368fSchristos
MyDoMinus64(LARGE_INTEGER * R,LARGE_INTEGER A,LARGE_INTEGER B)84e00368fSchristos void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B)
94e00368fSchristos {
104e00368fSchristos R->HighPart = A.HighPart - B.HighPart;
114e00368fSchristos if (A.LowPart >= B.LowPart)
124e00368fSchristos R->LowPart = A.LowPart - B.LowPart;
134e00368fSchristos else
144e00368fSchristos {
154e00368fSchristos R->LowPart = A.LowPart - B.LowPart;
164e00368fSchristos R->HighPart --;
174e00368fSchristos }
184e00368fSchristos }
194e00368fSchristos
204e00368fSchristos #ifdef _M_X64
214e00368fSchristos // see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc
224e00368fSchristos unsigned __int64 __rdtsc(void);
BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)234e00368fSchristos void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
244e00368fSchristos {
254e00368fSchristos // printf("rdtsc = %I64x\n",__rdtsc());
264e00368fSchristos pbeginTime64->QuadPart=__rdtsc();
274e00368fSchristos }
284e00368fSchristos
GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)294e00368fSchristos LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
304e00368fSchristos {
314e00368fSchristos LARGE_INTEGER LIres;
324e00368fSchristos unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart));
334e00368fSchristos LIres.QuadPart=res;
344e00368fSchristos // printf("rdtsc = %I64x\n",__rdtsc());
354e00368fSchristos return LIres;
364e00368fSchristos }
374e00368fSchristos #else
384e00368fSchristos #ifdef _M_IX86
myGetRDTSC32(LARGE_INTEGER * pbeginTime64)394e00368fSchristos void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
404e00368fSchristos {
414e00368fSchristos DWORD dwEdx,dwEax;
424e00368fSchristos _asm
434e00368fSchristos {
444e00368fSchristos rdtsc
454e00368fSchristos mov dwEax,eax
464e00368fSchristos mov dwEdx,edx
474e00368fSchristos }
484e00368fSchristos pbeginTime64->LowPart=dwEax;
494e00368fSchristos pbeginTime64->HighPart=dwEdx;
504e00368fSchristos }
514e00368fSchristos
BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)524e00368fSchristos void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
534e00368fSchristos {
544e00368fSchristos myGetRDTSC32(pbeginTime64);
554e00368fSchristos }
564e00368fSchristos
GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)574e00368fSchristos LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
584e00368fSchristos {
594e00368fSchristos LARGE_INTEGER LIres,endTime64;
604e00368fSchristos myGetRDTSC32(&endTime64);
614e00368fSchristos
624e00368fSchristos LIres.LowPart=LIres.HighPart=0;
634e00368fSchristos MyDoMinus64(&LIres,endTime64,beginTime64);
644e00368fSchristos return LIres;
654e00368fSchristos }
664e00368fSchristos #else
myGetRDTSC32(LARGE_INTEGER * pbeginTime64)674e00368fSchristos void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
684e00368fSchristos {
694e00368fSchristos }
704e00368fSchristos
BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)714e00368fSchristos void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
724e00368fSchristos {
734e00368fSchristos }
744e00368fSchristos
GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)754e00368fSchristos LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
764e00368fSchristos {
774e00368fSchristos LARGE_INTEGER lr;
784e00368fSchristos lr.QuadPart=0;
794e00368fSchristos return lr;
804e00368fSchristos }
814e00368fSchristos #endif
824e00368fSchristos #endif
834e00368fSchristos
BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)844e00368fSchristos void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)
854e00368fSchristos {
864e00368fSchristos if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64)))
874e00368fSchristos {
884e00368fSchristos pbeginTime64->LowPart = GetTickCount();
894e00368fSchristos pbeginTime64->HighPart = 0;
904e00368fSchristos }
914e00368fSchristos }
924e00368fSchristos
GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)934e00368fSchristos DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
944e00368fSchristos {
954e00368fSchristos LARGE_INTEGER endTime64,ticksPerSecond,ticks;
964e00368fSchristos DWORDLONG ticksShifted,tickSecShifted;
974e00368fSchristos DWORD dwLog=16+0;
984e00368fSchristos DWORD dwRet;
994e00368fSchristos if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64)))
1004e00368fSchristos dwRet = (GetTickCount() - beginTime64.LowPart)*1;
1014e00368fSchristos else
1024e00368fSchristos {
1034e00368fSchristos MyDoMinus64(&ticks,endTime64,beginTime64);
1044e00368fSchristos QueryPerformanceFrequency(&ticksPerSecond);
1054e00368fSchristos
1064e00368fSchristos
1074e00368fSchristos {
1084e00368fSchristos ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog);
1094e00368fSchristos tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog);
1104e00368fSchristos
1114e00368fSchristos }
1124e00368fSchristos
1134e00368fSchristos dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted));
1144e00368fSchristos dwRet *=1;
1154e00368fSchristos }
1164e00368fSchristos return dwRet;
1174e00368fSchristos }
1184e00368fSchristos
ReadFileMemory(const char * filename,long * plFileSize,unsigned char ** pFilePtr)119*ed8eb4c2Schristos int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr)
1204e00368fSchristos {
1214e00368fSchristos FILE* stream;
122*ed8eb4c2Schristos unsigned char* ptr;
1234e00368fSchristos int retVal=1;
1244e00368fSchristos stream=fopen(filename, "rb");
1254e00368fSchristos if (stream==NULL)
1264e00368fSchristos return 0;
1274e00368fSchristos
1284e00368fSchristos fseek(stream,0,SEEK_END);
1294e00368fSchristos
1304e00368fSchristos *plFileSize=ftell(stream);
1314e00368fSchristos fseek(stream,0,SEEK_SET);
1324e00368fSchristos ptr=malloc((*plFileSize)+1);
1334e00368fSchristos if (ptr==NULL)
1344e00368fSchristos retVal=0;
1354e00368fSchristos else
1364e00368fSchristos {
1374e00368fSchristos if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize))
1384e00368fSchristos retVal=0;
1394e00368fSchristos }
1404e00368fSchristos fclose(stream);
1414e00368fSchristos *pFilePtr=ptr;
1424e00368fSchristos return retVal;
1434e00368fSchristos }
1444e00368fSchristos
main(int argc,char * argv[])1454e00368fSchristos int main(int argc, char *argv[])
1464e00368fSchristos {
1474e00368fSchristos int BlockSizeCompress=0x8000;
1484e00368fSchristos int BlockSizeUncompress=0x8000;
1494e00368fSchristos int cprLevel=Z_DEFAULT_COMPRESSION ;
1504e00368fSchristos long lFileSize;
1514e00368fSchristos unsigned char* FilePtr;
1524e00368fSchristos long lBufferSizeCpr;
1534e00368fSchristos long lBufferSizeUncpr;
1544e00368fSchristos long lCompressedSize=0;
1554e00368fSchristos unsigned char* CprPtr;
1564e00368fSchristos unsigned char* UncprPtr;
1574e00368fSchristos long lSizeCpr,lSizeUncpr;
1584e00368fSchristos DWORD dwGetTick,dwMsecQP;
1594e00368fSchristos LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc;
1604e00368fSchristos
1614e00368fSchristos if (argc<=1)
1624e00368fSchristos {
1634e00368fSchristos printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n");
1644e00368fSchristos return 0;
1654e00368fSchristos }
1664e00368fSchristos
1674e00368fSchristos if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0)
1684e00368fSchristos {
1694e00368fSchristos printf("error reading %s\n",argv[1]);
1704e00368fSchristos return 1;
1714e00368fSchristos }
1724e00368fSchristos else printf("file %s read, %u bytes\n",argv[1],lFileSize);
1734e00368fSchristos
1744e00368fSchristos if (argc>=3)
1754e00368fSchristos BlockSizeCompress=atol(argv[2]);
1764e00368fSchristos
1774e00368fSchristos if (argc>=4)
1784e00368fSchristos BlockSizeUncompress=atol(argv[3]);
1794e00368fSchristos
1804e00368fSchristos if (argc>=5)
1814e00368fSchristos cprLevel=(int)atol(argv[4]);
1824e00368fSchristos
1834e00368fSchristos lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200;
1844e00368fSchristos lBufferSizeUncpr = lBufferSizeCpr;
1854e00368fSchristos
1864e00368fSchristos CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress);
1874e00368fSchristos
1884e00368fSchristos BeginCountPerfCounter(&li_qp,TRUE);
1894e00368fSchristos dwGetTick=GetTickCount();
1904e00368fSchristos BeginCountRdtsc(&li_rdtsc);
1914e00368fSchristos {
1924e00368fSchristos z_stream zcpr;
1934e00368fSchristos int ret=Z_OK;
1944e00368fSchristos long lOrigToDo = lFileSize;
1954e00368fSchristos long lOrigDone = 0;
1964e00368fSchristos int step=0;
1974e00368fSchristos memset(&zcpr,0,sizeof(z_stream));
1984e00368fSchristos deflateInit(&zcpr,cprLevel);
1994e00368fSchristos
2004e00368fSchristos zcpr.next_in = FilePtr;
2014e00368fSchristos zcpr.next_out = CprPtr;
2024e00368fSchristos
2034e00368fSchristos
2044e00368fSchristos do
2054e00368fSchristos {
2064e00368fSchristos long all_read_before = zcpr.total_in;
2074e00368fSchristos zcpr.avail_in = min(lOrigToDo,BlockSizeCompress);
2084e00368fSchristos zcpr.avail_out = BlockSizeCompress;
2094e00368fSchristos ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH);
2104e00368fSchristos lOrigDone += (zcpr.total_in-all_read_before);
2114e00368fSchristos lOrigToDo -= (zcpr.total_in-all_read_before);
2124e00368fSchristos step++;
2134e00368fSchristos } while (ret==Z_OK);
2144e00368fSchristos
2154e00368fSchristos lSizeCpr=zcpr.total_out;
2164e00368fSchristos deflateEnd(&zcpr);
2174e00368fSchristos dwGetTick=GetTickCount()-dwGetTick;
2184e00368fSchristos dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
2194e00368fSchristos dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
2204e00368fSchristos printf("total compress size = %u, in %u step\n",lSizeCpr,step);
2214e00368fSchristos printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
2224e00368fSchristos printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
2234e00368fSchristos printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
2244e00368fSchristos }
2254e00368fSchristos
2264e00368fSchristos CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr);
2274e00368fSchristos UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress);
2284e00368fSchristos
2294e00368fSchristos BeginCountPerfCounter(&li_qp,TRUE);
2304e00368fSchristos dwGetTick=GetTickCount();
2314e00368fSchristos BeginCountRdtsc(&li_rdtsc);
2324e00368fSchristos {
2334e00368fSchristos z_stream zcpr;
2344e00368fSchristos int ret=Z_OK;
2354e00368fSchristos long lOrigToDo = lSizeCpr;
2364e00368fSchristos long lOrigDone = 0;
2374e00368fSchristos int step=0;
2384e00368fSchristos memset(&zcpr,0,sizeof(z_stream));
2394e00368fSchristos inflateInit(&zcpr);
2404e00368fSchristos
2414e00368fSchristos zcpr.next_in = CprPtr;
2424e00368fSchristos zcpr.next_out = UncprPtr;
2434e00368fSchristos
2444e00368fSchristos
2454e00368fSchristos do
2464e00368fSchristos {
2474e00368fSchristos long all_read_before = zcpr.total_in;
2484e00368fSchristos zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress);
2494e00368fSchristos zcpr.avail_out = BlockSizeUncompress;
2504e00368fSchristos ret=inflate(&zcpr,Z_SYNC_FLUSH);
2514e00368fSchristos lOrigDone += (zcpr.total_in-all_read_before);
2524e00368fSchristos lOrigToDo -= (zcpr.total_in-all_read_before);
2534e00368fSchristos step++;
2544e00368fSchristos } while (ret==Z_OK);
2554e00368fSchristos
2564e00368fSchristos lSizeUncpr=zcpr.total_out;
2574e00368fSchristos inflateEnd(&zcpr);
2584e00368fSchristos dwGetTick=GetTickCount()-dwGetTick;
2594e00368fSchristos dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
2604e00368fSchristos dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
2614e00368fSchristos printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step);
2624e00368fSchristos printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
2634e00368fSchristos printf("uncpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
2644e00368fSchristos printf("uncpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
2654e00368fSchristos }
2664e00368fSchristos
2674e00368fSchristos if (lSizeUncpr==lFileSize)
2684e00368fSchristos {
2694e00368fSchristos if (memcmp(FilePtr,UncprPtr,lFileSize)==0)
2704e00368fSchristos printf("compare ok\n");
2714e00368fSchristos
2724e00368fSchristos }
2734e00368fSchristos
2744e00368fSchristos return 0;
2754e00368fSchristos }
276