Как «мой» быстрее, чем «местный» в Perl? - PullRequest
12 голосов
/ 30 августа 2010

Цитирование из PerlMonks: разница между моим и локальным ,

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

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

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

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

Ответы [ 2 ]

19 голосов
/ 30 августа 2010

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

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

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

12 голосов
/ 31 августа 2010

local возможно медленнее из-за необходимости сохранить старое значение, но скорость local против 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...