我注意到系统中可用的zlib库与我从源代码重新安装的zlib库之间存在重要的性能差异,尽管两者都是zlib 1.2.11版。 我运行的是Mac OS 10.13.6。
#include <stdio.h>
#include <stdlib.h>
#ifdef LOCAL_ZLIB
#include "./zlib-1.2.11/zlib.h"
#else
#include <zlib.h>
#endif
int main(int argc, char *argv[])
{
printf("zlib version %s\n",zlibVersion());
gzFile testFile = gzopen(argv[1], "r");
int buffsize = 1024*1024 ;
char * buffer = (char *) calloc(buffsize,sizeof(char));
while ( gzread(testFile,buffer,buffsize) >0 )
{
;
}
free(buffer);
gzclose(testFile);
}
它只是使用缓冲区中的gzread解压缩文件。
wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR374/006/SRR3744956/SRR3744956_1.fastq.gz
gcc bench_zlib.c -O3 -o bench_zlib -lz
time ./bench_zlib SRR3744956_1.fastq.gz
哪个给:
zlib version 1.2.11
real 0m3.711s
user 0m3.599s
sys 0m0.105s
zlib重新编译,相同版本,以静态模式链接:
wget https://www.zlib.net/zlib-1.2.11.tar.gz
tar -xzvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure
make
cd..
gcc bench_zlib.c ./zlib-1.2.11/libz.a -O3 -o bench_zlib -DLOCAL_ZLIB
time ./bench_zlib SRR3744956_1.fastq.gz
哪个给
zlib version 1.2.11
real 0m5.236s
user 0m5.113s
sys 0m0.112s
我从本地本地重新编译的版本慢40%。有什么解释吗?
事物已经检查:
是否可以使用一些使它更快的特殊选项来编译系统版本? (但是40%似乎很多,并且zlib库已经使用-O3模式进行编译了)
答案 0 :(得分:0)
正如Mark Adler在其评论中指出的那样,macOS库中使用的代码必须不同。造成混淆的原因是他们没有更改库版本字符串。
我猜他们使用的版本与此版本https://github.com/jtkukunas/zlib(1.2.11.1-motley)相似,其中CRC计算是矢量化的。分析表明,与zlib 1.2.11相比,苹果zlib版本的crc功能快9倍。此性能类似于zlib“ 1.2.11.1-motley”。
在压缩后的4GB文件中,我具有以下解压缩时间
apple zlib 1.2.11 (dynamic zlib included in Mac OS 10.13.6) : 47.9 s
vanilla zlib 1.2.11 (from zlib.net) : 70.8 s
zlib 1.2.11.1-motley (from github.com/jtkukunas/zlib) : 48.4 s
此外,当使用gzbuffer(testFile, 1 << 20);
将zlib缓冲区增加到1MB时,苹果zlib变得比zlib 1.2.11.1-motley快一点。
apple zlib 1.2.11 : 43.9 s
vanilla zlib 1.2.11 : 67.1 s
zlib 1.2.11.1-motley : 48.3 s
所以我想,除了矢量化CRC之外,它们还具有其他一些优化功能。