Скорость сжатия libjpeg-turbo не имеет различий с libjpeg в моей программе

Моя программа работает на устройстве Android, и устройство является системой ARM с поддержкой NEON.

Сначала я использовал libjpeg для сжатия изображения RGB (800*480) в формат JPEG. Скорость была около 70 мс для каждого изображения, но она была слишком медленной для меня. Позже я обнаружил, что libjpeg-turbo может улучшить скорость сжатия с помощью NEON в ARM.

Но после компиляции и тестирования я обнаружил, что скорость их сжатия почти одинакова. И изменение качества и флага, переданного tjCompress2, также не дало никаких результатов. Я понятия не имею, что-то не так или что-то отсутствует в моей программе. Коды ниже:

tjhandle _jpegCompressor = tjInitCompress();

tjCompress2(_jpegCompressor, (unsigned char*)in, PARAM_WIDTH,
            PARAM_WIDTH*PERSIZE, PARAM_HEIGHT, PERSIZE,
            (unsigned char**)&out, (long unsigned int*)outlen, TJSAMP_444, 100,
            TJFLAG_FASTDCT);

tjDestroy(_jpegCompressor);

Буфер jpeg (out) выделяется и освобождается мной.

Я использую версию libjpeg-turbo 1.4.2

2 ответа

Многие из ускорений SIMD для libjpeg-turbo были добавлены только в версии 2.1 (на данный момент самой новой). На моем MacBook M1 (ARM с Neon) libjpeg-turbo 2.1.0 значительно быстрее как при сжатии, так и при распаковке, чем libjpeg 9e.

На официальном сайте libjpeg-turbo можно найти таблицу охвата SIMD для компонентов сжатия JPEG и различной архитектуры и в какой версии был добавлен ускоренный код.

Основываясь на эксперименте, который я недавно провел, результаты сжатия и распаковки с использованием libjpeg-turbo полностью идентичны libjpeg 6b. Хорошая работа, разработчики libjpeg-turbo!

Насколько я знаю, в libjpeg-turbo есть инструкции SIMD, SSE2, MMX для процессора x86. Я посмотрел на некоторые ассемблерные коды и не видел кода для других типов архитектур ЦП.

Я удивлен, что это даже сработало. Я думаю, что он (библиотека) сохраняет исходный код, что объясняет, почему он даже мог работать.

Если вы ищете оптимизацию, вы можете захотеть взглянуть на оптимизацию, которую вы можете выполнить с самой библиотекой libjpeg. Существует несколько файлов документации, один из которых содержит инструкции по оптимизации на процессоре ARM. Вы также можете настроить менеджер памяти. Там вы найдете гораздо больше информации, чем я могу напечатать здесь.

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