LINUX.ORG.RU

История изменений

Исправление Darth_Revan, (текущая версия) :

Я чуть подправил один из них, чтобы быть ближе к первому, и разница нивелировалась.

С моей точки зрения, ты дал интерпретатору возможность просто проигнорировать код.
После чего я решил доработать скрипты, чтобы они делали какую-нибудь номинальную работу более честно. И разница вернулась.

для технической беседы

Это Talks %).

Какой именно тезис ты хочешь показать? То, что ты ждёшь, пока скрипт будет выполняться быстрее? Уже было показано, что дождался.

Именно так. И нет, не дождался.

На замечание, что вызов $*ERR имеет свою цену, кстати, можно довольно нехитро ответить:

#!/usr/bin/env perl
use v5.12;
use warnings;
use Time::HiRes qw(clock_gettime CLOCK_MONOTONIC);

sub main :prototype() {
    my $init_time = clock_gettime(CLOCK_MONOTONIC);
    my $file = *STDERR;
    for (my $i = 0; $i < 10_000; ++$i) {
        for (my $j = 0; $j < 10_000; ++$j) {
            $file->flush();
        }
    }
    my $now_time = clock_gettime(CLOCK_MONOTONIC);
    say STDERR sprintf("%.3fs", $now_time - $init_time);
}
main();
#!/usr/bin/env rakudo
use v6;

sub MAIN() {
    my $file := $*ERR;
    loop (my int $i = 0; $i < 10_000; ++$i) {
        loop (my int $j = 0; $j < 10_000; ++$j) {
            $file.flush();
        }
    }
    note sprintf("%.3fs", now - INIT now);
}
$ ./looping_lots.pl
21.570s
$ ./looping_lots.raku
117.365s

Исходная версия Darth_Revan, :

Я чуть подправил один из них, чтобы быть ближе к первому, и разница нивелировалась.

С моей точки зрения, ты дал интерпретатору возможность просто проигнорировать код.
После чего я решил доработать скрипты, чтобы они делали какую-нибудь номинальную работу более честно. И разница вернулась.

для технической беседы

Это Talks %).

Какой именно тезис ты хочешь показать? То, что ты ждёшь, пока скрипт будет выполняться быстрее? Уже было показано, что дождался.

Именно так. И нет, не дождался.

На замечание, что вызов $*ERR имеет свою цену, кстати, можно довольно нехитро ответить:

#!/usr/bin/env perl
use v5.12;
use warnings;
use Time::HiRes qw(clock_gettime CLOCK_MONOTONIC);

sub main :prototype() {
    my $init_time = clock_gettime(CLOCK_MONOTONIC);
    my $file = *STDERR;
    for (my $i = 0; $i < 10_000; ++$i) {
        for (my $j = 0; $j < 10_000; ++$j) {
            $file->flush();
        }
    }
    my $now_time = clock_gettime(CLOCK_MONOTONIC);
    say STDERR sprintf("%.3fs", $now_time - $init_time);
}
main();
#!/usr/bin/env rakudo
use v6;

sub MAIN() {
    my $file := $*ERR;
    loop (my int $i = 0; $i < 10_000; ++$i) {
        loop (my int $j = 0; $j < 10_000; ++$j) {
            $file.flush();
        }
    }
    note(sprintf("%.3fs", now - INIT now))
}
$ ./looping_lots.pl
21.570s
$ ./looping_lots.raku
117.365s