2010-05-14 123 views
3

我正在做的東西有關解析巨大的文字文件的小塊,並測試使用什麼輸入法。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]); 

} 
+0

注意 - 'argv [2]'通常是一個字符串。你怎麼把它變成'0','1'或'2'?你真的? – shoosh 2010-05-14 08:13:18

+0

注意atoi。 進出口運行程序與 時間./a.out FILE 0 或 時間./a.out FILE 1 或 時間./a.out我剛試過的zlib-1.2.5 FILE 2 – monkeyking 2010-05-14 08:25:27

+0

。在特定的gzip文件中,gzgetc和gzgets比1.2.3中的快10倍。我通常用自己的緩衝I/O包裝gz *函數。看來我不再需要這個包裝了。 – user172818 2010-05-20 01:37:07

回答

3

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