C 与 C# 竞速:VLC 高斯模糊性能大比拼
C vs. C#: racing VLC's Gaussian blur

我通过逐行移植 VLC 的高斯模糊滤镜,在相同环境下对比了 C 与 C# 的性能。起初 C# 版本因代码生成器优化不足慢了 23%,但经过简单的循环边界提升和类型调整,差距缩小至 8%。在应用算法优化后,C# 性能提升 2.5 倍;最终启用 AVX2 SIMD 指令集并深度调优后,C# 版本在 1080p 视频处理上达到了与 C 版本几乎持平的 240 fps。这证明 C# 并非性能禁区,关键在于理解编译器行为并进行针对性优化。
选择 C# 的真正成本在于:你需要了解编译器是如何处理你的循环的。
HN 评论区
46- teo_zero
好文章!
让我惊讶的是,VLC 的原始滤镜竟然没有使用 SIMD。有时候我不禁在想,我花大价钱买那些拥有众多新特性的“现代”CPU 到底图什么,毕竟我日常运行的绝大多数软件完全无视这些特性。
- theanonymousone
> Two small edits close most of it: compute the loop bounds into locals before the loop,
我一直以为任何靠谱的运行时或编译器都会自动处理这类优化,所以在写 Java 代码时通常就把这种事交给 JDK 了。难道事实并非如此?
- hn_submit
C# 版本使用了 unsafe 原始指针,这实际上跟用 C 写没太大区别。所以结果相似也就不足为奇了。
- anderskaseorg
不过,针对高斯模糊还有快得多的算法可用,对于 n 像素的图像和半径 σ,其复杂度是 O(n) 而不是 O(nσ)。参见 https://www.ipol.im/pub/art/2013/87/article.pdf 中的综述。
- tinykerneldev
很有趣。更有趣的是,如果能看看 C# 的 SIMD 内联函数是否能提升性能,以及具体是如何提升的,那就更有意思了。