Цитата из PerlMonks: разница между my и local ,
Но в реальной жизни они работают практически одинаково? Да. В некотором роде Итак, когда вы должны их использовать?
Используйте my, когда можете (это быстрее, чем локально) ...
Я знаю разницу между лексическим и динамическим масштабированием между my
и local
, как обсуждалось в этой ветке SO , но я не уверен, почему мой
"быстрее".
Что именно мы имеем в виду, когда говорим, что переменная my
быстрее, чем локальная переменная
в Perl? Файл
Использование local
для переменной означает, что ее предыдущее состояние необходимо поместить куда-нибудь в стек и снова восстановить при выходе из локальной области. Использование my
для переменной просто создает совершенно новую переменную, которая затеняет предыдущую переменную с тем же именем — предыдущая полностью остается нетронутой, и ее не нужно где-либо сохранять. Он просто ждет, когда локальная область выйдет и снова станет видимой.
Эта запись/извлечение в стек требует ресурсов; под капотом много работы, чтобы убедиться, что это работает правильно. (Рассмотрите такие случаи, как исключение, выдаваемое в локальной области видимости, или выполнение обработчика сигнала. Я уверен, что вы можете придумать и другие.)
Помимо большей эффективности, использование my
более логично. Как программисту, вводящему локальную переменную $foo, вам не нужно беспокоиться о семантической причине предыдущей версии $foo, о том, какие данные уже могут быть в ней, или даже о том, была ли переменная $ foo уже создан. Если когда-нибудь в будущем предыдущее объявление $foo будет удалено, ваш локальный код $foo
сломается, но мой $foo
будет совершенно счастлив. Будьте хорошим программистом и храните свой код в хорошо инкапсулированных частях, что означает максимальное использование лексической области видимости. Вполне возможно написать большое приложение и вообще никогда не нуждаться в переменных пакетной/глобальной области видимости, особенно если вы используете хорошо спроектированные ОО-классы.
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;