He estado trabajando en un código MUY intensivo en cálculos en (¡jadeo!) C #.
Estoy construyendo una implementación GPGPU de FDTD para modelado óptico. En un clúster pequeño (procesador 128), muchas de nuestras simulaciones tardan semanas en ejecutarse. Sin embargo, las implementaciones de GPU tienden a ejecutarse aproximadamente 50 veces más rápido, y eso es en una tarjeta NVidia de nivel de consumidor. Ahora tenemos un servidor con dos tarjetas de doble procesador GTX295 (varios cientos de núcleos) y pronto obtendremos algunos Teslas.
¿Cómo se relaciona esto con tu idioma? De la misma manera que el código C ++ FDTD que estábamos usando antes estaba vinculado a la CPU, estos están vinculados a la GPU, por lo que la diferencia de potencia ( muy pequeña) del código administrado frente al código nativo nunca entra en juego. La aplicación C # actúa como un conductor: carga los núcleos de OpenCL, pasa datos hacia y desde las GPU, proporciona la interfaz de usuario, informes, etc., todas las tareas que son un fastidio en C ++.
En años anteriores, la diferencia de rendimiento entre el código administrado y el no administrado era lo suficientemente importante como para que a veces valiera la pena soportar el terrible modelo de objetos de C ++ para obtener el pequeño porcentaje adicional de velocidad. En estos días, el costo de desarrollo de C ++ vs C # supera con creces los beneficios para la mayoría de las aplicaciones.
Además, la mayor parte de su diferencia de rendimiento no vendrá de su elección de idioma, sino de la habilidad de su desarrollador. Hace unas semanas, moví una operación de división única desde el interior de un bucle anidado triple (recorrido de matriz 3D), lo que redujo el tiempo de ejecución para un dominio computacional dado en un 15%. Ese es el resultado de la arquitectura del procesador: la división es lenta, que es una de esas caras que solo necesita haber recogido en alguna parte.