symbian-qemu-0.9.1-12/zlib-1.2.3/contrib/testzlib/testzlib.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     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
       
    22 unsigned __int64 __rdtsc(void);
       
    23 void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
       
    24 {
       
    25  //   printf("rdtsc = %I64x\n",__rdtsc());
       
    26    pbeginTime64->QuadPart=__rdtsc();
       
    27 }
       
    28 
       
    29 LARGE_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
       
    39 void 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 
       
    52 void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
       
    53 {
       
    54     myGetRDTSC32(pbeginTime64);
       
    55 }
       
    56 
       
    57 LARGE_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 
       
    75 LARGE_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,void** pFilePtr)
       
   120 {
       
   121     FILE* stream;
       
   122     void* 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 }