Разница в производительности zlib между версией системы mac os x и локальной переустановкой

Я заметил, что существует важная разница в производительности между библиотекой 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 в буфере.

Вот мой тест на gzip-файле размером 300 МБ:

Результаты с использованием системной версии

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% медленнее, чем версия, предоставленная системой.
  • Я проверил исходники OSX для zlib здесь https://opensource.apple.com/source/zlib/zlib-70/ , похоже, что это тот же zlib, что и на веб-сайте zlib, без какой-либо дополнительной повторной оптимизации кода (хотя у них есть только исходники до Mac OS 10.13.3)

Возможно ли, что системная версия скомпилирована с некоторыми специальными опциями, которые делают ее быстрее? (но 40% кажется много, а библиотека zlib уже скомпилирована с режимом -O3)

Я вижу то же самое. Код, используемый в общей библиотеке macOS, должен быть другим.

Mark Adler 11.08.2018 03:52

Хорошо, спасибо, Марк. После некоторого дополнительного поиска я предполагаю, что у них есть более быстрая версия функции crc32_z, возможно, с использованием операций с аппаратным ускорением CRC32, доступных с SSE4.2.

user2878752 13.08.2018 11:43

Также кажется, что они надуваются быстрее.

Mark Adler 13.08.2018 19:00
2
3
322
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как указал Марк Адлер в своем комментарии, код, используемый в библиотеке macOS, должен быть другим. Путаница возникает из-за того, что они не изменили строку версии библиотеки.

Я предполагаю, что они используют что-то похожее на эту версию https://github.com/jtkukunas/zlib (1.2.11.1-пестрая), где вычисление CRC векторизовано. Профилирование показало, что функция crc в версии apple zlib в 9 раз быстрее, чем в zlib 1.2.11. Это исполнение аналогично zlib "1.2.11.1-motley".

Для gzip-файла размером 4 ГБ у меня есть следующее время распаковки

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 до 1 МБ, яблочный 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 у них также есть некоторые другие оптимизации.

Другие вопросы по теме