El desarrollador Martin Finkel realizó una comparación de rendimiento entre C y C# portando un filtro de vídeo específico —el desenfoque gaussiano— del reproductor multimedia VLC. El experimento tenía como objetivo determinar si la naturaleza gestionada de C# y su recolector de basura dificultarían significativamente el rendimiento en comparación con C, que es el lenguaje nativo de VLC. Para garantizar una comparación justa, Finkel creó una versión en C# línea por línea que utilizaba los mismos bucles, aritmética de enteros y punteros crudos que la implementación original en C. La versión en C# se compiló utilizando .NET Native AOT, lo que le permitió ejecutarse como un complemento DLL nativo dentro de VLC.

Una comparación lado a lado de un fotograma original y el mismo fotograma desenfocado con diferentes valores de sigma.
Ejemplos visuales del filtro de desenfoque gaussiano aplicado en valores de sigma de 2, 4 y 8.martinfinkel.com

El desarrollador Martin Finkel realizó una comparación de rendimiento entre C y C# portando un filtro de vídeo específico —el desenfoque gaussiano— del reproductor multimedia VLC.

Los resultados iniciales mostraron una clara brecha de rendimiento: la versión en C# tardaba aproximadamente un 23% más por fotograma que el código original en C. El análisis del código de máquina reveló que el compilador .NET RyuJIT emitía más instrucciones que el compilador Clang, específicamente al recalcular los límites de los bucles y mantener las sumas en memoria en lugar de en registros. Sin embargo, al realizar dos pequeños ajustes —elevar los límites de los bucles a variables locales y usar `nint` para los índices para evitar conversiones de 32 a 64 bits— el rendimiento de la versión en C# mejoró hasta situarse dentro del 8% de la versión en C. Esto demostró que gran parte de la diferencia de rendimiento se debía a cómo el compilador manejaba constructos específicos de C# en lugar de limitaciones inherentes del lenguaje.

Un gráfico de comparación de rendimiento que muestra los fotogramas por segundo para la versión en C# frente a la implementación actual de VLC.
Resultados iniciales de rendimiento que muestran la versión en C# ejecutándose a 6.4 FPS en comparación con la implementación original de VLC a 7.9 FPS.martinfinkel.com

Los resultados iniciales mostraron una clara brecha de rendimiento donde la versión en C# tardaba aproximadamente un 23% más por fotograma que el código original en C.

En rondas posteriores de optimización, ambas versiones mejoraron mediante refinamientos algorítmicos como reemplazar la división por multiplicación, optimizar los patrones de acceso a memoria y utilizar la simetría de la curva de campana gaussiana. En la ronda final de 'ajuste', ambas versiones utilizaron instrucciones AVX2 SIMD para lograr aceleraciones masivas, con la versión en C# funcionando casi a la par con C. Finkel concluyó que, si bien C sigue siendo la opción superior para el último 10% de rendimiento, C# es una opción altamente viable y productiva para complementos de VLC limitados por la CPU, siempre que los desarrolladores tengan en cuenta las formas específicas en que el compilador .NET optimiza su código. El experimento se llevó a cabo en un clip de 1080p utilizando un procesador Intel Core i7 de 11.ª generación.

Un gráfico de comparación de rendimiento que muestra las versiones optimizadas de C y C# frente a la implementación original de VLC.
Resultados de rendimiento después de la primera ronda de optimizaciones, que muestran aceleraciones significativas para las versiones de C y C#.martinfinkel.com

En rondas posteriores de optimización, ambas versiones mejoraron mediante refinamientos algorítmicos como reemplazar la división por multiplicación.

Un gráfico de comparación de rendimiento que muestra las versiones finales ajustadas de C y C# alcanzando una paridad cercana.
Resultados finales ajustados que muestran la versión en C# funcionando casi a la par con la versión en C utilizando instrucciones AVX2 SIMD.martinfinkel.com

En la ronda final de 'ajuste', ambas versiones utilizaron instrucciones AVX2 SIMD para lograr aceleraciones masivas, con la versión en C# funcionando casi a la par con C.