+++ /dev/null
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <windows.h>\r
-\r
-#include "zlib.h"\r
-\r
-\r
-void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B)\r
-{\r
- R->HighPart = A.HighPart - B.HighPart;\r
- if (A.LowPart >= B.LowPart)\r
- R->LowPart = A.LowPart - B.LowPart;\r
- else\r
- {\r
- R->LowPart = A.LowPart - B.LowPart;\r
- R->HighPart --;\r
- }\r
-}\r
-\r
-#ifdef _M_X64\r
-// see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc\r
-unsigned __int64 __rdtsc(void);\r
-void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)\r
-{\r
- // printf("rdtsc = %I64x\n",__rdtsc());\r
- pbeginTime64->QuadPart=__rdtsc();\r
-}\r
-\r
-LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)\r
-{\r
- LARGE_INTEGER LIres;\r
- unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart));\r
- LIres.QuadPart=res;\r
- // printf("rdtsc = %I64x\n",__rdtsc());\r
- return LIres;\r
-}\r
-#else\r
-#ifdef _M_IX86\r
-void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)\r
-{\r
- DWORD dwEdx,dwEax;\r
- _asm\r
- {\r
- rdtsc\r
- mov dwEax,eax\r
- mov dwEdx,edx\r
- }\r
- pbeginTime64->LowPart=dwEax;\r
- pbeginTime64->HighPart=dwEdx;\r
-}\r
-\r
-void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)\r
-{\r
- myGetRDTSC32(pbeginTime64);\r
-}\r
-\r
-LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)\r
-{\r
- LARGE_INTEGER LIres,endTime64;\r
- myGetRDTSC32(&endTime64);\r
-\r
- LIres.LowPart=LIres.HighPart=0;\r
- MyDoMinus64(&LIres,endTime64,beginTime64);\r
- return LIres;\r
-}\r
-#else\r
-void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)\r
-{\r
-}\r
-\r
-void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)\r
-{\r
-}\r
-\r
-LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)\r
-{\r
- LARGE_INTEGER lr;\r
- lr.QuadPart=0;\r
- return lr;\r
-}\r
-#endif\r
-#endif\r
-\r
-void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)\r
-{\r
- if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64)))\r
- {\r
- pbeginTime64->LowPart = GetTickCount();\r
- pbeginTime64->HighPart = 0;\r
- }\r
-}\r
-\r
-DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)\r
-{\r
- LARGE_INTEGER endTime64,ticksPerSecond,ticks;\r
- DWORDLONG ticksShifted,tickSecShifted;\r
- DWORD dwLog=16+0;\r
- DWORD dwRet;\r
- if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64)))\r
- dwRet = (GetTickCount() - beginTime64.LowPart)*1;\r
- else\r
- {\r
- MyDoMinus64(&ticks,endTime64,beginTime64);\r
- QueryPerformanceFrequency(&ticksPerSecond);\r
-\r
-\r
- {\r
- ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog);\r
- tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog);\r
-\r
- }\r
-\r
- dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted));\r
- dwRet *=1;\r
- }\r
- return dwRet;\r
-}\r
-\r
-int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr)\r
-{\r
- FILE* stream;\r
- unsigned char* ptr;\r
- int retVal=1;\r
- stream=fopen(filename, "rb");\r
- if (stream==NULL)\r
- return 0;\r
-\r
- fseek(stream,0,SEEK_END);\r
-\r
- *plFileSize=ftell(stream);\r
- fseek(stream,0,SEEK_SET);\r
- ptr=malloc((*plFileSize)+1);\r
- if (ptr==NULL)\r
- retVal=0;\r
- else\r
- {\r
- if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize))\r
- retVal=0;\r
- }\r
- fclose(stream);\r
- *pFilePtr=ptr;\r
- return retVal;\r
-}\r
-\r
-int main(int argc, char *argv[])\r
-{\r
- int BlockSizeCompress=0x8000;\r
- int BlockSizeUncompress=0x8000;\r
- int cprLevel=Z_DEFAULT_COMPRESSION ;\r
- long lFileSize;\r
- unsigned char* FilePtr;\r
- long lBufferSizeCpr;\r
- long lBufferSizeUncpr;\r
- long lCompressedSize=0;\r
- unsigned char* CprPtr;\r
- unsigned char* UncprPtr;\r
- long lSizeCpr,lSizeUncpr;\r
- DWORD dwGetTick,dwMsecQP;\r
- LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc;\r
-\r
- if (argc<=1)\r
- {\r
- printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n");\r
- return 0;\r
- }\r
-\r
- if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0)\r
- {\r
- printf("error reading %s\n",argv[1]);\r
- return 1;\r
- }\r
- else printf("file %s read, %u bytes\n",argv[1],lFileSize);\r
-\r
- if (argc>=3)\r
- BlockSizeCompress=atol(argv[2]);\r
-\r
- if (argc>=4)\r
- BlockSizeUncompress=atol(argv[3]);\r
-\r
- if (argc>=5)\r
- cprLevel=(int)atol(argv[4]);\r
-\r
- lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200;\r
- lBufferSizeUncpr = lBufferSizeCpr;\r
-\r
- CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress);\r
-\r
- BeginCountPerfCounter(&li_qp,TRUE);\r
- dwGetTick=GetTickCount();\r
- BeginCountRdtsc(&li_rdtsc);\r
- {\r
- z_stream zcpr;\r
- int ret=Z_OK;\r
- long lOrigToDo = lFileSize;\r
- long lOrigDone = 0;\r
- int step=0;\r
- memset(&zcpr,0,sizeof(z_stream));\r
- deflateInit(&zcpr,cprLevel);\r
-\r
- zcpr.next_in = FilePtr;\r
- zcpr.next_out = CprPtr;\r
-\r
-\r
- do\r
- {\r
- long all_read_before = zcpr.total_in;\r
- zcpr.avail_in = min(lOrigToDo,BlockSizeCompress);\r
- zcpr.avail_out = BlockSizeCompress;\r
- ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH);\r
- lOrigDone += (zcpr.total_in-all_read_before);\r
- lOrigToDo -= (zcpr.total_in-all_read_before);\r
- step++;\r
- } while (ret==Z_OK);\r
-\r
- lSizeCpr=zcpr.total_out;\r
- deflateEnd(&zcpr);\r
- dwGetTick=GetTickCount()-dwGetTick;\r
- dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);\r
- dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);\r
- printf("total compress size = %u, in %u step\n",lSizeCpr,step);\r
- printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);\r
- printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);\r
- printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);\r
- }\r
-\r
- CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr);\r
- UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress);\r
-\r
- BeginCountPerfCounter(&li_qp,TRUE);\r
- dwGetTick=GetTickCount();\r
- BeginCountRdtsc(&li_rdtsc);\r
- {\r
- z_stream zcpr;\r
- int ret=Z_OK;\r
- long lOrigToDo = lSizeCpr;\r
- long lOrigDone = 0;\r
- int step=0;\r
- memset(&zcpr,0,sizeof(z_stream));\r
- inflateInit(&zcpr);\r
-\r
- zcpr.next_in = CprPtr;\r
- zcpr.next_out = UncprPtr;\r
-\r
-\r
- do\r
- {\r
- long all_read_before = zcpr.total_in;\r
- zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress);\r
- zcpr.avail_out = BlockSizeUncompress;\r
- ret=inflate(&zcpr,Z_SYNC_FLUSH);\r
- lOrigDone += (zcpr.total_in-all_read_before);\r
- lOrigToDo -= (zcpr.total_in-all_read_before);\r
- step++;\r
- } while (ret==Z_OK);\r
-\r
- lSizeUncpr=zcpr.total_out;\r
- inflateEnd(&zcpr);\r
- dwGetTick=GetTickCount()-dwGetTick;\r
- dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);\r
- dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);\r
- printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step);\r
- printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);\r
- printf("uncpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);\r
- printf("uncpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);\r
- }\r
-\r
- if (lSizeUncpr==lFileSize)\r
- {\r
- if (memcmp(FilePtr,UncprPtr,lFileSize)==0)\r
- printf("compare ok\n");\r
-\r
- }\r
-\r
- return 0;\r
-}\r