我的程序运行在android设备上,该设备是支持NEON的ARM系统。
起初,我使用libjpeg将RGB图像(800*480)压缩为jpeg。每张图片的速度大约是70ms,但对我来说太慢了。后来我发现了libjpeg turbo,它似乎可以提高ARM中NEON的压缩速度。
但经过编译和测试,我发现它们的压缩速度几乎相同。传递给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
libjpeg-turbo的许多SIMD加速仅在2.1中添加(目前是最新的)。在我的MacBook M1(带Neon的ARM)上,libjpeg turbo 2.1.0在压缩和解压缩方面都比libjpeg 9e快得多。
在libjpeg-turbo官方网站上,您可以找到JPEG压缩组件和各种架构的SIMD覆盖率表,以及在哪个版本中添加了加速代码。
基于我最近进行的实验,使用libjpeg-turbo进行压缩和解压缩的输出与libjpeg6b完全相同。干得好,libjpeg turbo开发人员!
据我所知,libjpeg-turbo有用于x86处理器的SIMD、SSE2、MMX指令。我看了一些汇编代码,没有看到任何其他类型CPU架构的代码。
我很惊讶它竟然奏效了。我认为它(库)保留了原始代码,这将解释为什么它能够运行。
如果您正在寻找优化,您可能想看看可以对libjpeg本身进行的优化。有几个文档文件,其中一个文件专门提供了在ARM处理器上进行优化的说明。您还可以调整内存管理器。你会在那里找到比我在这里输入的信息多得多的信息。