Как «мой» быстрее, чем «локальный» в Perl?

Цитата из PerlMonks: разница между my и local ,

Но в реальной жизни они работают практически одинаково? Да. В некотором роде Итак, когда вы должны их использовать?

Используйте my, когда можете (это быстрее, чем локально) ...

Я знаю разницу между лексическим и динамическим масштабированием между my и local , как обсуждалось в этой ветке SO , но я не уверен, почему мой "быстрее".

Что именно мы имеем в виду, когда говорим, что переменная my быстрее, чем локальная переменная в Perl? Файл

12
задан Community 23 May 2017 в 12:34
поделиться

2 ответа

Использование local для переменной означает, что ее предыдущее состояние необходимо поместить куда-нибудь в стек и снова восстановить при выходе из локальной области. Использование my для переменной просто создает совершенно новую переменную, которая затеняет предыдущую переменную с тем же именем — предыдущая полностью остается нетронутой, и ее не нужно где-либо сохранять. Он просто ждет, когда локальная область выйдет и снова станет видимой.

Эта запись/извлечение в стек требует ресурсов; под капотом много работы, чтобы убедиться, что это работает правильно. (Рассмотрите такие случаи, как исключение, выдаваемое в локальной области видимости, или выполнение обработчика сигнала. Я уверен, что вы можете придумать и другие.)

Помимо большей эффективности, использование my более логично. Как программисту, вводящему локальную переменную $foo, вам не нужно беспокоиться о семантической причине предыдущей версии $foo, о том, какие данные уже могут быть в ней, или даже о том, была ли переменная $ foo уже создан. Если когда-нибудь в будущем предыдущее объявление $foo будет удалено, ваш локальный код $foo сломается, но мой $foo будет совершенно счастлив. Будьте хорошим программистом и храните свой код в хорошо инкапсулированных частях, что означает максимальное использование лексической области видимости. Вполне возможно написать большое приложение и вообще никогда не нуждаться в переменных пакетной/глобальной области видимости, особенно если вы используете хорошо спроектированные ОО-классы.

19
ответ дан 2 December 2019 в 04:52
поделиться

local, вероятно, медленнее из-за необходимости сохранять старое значение, но скорость local vs my вообще не должна обсуждаться. Экономия скорости мизерная:

           Rate local    my
local 7557305/s    --   -2%
my    7699334/s    2%    --

и особенности этих двух радикально отличаются. Приведенные выше результаты взяты из следующего эталонного теста:

#!/usr/bin/perl

use strict;
use warnings;

use Benchmark;

our $x;

my %subs = (
    local => sub {
        local $x = 42;
        return $x;
    },
    my => sub {
        my $x = 42;
        return $x;
    }
);

for my $sub (keys %subs) {
    print "$sub: ", $subs{$sub}(), "\n";
}

Benchmark::cmpthese -1, \%subs;
12
ответ дан 2 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: