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