Есть ли исследования Perl 6 для снижения производительности для типов / ограничений?

В отличие от Perl 5, Perl 6 ввел необязательную типизацию, а также ограничения, например:

# Perl 5
sub mySub {
   my $probability = $_[0];
   # Do stuff with $probability
}

# Perl 6 - using optional typing and constraints
sub mySub(Real $probability where 0 < * < 1) {
   # Do stuff with $probability
}

Проводились ли исследования, в ходе которых выяснялось, существуют ли потери производительности и насколько они велики на разных виртуальных машинах Perl 6 при использовании этих возможностей?

Я ищу что-то хорошо спроектированное и кросс-виртуальное.

2 ответа

Самая полная и хорошо разработанная работа по измерению производительности для Perl6- https://github.com/japhb/perl6-bench но она не фокусируется на относительной производительности необязательной типизации. Тем не менее, он поддерживает несколько бэкэндов виртуальных машин, поэтому он может быть хорошим местом для начала.

Этот ответ призван дополнить ответ @donaldh, хотя я также не знаю ни одного исследования, относящегося к ограничениям типов / типов Perl 6.

Быстрая проверка статических типов

Далее компилятор делает Complex ~~ Real проверка типа во время компиляции:

sub mySub(Real $probability where 0 < * < 1) {
    # Do stuff with $probability
}

my Complex \number = 1-2e3i;

mySub number;

Компилируя приведенный выше код, компилятор Rakudo понимает, что number является Complex - так вы получите ошибку проверки типа во время компиляции:

===SORRY!=== Error while compiling

Calling mySub(Complex) will never work with declared signature (Real $probability)

Со временем компиляторы Perl 6, такие как Rakudo, могут улучшить свой анализ кода времени компиляции, что приведет к увеличению проверки типов во время компиляции, как описано выше.

Обратите внимание, что where пункт даже не был опробован. Ноль штрафа за простое указание where статьи. Любые накладные расходы из-за where пункты применяются только в том случае, если переменная / значение проходит проверку основных типов.

Большая часть динамической проверки типов тоже быстрая

Далее компилятор делает Complex ~~ Real проверка типа во время выполнения:

multi sub mySub(Real $probability where 0 < * < 1) {
    # Do stuff with $probability
}

multi sub mySub(Complex $probability) {
    # Do stuff with $probability
}

my \number = 1-2e3i;

mySub number;

Компиляция приведенного выше кода компилятор Rakudo в настоящее время не осознает, что number является Complex во время компиляции. Во время выполнения он считает и отклоняет первый multi sub декларация. Как и прежде, он даже не пытается where пункт. Вместо этого он делает успешный звонок второму multi sub вместо.

Пока приведенные примеры должны прояснить, что для большинства типов проверок есть либо нулевое, либо почти нулевое снижение производительности во время выполнения.

Родные типы

Теоретически, нативные типы могут использоваться для лучшей производительности:

sub foo-Int (Int $a) { my Int $b; $b++ for ^$a }
sub foo-int (int $a) { my int $b; $b++ for ^$a }

my $time;
$time = now; foo-Int my Int $ = 1e6.Int; say now - $time; # 1.0597491
$time = now; foo-int my int $ = 1e6.Int; say now - $time; # 0.7627174

На практике, указание нативного типа иногда замедляет код.

Поскольку оптимизация Ракудо улучшается, int оптимизация относительно Int должно стать более последовательным и более значимым. Аналогичная история применима для других собственных скалярных типов и для собственных массивов.

Типы принуждения

Perl 6 поддерживает "типы принуждения".

Например, Str(Int) принимает любой Int или его подтип и приводит к Str,

Если внутренний тип типа приведения совпадает, то компилятор также будет нести издержки во время выполнения кода приведения.

where статьи

После завершения обычной статической и динамической проверки типа, как описано выше, любые применимые where пункты вызываются до тех пор, пока один из них не преуспеет или все они потерпят неудачу.

Компилятор может свободно анализировать where и понимают, что они эквивалентны достаточно простому выражению статического типа (например, where Int | Str) и использовать эту информацию, чтобы избежать накладных расходов времени выполнения, вызванных выполнением произвольного кода. (ср . размышления Ларри о смежных вопросах.)

Текущий Ракудо не анализирует where статьи. На самом деле, это вызывает where пункты чаще, чем это строго необходимо.

Составители

Производительность является функцией определенных компиляторов / бэкэндов.

Первым заметным компилятором Perl 6, который начался в 2017 году, был Rakudo/MoarVM. В прошлом были другие компиляторы, которые компилировали значительные подмножества Perl 6, и, несомненно, будут снова; они могут предоставить дополнительные данные.

"Необязательный набор текста" против "Постепенного набора текста"

В Perl 6 введена необязательная типизация

В случае, если вы решите поискать в сети соответствующие данные...

Perl 6 поддерживает такие функции, как наследование на основе классов и множественная диспетчеризация. Оба из них технически лишают Perl 6 наличия системы "Опционального набора" в соответствии с определением Википедии.

Википедия вместо этого помещает Perl 6 в широкую категорию "Постепенное печатание", как и Ларри Уолл и doc.perl6.org.

Другие вопросы по тегам