【问题标题】:zlib gzgets extremely slow?zlib gzgets 非常慢?
【发布时间】:2011-02-19 10:08:01
【问题描述】:

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

使用 c++ std::ifstreams 与 c FILE 没有太大区别,

根据zlib的文档,它支持解压文件,无需解压即可读取文件。

我发现使用非 zlib 的 12 秒与使用 zlib.h 的超过 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]);

}

【问题讨论】:

  • 旁注 - argv[2] 通常是一个字符串。你怎么让它成为012?你真的吗?
  • 注意 atoi。我使用时间 ./a.out FILE 0 或时间 ./a.out FILE 1 或时间 ./a.out FILE 2 运行程序
  • 我刚试过zlib-1.2.5。在特定的 gzip 文件上,gzgetc 和 gzgets 比 1.2.3 中的快 10 倍。我通常用我自己的缓冲 I/O 包装 gz* 函数。看来我不再需要这个包装器了。

标签: c++ c text zlib


【解决方案1】:

我猜你正在使用 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 中的快得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 2017-12-12
    • 2015-06-14
    • 2013-05-14
    • 2021-05-24
    • 1970-01-01
    • 2013-06-24
    相关资源
    最近更新 更多