Просто для удовольствия я попытался сравнить производительность стека с несколькими языками программирования, вычисляющими ряды Фибоначчи, используя наивный рекурсивный алгоритм. Код в основном одинаковы во всех языках, я выложу версию 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), и, может быть, я смогу сделать лучшее и отправить его вам в следующий раз, в свете того, что мы обсудили :)
EDIT 2 : Я обновил среду выполнения ocaml, используя оптимизирующий компилятор ocamlopt. Также я опубликовал стенд на https://github.com/hoheinzollern/fib-test. Не стесняйтесь делать дополнения к нему, если хотите :)
Помимо обычных правил, применяемых к эталонам ... (1) Компилятор OCaml * (native) * довольно агрессивен и не должен быть в шесть раз медленнее C, имея дело с такой важной концепцией FP как рекурсия. Вы использовали интерпретатор байт-кода? (2) Какие параметры оптимизации для C? – delnan
Вы выполнили несколько образцов? Вы удалили выбросы? Получили ли вы средние результаты? Вы измеряли время или время процессора? Вы даже заметили статистику? :-) – paxdiablo
То, что меня удивляет, - это время работы java. Я видел это раньше ... делал метод Quicksort на C и Java, а Java превосходил C каждый раз. – Nicholas