这是一篇关于优化rav1d
视频解码器性能的文章,主要内容总结如下:
- 背景与目的:
rav1d
是dav1d
AV1解码器的Rust版本,作者参与了memorysafety.org的竞赛以提升其性能。作者使用采样分析器比较rav1d
和dav1d
的运行情况,寻找性能优化点。 - 基线测试:在M3芯片上,
rav1d
比dav1d
在特定样本文件上的运行速度慢约9%(6秒)。使用hyperfine
工具在单线程模式下进行本地构建和比较。 性能分析:
- 使用
samply
采样分析器捕捉dav1d
和rav1d
在相同输入下的运行快照,以asm
函数作为“锚点”进行比较。发现rav1d
中cdef_filter_neon_erased
函数初始化了一个较大的临时缓冲区,而dav1d
未初始化,通过将缓冲区改为MaybeUninit
类型,减少了约400个样本的运行时间。 - 再次使用采样分析器的“倒置堆栈”视图,关注
add_temporal_candidate
函数,发现rav1d
中Mv
结构体的默认PartialEq
实现导致代码生成不佳,通过将Mv
定义为union
并使用transmute
重新解释为u32
来实现更优的比较,再次减少了约0.5秒的运行时间。
- 使用
- 总结:通过两个相对简单的优化,
rav1d
的运行时间减少了约1.7秒(约2.3%),与dav1d
的差距缩小了约30%。仍有更多优化空间,这种比较dav1d
和rav1d
的分析方法有望发现更多优化点。作者鼓励大家尝试并在相关论坛讨论。同时还提到了其他相关文章。
总体而言,通过对rav1d
代码的细致分析和优化,取得了一定的性能提升,为进一步优化提供了思路。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。