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