zlib gzgets非常慢?

时间:2010-05-14 07:24:39

标签: c++ c text zlib

我正在做与解析大量文本文件有关的事情,并且正在测试要使用的输入法。

使用c ++ std :: ifstreams vs c FILE,

没有多大区别

根据zlib的文档,它支持未压缩的文件,并且将在不解压缩的情况下读取文件。

我看到使用zlib.h将非zlib的12秒与超过4分钟的差异

我已经测试了多次运行,因此它不是磁盘缓存问题。

我是否以错误的方式使用zlib?

感谢

#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]);

}

1 个答案:

答案 0 :(得分:3)

我猜你正在使用zlib-1.2.3。在这个版本中,gzgets()实际上是为每个字节调用gzread()。以这种方式调用gzread()会产生很大的开销。您可以比较调用gzread(gzfp,buffer,4096)一次和调用gzread(gzfp,buffer,1)4096次的CPU时间。结果是一样的,但CPU时间差异很大。

你应该做的是为zlib实现缓冲I / O,用一个gzread()调用读取块中的~4KB数据(就像fread()对read()所做的那样)。据说最新的zlib-1.2.5在gzread / gzgetc /上有了很大的改进....你也可以尝试一下。由于它最近刚刚发布,我没有亲自尝试过。

编辑:

我刚才尝试过zlib-1.2.5。 1.2.5中的gzgetc和gzgets比1.2.3中的快得多。