Сравнение скорости языков программирования

Для этого мы использовали очень простую программу — она вычисляет N-тое простое число прямым перебором (текст программы на разных языках можно увидеть ниже).

Результаты сведены в таблицу (это время работы программы в секундах при разных N. Конечно, само по себе оно ничего не значит, но позволяет понять, какая быстрее):

N: 1000 10000 100000 1000000
C - - 0.18 5.84
Pascal - - 0.48 15.78
AWK - 0.16 5.04 -
Perl - 0.27 8.73 -
Python - 0.29 9.52 -
sh 0.17 6.25 190.88 -
Octave 0.40 11.26 380.10 -

C

Ожидаемо, на первом месте оказался Си (мы использовали gcc). Как ни странно, включение оптимизации (-O3) практически не влияло на результат. Вот текст программы:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
int n, x, y;

n = atoi(argv[1]) - 2;
x = 3;
while (n > 0) {
	x += 2;
	y = 3;
	while (x % y != 0) {
		if (y*y > x) {
			n--;
			break;
		}
		y += 2;
	}
}
printf("%i\n", x);
return 0;
}

Pascal

Почётное второе место занимает Паскаль (в данном случае Free Pascal). Аналогично, оптимизация при помощи -O3 ничего не меняет. Впрочем, ничего удивительного в том, что компиляторы побеждают интерпретаторы, нет. Удивительное начинается дальше.
var n, x, y: longint;
    code: integer;

Begin
val(paramstr(1), n, code);
n := n - 2;

x := 3;
while n > 0 do
begin
	x := x + 2;
	y := 3;
	while x mod y <> 0 do
	begin
		if y*y > x then
		begin
			dec(n);
			break;
		end;
		y := y + 2;
	end;
end;

writeln(x);
End.

AWK

И вот сюрприз, третье место с солидным отрывом занимает язык AWK, который вообще-то предназначен для совсем другого. Но однако, он оказывается почти в два раза быстрее всяких там Питонов и Перлов. Кто бы мог подумать...
#!/usr/bin/awk -f

BEGIN {
n = ARGV[1] - 2
x = 3
while (n > 0) {
	x += 2
	y = 3
	while (x % y != 0) {
		if (y*y > x) {
			n--
			break
		}
		y += 2
	}
}
print x
}

Perl

Perl хоть и не намного, но опередил Python...
#!/usr/bin/perl

my $n, $x, $y;

$n = $ARGV[0] - 2;
$x = 3;
while ($n > 0) {
	$x += 2;
	$y = 3;
	while ($x % $y != 0) {
		if ($y*$y > $x) {
			$n--;
			last;
		}
		$y += 2;
	}
}

print $x . "\n";

Python

#!/usr/bin/python
import sys

n = int(sys.argv[1]) - 2
x = 3
while n > 0:
	x += 2
	y = 3
	while x % y != 0:
		if y*y > x:
			n -= 1
			break
		y += 2

print(x)

sh

Да, shell script тоже вполне позволяет вычислять простые числа. Медленно, но работает! Мы использовали dash.
#!/bin/sh

n=$(($1-2))
x=3
while [ $n -gt 0 ]
do	x=$((x+2))
	y=3
	while [ $((x%y)) -ne 0 ]
	do	if [ $((y*y)) -gt $x ]
		then	n=$((n-1))
			break
		fi
		y=$((y+2))
	done
done

echo $x

Octave

А вот и антигерой нашего хит-парада. GNU Octave, казалось бы предназначенная именно для вычислений, заняла уверенное последнее место. Возможно дело в том, что она оптимизирована для вычислений с массивами, а наша программа считает все числа по одному. Впрочем эту гипотезу мы ещё проверим...
#!/usr/bin/octave -q

n = str2num(argv(){1}) - 2;
x = 3;
while n > 0
	x += 2;
	y = 3;
	while mod(x, y) ~= 0
		if y*y > x
			n--;
			break;
		end;
		y += 2;
	end;
end;

disp(sprintf("%d", x));
Спасибо за внимание!