2015-08-12 5 views
0

Метод Perl обычно начинается с my $self = shift; и затем использует $self для обозначения объекта, объектом которого он является метод.

sub foo { 
    my $self = shift; 
    $self->method; 
    ... 
    return $self->{_foo} 
} 

Другой способ сделать это состоит в использовании $_[0] непосредственно вместо копирования $_[0] в $self:

sub foo { 
    $_[0]->method; 
    ... 
    return $_[0]->{_foo} 
} 

Теперь, что является более эффективным (быстрее):

  1. выделить памяти к новой переменной $self, выберите первый элемент списка @_ и скопируйте это значение на эту переменную каждый раз, когда a метод вызывается;

  2. для получения первого элемента массива каждый раз, когда используется $_[0]?

+3

Вы ничего не получаете с помощью '$ _ [0] -> метода' с точки зрения скорости (аналогично оптимизации по одиночной или двойной кавычки), только теряя исходную читаемость. –

+0

Такая микро-оптимизация похожа на изменение краски на вашем автомобиле, чтобы ускорить ее работу. Если вы не водитель Формулы-1, разница будет незначительной. – ThisSuitIsBlackNot

ответ

5

Технически, если у вас есть инструменты для сравнительного анализа с достаточным разрешением, использование $_[0] должно быть немного быстрее, по крайней мере, в тех случаях, когда вы используете его один или два раза только в sub. Если вы ссылаетесь на объект несколько раз по тому же методу, $self может вместо этого выиграть из-за большего количества операций с массивами.

И все это абсолютно, совершенно бессмысленно.

Я работаю с Perl в качестве основного языка в течение последних 15 лет. В настоящее время я работаю одним из трех сопровождающих для веб-службы Perl, которая обрабатывает несколько миллионов запросов в день. Если вы добавили разницу во времени обработки между использованием $_[0] или $self в каждом вызове метода при каждом вызове каждой программы Perl, которую я когда-либо касался, это было бы еще, чтобы добавить меньше времени, чем вы потратили, задав вопрос, или я потратил отвечая на него. Наверное, даже меньше времени, чем заставляет меня написать это предложение. Разница на самом деле крошечная.

Оптимизируйте для удобства чтения вместо того, чтобы пытаться оптимизировать производительность. Ваши инженеры по обслуживанию (включая будущее - вы через шесть месяцев) будут вам благодарны.

5

Чистое исполнение мудрое, $_[0] быстрее.

  • Это позволяет избежать создания новой переменной
  • Это позволяет избежать смещения массива @_
  • только стоимость доступа по индексу.

Однако эта разница на самом деле минимальна при вычислении в настоящее время. Первый, как правило, рекомендуется для ясности.