【发布时间】: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]通常是一个字符串。你怎么让它成为0、1或2?你真的吗? -
注意 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* 函数。看来我不再需要这个包装器了。