(root)/
gcc-13.2.0/
zlib/
contrib/
testzlib/
testzlib.c
       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,unsigned char** pFilePtr)
     120  {
     121      FILE* stream;
     122      unsigned char* 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  }