--- /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