Performance 如何加速libjpeg解压缩

Performance 如何加速libjpeg解压缩,performance,embedded,jpeg,libjpeg,decoder,Performance,Embedded,Jpeg,Libjpeg,Decoder,我们在小型嵌入式平台上使用libjpeg进行JPEG解码。当我们解码大图像时,速度有问题。例如,20 MB大且尺寸为5000x3000像素的图像需要10秒才能加载 我需要一些关于如何提高解码速度的技巧。在其他性能类似的平台上,我在两秒钟内加载了相同的图像 通过使用更大的读取缓冲区(64KB而不是默认的4KB),最好将时间从14秒减少到10秒。但没有别的办法 我们不需要以全分辨率显示图像,所以我们使用scale_num和scale_denom以较小的尺寸显示图像。但我想有更多的表现。是否可以使用某

我们在小型嵌入式平台上使用libjpeg进行JPEG解码。当我们解码大图像时,速度有问题。例如,20 MB大且尺寸为5000x3000像素的图像需要10秒才能加载

我需要一些关于如何提高解码速度的技巧。在其他性能类似的平台上,我在两秒钟内加载了相同的图像

通过使用更大的读取缓冲区(64KB而不是默认的4KB),最好将时间从14秒减少到10秒。但没有别的办法


我们不需要以全分辨率显示图像,所以我们使用scale_num和scale_denom以较小的尺寸显示图像。但我想有更多的表现。是否可以使用某种多线程等。?不同的解码设置?任何事情,我都有很多想法

如果目标具有多个执行单元以实现真正的并发执行,则多线程只能帮助解码过程。否则,它只会对现有CPU资源进行时间切片。除非图书馆是为利用它而设计的,否则无论如何都不会有帮助

如果从源代码构建库,首先应确保在打开优化的情况下构建库,并仔细选择编译器选项,使构建与目标及其指令集相匹配,以使编译器能够使用SIMD或FPU(例如)

也需要考虑其他可能的瓶颈。这10秒仅仅是解码的时间,还是包括从文件系统或网络读取的时间?考虑到在增加读取缓冲区大小时观察到的改进,在这种情况下,很可能是数据读取而不是解码受到限制


如果事实上文件系统访问是限制因素,而不是解码,那么在单独的线程中分离从解码读取的文件并通过管道或队列或多个共享内存缓冲区将数据传递给解码器可能会有一些好处。然后,您可以确保解码器可以流式传输解码,而无需等待文件系统阻塞。

首先-评测代码。如果你不能确定瓶颈,你只剩下猜测了

接下来,在文档中搜索libjpeg加速机会。您提到了
scale\u num
scale\u denom
。解压器的
dct\u方法如何?我发现
DCT\u faster
选项很好。还有其他选项可供检查:
do\u fancy\u upsampling
do\u block\u smoothing
dither\u mode
two\u pass\u quantize
,等等。根据您的系统、libjpeg版本等,这些选项中的一些可能对您有用

如果分析工具不可用,仍有一些事情需要尝试。首先,我怀疑您的瓶颈与CPU无关。要确认,请将未压缩的图像加载到RAM缓冲区中,然后按原样从那里解压缩。这是否显著缩短了减压时间?如果是这样,罪魁祸首可能是从图像存储介质中读取操作。根据您的系统,从USB(或SD等)读取可能会很慢。(注意,我假设从外部介质读取数据-尽管硬件细节不多。)确保优化相关的总线参数,以及(SPI时钟、配置等)

如果您正在读取内部闪存(即NAND)之类的内容,则需要检查其他一些内容。您的NAND控制器是如何配置的?您是否确保控制器配置为最快的操作?检查等待状态、计时等。请注意,总线和/或内存争用也可能是一个问题,因此也要检查它们各自的配置

最后,如果您认为您的系统实际上是CPU受限的,那么这个stackoverflow问题可能会引起您的兴趣:
高性能jpeglib turbo实现能否在中解压缩/压缩请看。如果您支持硬件,那么在同一CPU上,它通常比libjpeg快2-4倍。典型的12MB jpeg在Pandorn上的解码时间不到2秒。您还可以查看各种JPEG解码器的速度分析

对目标硬件和操作环境如此谨慎可能不利于找到一个好的答案。诸如处理器体系结构、操作系统、内存大小、内存带宽等信息可能都是密切相关的。你从哪里加载图像?你确定这不是瓶颈吗?例如,SD卡的性能差异很大,尤其是通过SPI读取的SD卡。目标图像大小是多少?如果你想得到1/8乘1/8的缩放图像(625x325),只需解码DC值,就可以获得巨大的速度提升(无需进行逆变换)。嗨,Clifford,当我将读取缓冲区增加到64kB时,效果会更好,但当我试图将其增加到256KB时,变化非常小。@Bogi:你在问题中已经说过了;它并没有反驳我的假设,只是文件系统可能正在以尽可能快的速度运行。我建议您一次测试读取整个文件64kb,而不进行解码或显示以查看需要多长时间。如果这已经太长了,在指责JPEG解码之前,您可能需要解决这个问题,或者这可能是一个限制因素,并且不容易解决,除非您分析了它以了解在哪里消耗了时间,否则很难回答。@bogi:与我的建议相反,有一种方法可以帮助多线程;我已经编辑了我的答案。