Sólo por diversión, me trató de comparar el rendimiento de la pila un par de lenguajes de programación cálculo de la serie de Fibonacci utilizando el algoritmo recursivo ingenuo. El código es fundamentalmente el mismo en todos los idiomas, voy a publicar una versión de Java:rendimiento de la pila en lenguajes de programación
public class Fib {
public static int fib(int n) {
if (n < 2) return 1;
return fib(n-1) + fib(n-2);
}
public static void main(String[] args) {
System.out.println(fib(Integer.valueOf(args[0])));
}
}
Ok por lo que el punto es que el uso de este algoritmo con la entrada 40 Tengo estos tiempos:
C: 2.796s
Ocaml: 2.372s
Python: 106.407s
Java: 1.336s
C#(mono): 2.956s
Ellos se toman en una caja de Ubuntu 10.04 usando las versiones de cada idioma disponible en los repositorios oficiales, en una máquina Intel de doble núcleo.
Sé que los lenguajes funcionales como ocaml tienen la desaceleración que proviene de tratar las funciones como ciudadanos de primer orden y no tienen ningún problema para explicar el tiempo de ejecución de CPython porque es el único lenguaje interpretado en esta prueba, pero quedé impresionado por el tiempo de ejecución de Java, que es la mitad de la c para el mismo algoritmo! ¿Lo atribuirías a la compilación de JIT?
¿Cómo explicarías estos resultados?
EDIT: gracias por las respuestas interesantes! Reconozco que este no es un punto de referencia adecuado (nunca dije que fuera: P) y tal vez puedo hacer uno mejor y postearlo la próxima vez, a la luz de lo que hemos discutido :)
EDITAR 2 : Actualicé el tiempo de ejecución de la implementación de ocaml, utilizando el optimizador compilador ocamlopt. También publiqué el banco de pruebas en https://github.com/hoheinzollern/fib-test. Siéntase libre de hacer adiciones si lo desea :)
Además de las reglas habituales que se aplican a los puntos de referencia ... (1) El compilador OCaml * (nativo) * es bastante agresivo y no debe ser seis veces más lento que C cuando se trata de un concepto FP tan importante como la recursividad. ¿Usaste el intérprete de bytecode? (2) ¿Qué configuración de optimización para C? – delnan
¿Ejecutaste varias muestras? ¿Has eliminado los valores atípicos? ¿Promediaste resultados? ¿Mide el tiempo del reloj o el tiempo de CPU? ¿Has oído hablar de estadísticas? :-) – paxdiablo
Lo que me sorprende es el tiempo de ejecución de Java. He visto esto antes ... estaba haciendo un método Quicksort en C y Java, y Java superaba a C todo el tiempo. – Nicholas