Mac OS X系统版本与本地重新安装之间的zlib性能差异

时间:2018-08-10 14:47:15

标签: zlib macos-high-sierra

我注意到系统中可用的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解压缩文件。

这是我对300MB压缩文件的测试:

使用系统版本的结果

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的结果

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%。有什么解释吗?

事物已经检查:

  • 我使用静态或动态版本重新编译zlib,它是相同的,总是比系统提供的版本慢40%。
  • 我在https://opensource.apple.com/source/zlib/zlib-70/的OSX源中检查了zlib ,它似乎与zlib网站上提供的zlib相同,没有对代码进行重新优化(尽管它们只是Mac OS 10.13.3之前的版本)

是否可以使用一些使它更快的特殊选项来编译系统版本? (但是40%似乎很多,并且zlib库已经使用-O3模式进行编译了)

1 个答案:

答案 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之外,它们还具有其他一些优化功能。