使 rav1d 视频解码器快 1%

这是一篇关于优化rav1d视频解码器性能的文章,主要内容总结如下:

  • 背景与目的rav1ddav1dAV1解码器的Rust版本,作者参与了memorysafety.org的竞赛以提升其性能。作者使用采样分析器比较rav1ddav1d的运行情况,寻找性能优化点。
  • 基线测试:在M3芯片上,rav1ddav1d在特定样本文件上的运行速度慢约9%(6秒)。使用hyperfine工具在单线程模式下进行本地构建和比较。
  • 性能分析

    • 使用samply采样分析器捕捉dav1drav1d在相同输入下的运行快照,以asm函数作为“锚点”进行比较。发现rav1dcdef_filter_neon_erased函数初始化了一个较大的临时缓冲区,而dav1d未初始化,通过将缓冲区改为MaybeUninit类型,减少了约400个样本的运行时间。
    • 再次使用采样分析器的“倒置堆栈”视图,关注add_temporal_candidate函数,发现rav1dMv结构体的默认PartialEq实现导致代码生成不佳,通过将Mv定义为union并使用transmute重新解释为u32来实现更优的比较,再次减少了约0.5秒的运行时间。
  • 总结:通过两个相对简单的优化,rav1d的运行时间减少了约1.7秒(约2.3%),与dav1d的差距缩小了约30%。仍有更多优化空间,这种比较dav1drav1d的分析方法有望发现更多优化点。作者鼓励大家尝试并在相关论坛讨论。同时还提到了其他相关文章。

总体而言,通过对rav1d代码的细致分析和优化,取得了一定的性能提升,为进一步优化提供了思路。

阅读 26
0 条评论