19573673dSchristos #include <stdio.h>
29573673dSchristos #include <stdlib.h>
39573673dSchristos #include <windows.h>
49573673dSchristos
59573673dSchristos #include "zlib.h"
69573673dSchristos
79573673dSchristos
MyDoMinus64(LARGE_INTEGER * R,LARGE_INTEGER A,LARGE_INTEGER B)89573673dSchristos void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B)
99573673dSchristos {
109573673dSchristos R->HighPart = A.HighPart - B.HighPart;
119573673dSchristos if (A.LowPart >= B.LowPart)
129573673dSchristos R->LowPart = A.LowPart - B.LowPart;
139573673dSchristos else
149573673dSchristos {
159573673dSchristos R->LowPart = A.LowPart - B.LowPart;
169573673dSchristos R->HighPart --;
179573673dSchristos }
189573673dSchristos }
199573673dSchristos
209573673dSchristos #ifdef _M_X64
219573673dSchristos // see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc
229573673dSchristos unsigned __int64 __rdtsc(void);
BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)239573673dSchristos void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
249573673dSchristos {
259573673dSchristos // printf("rdtsc = %I64x\n",__rdtsc());
269573673dSchristos pbeginTime64->QuadPart=__rdtsc();
279573673dSchristos }
289573673dSchristos
GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)299573673dSchristos LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
309573673dSchristos {
319573673dSchristos LARGE_INTEGER LIres;
329573673dSchristos unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart));
339573673dSchristos LIres.QuadPart=res;
349573673dSchristos // printf("rdtsc = %I64x\n",__rdtsc());
359573673dSchristos return LIres;
369573673dSchristos }
379573673dSchristos #else
389573673dSchristos #ifdef _M_IX86
myGetRDTSC32(LARGE_INTEGER * pbeginTime64)399573673dSchristos void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
409573673dSchristos {
419573673dSchristos DWORD dwEdx,dwEax;
429573673dSchristos _asm
439573673dSchristos {
449573673dSchristos rdtsc
459573673dSchristos mov dwEax,eax
469573673dSchristos mov dwEdx,edx
479573673dSchristos }
489573673dSchristos pbeginTime64->LowPart=dwEax;
499573673dSchristos pbeginTime64->HighPart=dwEdx;
509573673dSchristos }
519573673dSchristos
BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)529573673dSchristos void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
539573673dSchristos {
549573673dSchristos myGetRDTSC32(pbeginTime64);
559573673dSchristos }
569573673dSchristos
GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)579573673dSchristos LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
589573673dSchristos {
599573673dSchristos LARGE_INTEGER LIres,endTime64;
609573673dSchristos myGetRDTSC32(&endTime64);
619573673dSchristos
629573673dSchristos LIres.LowPart=LIres.HighPart=0;
639573673dSchristos MyDoMinus64(&LIres,endTime64,beginTime64);
649573673dSchristos return LIres;
659573673dSchristos }
669573673dSchristos #else
myGetRDTSC32(LARGE_INTEGER * pbeginTime64)679573673dSchristos void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
689573673dSchristos {
699573673dSchristos }
709573673dSchristos
BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)719573673dSchristos void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
729573673dSchristos {
739573673dSchristos }
749573673dSchristos
GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)759573673dSchristos LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
769573673dSchristos {
779573673dSchristos LARGE_INTEGER lr;
789573673dSchristos lr.QuadPart=0;
799573673dSchristos return lr;
809573673dSchristos }
819573673dSchristos #endif
829573673dSchristos #endif
839573673dSchristos
BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)849573673dSchristos void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)
859573673dSchristos {
869573673dSchristos if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64)))
879573673dSchristos {
889573673dSchristos pbeginTime64->LowPart = GetTickCount();
899573673dSchristos pbeginTime64->HighPart = 0;
909573673dSchristos }
919573673dSchristos }
929573673dSchristos
GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)939573673dSchristos DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
949573673dSchristos {
959573673dSchristos LARGE_INTEGER endTime64,ticksPerSecond,ticks;
969573673dSchristos DWORDLONG ticksShifted,tickSecShifted;
979573673dSchristos DWORD dwLog=16+0;
989573673dSchristos DWORD dwRet;
999573673dSchristos if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64)))
1009573673dSchristos dwRet = (GetTickCount() - beginTime64.LowPart)*1;
1019573673dSchristos else
1029573673dSchristos {
1039573673dSchristos MyDoMinus64(&ticks,endTime64,beginTime64);
1049573673dSchristos QueryPerformanceFrequency(&ticksPerSecond);
1059573673dSchristos
1069573673dSchristos
1079573673dSchristos {
1089573673dSchristos ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog);
1099573673dSchristos tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog);
1109573673dSchristos
1119573673dSchristos }
1129573673dSchristos
1139573673dSchristos dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted));
1149573673dSchristos dwRet *=1;
1159573673dSchristos }
1169573673dSchristos return dwRet;
1179573673dSchristos }
1189573673dSchristos
ReadFileMemory(const char * filename,long * plFileSize,unsigned char ** pFilePtr)119*8cbf5cb7Schristos int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr)
1209573673dSchristos {
1219573673dSchristos FILE* stream;
122*8cbf5cb7Schristos unsigned char* ptr;
1239573673dSchristos int retVal=1;
1249573673dSchristos stream=fopen(filename, "rb");
1259573673dSchristos if (stream==NULL)
1269573673dSchristos return 0;
1279573673dSchristos
1289573673dSchristos fseek(stream,0,SEEK_END);
1299573673dSchristos
1309573673dSchristos *plFileSize=ftell(stream);
1319573673dSchristos fseek(stream,0,SEEK_SET);
1329573673dSchristos ptr=malloc((*plFileSize)+1);
1339573673dSchristos if (ptr==NULL)
1349573673dSchristos retVal=0;
1359573673dSchristos else
1369573673dSchristos {
1379573673dSchristos if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize))
1389573673dSchristos retVal=0;
1399573673dSchristos }
1409573673dSchristos fclose(stream);
1419573673dSchristos *pFilePtr=ptr;
1429573673dSchristos return retVal;
1439573673dSchristos }
1449573673dSchristos
main(int argc,char * argv[])1459573673dSchristos int main(int argc, char *argv[])
1469573673dSchristos {
1479573673dSchristos int BlockSizeCompress=0x8000;
1489573673dSchristos int BlockSizeUncompress=0x8000;
1499573673dSchristos int cprLevel=Z_DEFAULT_COMPRESSION ;
1509573673dSchristos long lFileSize;
1519573673dSchristos unsigned char* FilePtr;
1529573673dSchristos long lBufferSizeCpr;
1539573673dSchristos long lBufferSizeUncpr;
1549573673dSchristos long lCompressedSize=0;
1559573673dSchristos unsigned char* CprPtr;
1569573673dSchristos unsigned char* UncprPtr;
1579573673dSchristos long lSizeCpr,lSizeUncpr;
1589573673dSchristos DWORD dwGetTick,dwMsecQP;
1599573673dSchristos LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc;
1609573673dSchristos
1619573673dSchristos if (argc<=1)
1629573673dSchristos {
1639573673dSchristos printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n");
1649573673dSchristos return 0;
1659573673dSchristos }
1669573673dSchristos
1679573673dSchristos if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0)
1689573673dSchristos {
1699573673dSchristos printf("error reading %s\n",argv[1]);
1709573673dSchristos return 1;
1719573673dSchristos }
1729573673dSchristos else printf("file %s read, %u bytes\n",argv[1],lFileSize);
1739573673dSchristos
1749573673dSchristos if (argc>=3)
1759573673dSchristos BlockSizeCompress=atol(argv[2]);
1769573673dSchristos
1779573673dSchristos if (argc>=4)
1789573673dSchristos BlockSizeUncompress=atol(argv[3]);
1799573673dSchristos
1809573673dSchristos if (argc>=5)
1819573673dSchristos cprLevel=(int)atol(argv[4]);
1829573673dSchristos
1839573673dSchristos lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200;
1849573673dSchristos lBufferSizeUncpr = lBufferSizeCpr;
1859573673dSchristos
1869573673dSchristos CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress);
1879573673dSchristos
1889573673dSchristos BeginCountPerfCounter(&li_qp,TRUE);
1899573673dSchristos dwGetTick=GetTickCount();
1909573673dSchristos BeginCountRdtsc(&li_rdtsc);
1919573673dSchristos {
1929573673dSchristos z_stream zcpr;
1939573673dSchristos int ret=Z_OK;
1949573673dSchristos long lOrigToDo = lFileSize;
1959573673dSchristos long lOrigDone = 0;
1969573673dSchristos int step=0;
1979573673dSchristos memset(&zcpr,0,sizeof(z_stream));
1989573673dSchristos deflateInit(&zcpr,cprLevel);
1999573673dSchristos
2009573673dSchristos zcpr.next_in = FilePtr;
2019573673dSchristos zcpr.next_out = CprPtr;
2029573673dSchristos
2039573673dSchristos
2049573673dSchristos do
2059573673dSchristos {
2069573673dSchristos long all_read_before = zcpr.total_in;
2079573673dSchristos zcpr.avail_in = min(lOrigToDo,BlockSizeCompress);
2089573673dSchristos zcpr.avail_out = BlockSizeCompress;
2099573673dSchristos ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH);
2109573673dSchristos lOrigDone += (zcpr.total_in-all_read_before);
2119573673dSchristos lOrigToDo -= (zcpr.total_in-all_read_before);
2129573673dSchristos step++;
2139573673dSchristos } while (ret==Z_OK);
2149573673dSchristos
2159573673dSchristos lSizeCpr=zcpr.total_out;
2169573673dSchristos deflateEnd(&zcpr);
2179573673dSchristos dwGetTick=GetTickCount()-dwGetTick;
2189573673dSchristos dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
2199573673dSchristos dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
2209573673dSchristos printf("total compress size = %u, in %u step\n",lSizeCpr,step);
2219573673dSchristos printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
2229573673dSchristos printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
2239573673dSchristos printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
2249573673dSchristos }
2259573673dSchristos
2269573673dSchristos CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr);
2279573673dSchristos UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress);
2289573673dSchristos
2299573673dSchristos BeginCountPerfCounter(&li_qp,TRUE);
2309573673dSchristos dwGetTick=GetTickCount();
2319573673dSchristos BeginCountRdtsc(&li_rdtsc);
2329573673dSchristos {
2339573673dSchristos z_stream zcpr;
2349573673dSchristos int ret=Z_OK;
2359573673dSchristos long lOrigToDo = lSizeCpr;
2369573673dSchristos long lOrigDone = 0;
2379573673dSchristos int step=0;
2389573673dSchristos memset(&zcpr,0,sizeof(z_stream));
2399573673dSchristos inflateInit(&zcpr);
2409573673dSchristos
2419573673dSchristos zcpr.next_in = CprPtr;
2429573673dSchristos zcpr.next_out = UncprPtr;
2439573673dSchristos
2449573673dSchristos
2459573673dSchristos do
2469573673dSchristos {
2479573673dSchristos long all_read_before = zcpr.total_in;
2489573673dSchristos zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress);
2499573673dSchristos zcpr.avail_out = BlockSizeUncompress;
2509573673dSchristos ret=inflate(&zcpr,Z_SYNC_FLUSH);
2519573673dSchristos lOrigDone += (zcpr.total_in-all_read_before);
2529573673dSchristos lOrigToDo -= (zcpr.total_in-all_read_before);
2539573673dSchristos step++;
2549573673dSchristos } while (ret==Z_OK);
2559573673dSchristos
2569573673dSchristos lSizeUncpr=zcpr.total_out;
2579573673dSchristos inflateEnd(&zcpr);
2589573673dSchristos dwGetTick=GetTickCount()-dwGetTick;
2599573673dSchristos dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
2609573673dSchristos dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
2619573673dSchristos printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step);
2629573673dSchristos printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
2639573673dSchristos printf("uncpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
2649573673dSchristos printf("uncpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
2659573673dSchristos }
2669573673dSchristos
2679573673dSchristos if (lSizeUncpr==lFileSize)
2689573673dSchristos {
2699573673dSchristos if (memcmp(FilePtr,UncprPtr,lFileSize)==0)
2709573673dSchristos printf("compare ok\n");
2719573673dSchristos
2729573673dSchristos }
2739573673dSchristos
2749573673dSchristos return 0;
2759573673dSchristos }
276