Is zlib gzgets really slow?

I do things related to parsing huge globes of text files, and tested which input method to use.

Unlike C ++, std :: ifstreams vs c FILE is not much,

According to the zlib documentation, it supports uncompressed files and will read the file without decompression.

I see a difference from 12 seconds using non zlib for more than 4 minutes using zlib.h

I tested this by performing several starts, so the problem is not related to the disk cache.

Am I using zlib in some wrong way?

thank

#include <zlib.h>
#include <cstdio>
#include <cstdlib>
#include <fstream>
#define LENS 1000000


size_t fg(const char *fname){
  fprintf(stderr,"\t-> using fgets\n");
  FILE *fp =fopen(fname,"r");
  size_t nLines =0;
  char *buffer = new char[LENS];
  while(NULL!=fgets(buffer,LENS,fp))
    nLines++;

  fprintf(stderr,"%lu\n",nLines);
  return nLines;
}

size_t is(const char *fname){
  fprintf(stderr,"\t-> using ifstream\n");
  std::ifstream is(fname,std::ios::in);
  size_t nLines =0;
  char *buffer = new char[LENS];
  while(is. getline(buffer,LENS))
    nLines++;

  fprintf(stderr,"%lu\n",nLines);
  return nLines;
}

size_t iz(const char *fname){
  fprintf(stderr,"\t-> using zlib\n");
  gzFile fp =gzopen(fname,"r");
  size_t nLines =0;
  char *buffer = new char[LENS];
  while(0!=gzgets(fp,buffer,LENS))
    nLines++;

  fprintf(stderr,"%lu\n",nLines);
  return nLines;
}

int main(int argc,char**argv){
  if(atoi(argv[2])==0)
    fg(argv[1]);
  if(atoi(argv[2])==1)
    is(argv[1]);
  if(atoi(argv[2])==2)
    iz(argv[1]);

}
+3
source share
1 answer

, zlib-1.2.3. gzgets() gzread() . gzread() . gzread (gzfp, buffer, 4096) gzread (gzfp, buffer, 1) 4096 . , CPU .

, - zlib, 4 gzread() (, fread() read()). , zlib-1.2.5 gzread/gzgetc/.... . , .

EDIT:

zlib-1.2.5. gzgetc gzgets 1.2.5 , 1.2.3.

+3

Source: https://habr.com/ru/post/1745411/


All Articles