开发者 Martin Finkel 通过将 VLC 媒体播放器中的特定视频滤镜——高斯模糊——移植到不同语言中,对 C 和 C# 进行了性能对比。该实验旨在确定 C# 的托管特性和垃圾回收机制与 C(VLC 的原生语言)相比,是否会显著阻碍性能。为了确保公平对比,Finkel 创建了一个逐行的 C# 移植版本,该版本使用了与原始 C 实现相同的循环、整数运算和原始指针。C# 版本使用 .NET Native AOT 编译,使其能够作为原生 DLL 插件在 VLC 中运行。

开发者 Martin Finkel 通过将 VLC 媒体播放器中的特定视频滤镜——高斯模糊——移植到不同语言中,对 C 和 C# 进行了性能对比。
初步结果显示出明显的性能差距:C# 移植版本每帧的处理时间比原始 C 代码长约 23%。对机器代码的分析显示,.NET RyuJIT 编译器比 Clang 编译器生成了更多的指令,具体表现为重新计算循环边界并将求和结果保存在内存中而非寄存器中。然而,通过进行两项微调——将循环边界提升到局部变量,并使用 `nint` 作为索引以避免 32 位到 64 位的转换——C# 移植版本的性能提升到了与 C 版本差距在 8% 以内。这表明大部分性能差异归因于编译器处理特定 C# 结构的方式,而非语言本身的局限性。

初始结果显示出明显的性能差距,其中 C# 移植版本每帧的处理时间比原始 C 代码长约 23%。
在随后的优化轮次中,两个版本都通过算法改进得到了提升,例如用乘法代替除法、优化内存访问模式以及利用高斯钟形曲线的对称性。在最终的“调优”轮次中,两个版本都利用了 AVX2 SIMD 指令来实现巨大的加速,其中 C# 版本表现几乎与 C 持平。Finkel 得出结论:虽然 C 仍然是追求最后 10% 性能的最佳选择,但只要开发者考虑到 .NET 编译器优化代码的特定方式,C# 对于 CPU 密集型的 VLC 插件来说是一个高度可行且高效的选择。该实验是在 11 代 Intel Core i7 处理器上使用 1080p 片段进行的。

在随后的优化轮次中,两个版本都通过算法改进得到了提升,例如用乘法代替除法。

在最终的“调优”轮次中,两个版本都利用了 AVX2 SIMD 指令来实现巨大的加速,其中 C# 版本表现几乎与 C 持平。