performance - 如何加快libjpeg解压速度

标签 performance embedded jpeg libjpeg decoder

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

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

通过使用更大的读取缓冲区(64 kB 而不是默认的 4 kB),我们得到的最佳时间从 14 秒减少到 10 秒。但没有其他帮助。

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

最佳答案

首先 - 分析代码。如果您无法明确识别瓶颈,那么您只能进行猜测。

接下来,搜索文档以寻找 libjpeg 加速机会。您提到了 scale_numscale_denom。解压缩器的dct_method怎么样?我发现 DCT_FASTEST 选项很好。还有其他选项需要检查:do_fancy_upsamplingdo_block_smoothingdither_modetwo_pass_quantize等。其中一些可能对您有用,具体取决于您的系统、libjpeg 版本等。

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

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

最后,如果您相信您的系统实际上是 CPU 密集型的,那么您可能会对这个 stackoverflow 问题感兴趣: Can a high-performance jpeglib-turbo implmentation decompress/compress in <100ms?

关于performance - 如何加快libjpeg解压速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21997523/

相关文章:

java - 改进 Large ListView Adapter 的平滑滚动,有时会出现抖动

CANopen/CAN总线,我需要什么,包括协议(protocol)(OD?),在PC终端和CAN设备模块之间进行通信

unix - 如何在不重新压缩 JPEG 的情况下删除 EXIF 数据?

java - 如何编辑保留其页眉和页脚的 JPG 文件的字节码? ( java 语)

c - 如何确定内联汇编在何处/针对什么可以提供更高的执行速度?

http - 通过 HTTP 协议(protocol)抓取 VLC 帧

python - 查找 1 到 ~2^128 之间的素数

javascript - 如何组织JS加载?

php - 在析构函数中取消设置对象属性是否更有效?

c - const 和 const volatile 之间的区别