Для этого мы использовали очень простую программу — она вычисляет 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 | - |
-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; }
-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.
#!/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 }
#!/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";
#!/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)
#!/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
#!/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));Спасибо за внимание!