Ради интереса я попытался сравнить производительность стека нескольких языков программирования, вычисляющих ряды Фибоначчи с использованием наивного рекурсивного алгоритма. Код в основном один и тот же на всех языках, я опубликую версию на java:
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])));
}
}
Итак, дело в том, что, используя этот алгоритм с вводом 40, я получил следующие тайминги:
C: 2.796s
Ocaml: 2.372s
Python: 106.407s
Java: 1.336s
C#(mono): 2.956s
Они взяты в коробке Ubuntu 10.04 с использованием версий каждого языка, доступных в официальных репозиториях, на двухъядерной машине Intel.
Я знаю, что у функциональных языков, таких как ocaml, наблюдается замедление, которое происходит из-за того, что функции рассматриваются как граждане первого порядка, и у меня нет проблем с объяснением времени работы CPython, поскольку это единственный интерпретируемый язык в этом тесте, но меня впечатлили время работы java, которое составляет половину c для того же алгоритма! Вы бы отнесли это к JIT-компиляции?
Как бы вы объяснили эти результаты?
EDIT: спасибо за интересные ответы! Я понимаю, что это неправильный тест (никогда не говорил, что это так: P) и, возможно, я смогу сделать лучший вариант и опубликовать его вам в следующий раз, в свете того, что мы обсуждали:)
РЕДАКТИРОВАТЬ 2: Я обновил время выполнения реализации ocaml, используя оптимизирующий компилятор ocamlopt. Также я опубликовал стенд на https://github.com/hoheinzollern/fib-test . Не стесняйтесь добавлять к нему, если хотите:)