Производительность стека в языках программирования

Ради интереса я попытался сравнить производительность стека нескольких языков программирования, вычисляющих ряды Фибоначчи с использованием наивного рекурсивного алгоритма. Код в основном один и тот же на всех языках, я опубликую версию на 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 . Не стесняйтесь добавлять к нему, если хотите:)

8
задан hoheinzollern 8 November 2010 в 23:40
поделиться