zlib gzgets极其缓慢?
问题描述:
我正在做的东西有关解析巨大的文字文件的小块,并测试使用什么输入法。zlib gzgets极其缓慢?
没有多少用c的差别++的std :: ifstreams VS C文件,
根据的zlib的文件,它支持无压缩文件,并会读不解压文件。
我使用zlib.h
这是我测试过的做多的运行,眼看着使用非zlib的,以超过4分12秒的差异所以它不是一个磁盘缓存的问题。
我是否以某种错误的方式使用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]);
}
答
我猜你正在使用的zlib-1.2.3。在这个版本中,gzgets()实际上是为每个字节调用gzread()。以这种方式调用gzread()有很大的开销。您可以比较一次调用gzread(gzfp,buffer,4096)和调用gzread(gzfp,buffer,1)4096次的CPU时间。结果是一样的,但CPU时间是非常不同的。你需要做的是为zlib实现缓冲I/O,用一个gzread()调用(比如fread()对read()做什么)读取〜4KB数据。据说最新的zlib-1.2.5在gzread/gzgetc/....上显着改进。你也可以尝试一下。由于它最近发布,我没有亲自尝试过。
编辑:
我刚才试过zlib-1.2.5。 1.2.5中的gzgetc和gzgets比1.2.3中的更快。
注意 - 'argv [2]'通常是一个字符串。你怎么把它变成'0','1'或'2'?你真的? – shoosh 2010-05-14 08:13:18
注意atoi。 进出口运行程序与 时间./a.out FILE 0 或 时间./a.out FILE 1 或 时间./a.out我刚试过的zlib-1.2.5 FILE 2 – monkeyking 2010-05-14 08:25:27
。在特定的gzip文件中,gzgetc和gzgets比1.2.3中的快10倍。我通常用自己的缓冲I/O包装gz *函数。看来我不再需要这个包装了。 – user172818 2010-05-20 01:37:07