Почему разница в производительности в + = против +? - PullRequest
14 голосов
/ 21 марта 2019

Отладка некоторого кода закончилась проверкой различий в таких выражениях, как $counter=$counter + 1; против $counter+=1;

my $run=True;
my $counter=0;
my $sup=Supply.interval(1);
my $tap= $sup.tap({
    $run=$_ < 10;
});
{
    while $run {
        #$counter+=1;
        $counter=$counter + 1;
    }
    $tap.close;
    say "Iterations per second: {$counter/(now - ENTER now)}"; #
}

Я получаю примерно на 20% больше итераций в секунду для $counter=$counter+1 по сравнению с $counter+=1;

Что происходит на фоне, который так отличается?

РЕДАКТИРОВАТЬ:

Интересно, что при попытке это с массивом и гипероператорами производительностьзначительно увеличивается при использовании +=.

например @counter=@counter>>+<<@value; против @counter>>+=<<@value; Я получаю примерно в 2,8 раза итерации цикла, используя >>+=<< с массивами из 10_000 элементов.

Насколько я могу судить через time cmd, минимальное параллельное выполнение в любом случае минимально (общее количество пользователей + система находится в пределах 2% от реального времени).

Любое понимание того, как / почему это было бы здорово.Спасибо!

1 Ответ

16 голосов
/ 21 марта 2019

Я настроил ваш тест на:

my $a = 0; for ^10_000_000 { $a += 1 }

против:

my $a = 0; for ^10_000_000 { $a = $a + 1 }

Если вы запустите эти примеры в профилировщике с помощью perl6 --profile -e '...', вы увидите, чторазница действительно в диапазоне 20%.Единственное, что действительно отличается, это общее количество кадров: 49935579 для += 1 и 39932197 для = $a + 1.

Основная разница (до какой-либо оптимизации) заключается в том, что += проходитметаопуть.Он не определен как отдельный оператор, поэтому он должен создавать оператор на лету, принимая в качестве параметра исходный оператор (&infix:<+>) и создавая из него Callable.

FWIW,Я рад видеть, что в настоящее время разница составляет всего 20%: это было не так давно, когда что-либо, связанное с метаопами, было как минимум в 2 раза медленнее: -)

...