2013-09-02 10 views
4

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

У меня есть лосей код, который содержит метод, как показано ниже:

sub foo { 
    my ($self) = shift; 
    my $test_y = $self->pos->[1]; 
    #... 
    if ($self->is_map_val($self->pos->[0]+8, $test_y+32) || 
     $self->is_map_val($self->pos->[0]+32-8, $test_y+32)) { 
    { 
     heavy_stuff(); 
    } 
    #... 
} 

и когда я бегу perl -MO=Deparse ./program.pl я получаю почти идентичную строку кода:

if ($self->is_map_val($self->pos->[0] + 8, $test_y + 32) or  
    $self->is_map_val($self->pos->[0] + 32 - 8, $test_y + 32)) 
{ 
    heavy_stuff(); 
} 

Интересно, почему Perl не оптимизировать 32-8 как 24? Есть ли какие-то реальные причины, по которым Perl этого не делал (может быть, подсистема Moose делает жизнь сложнее?).

Если это поможет, я бегу Perl (v.5.14.2)

ответ

7

Это не имеет ничего общего с Муз. В

$x + 32 - 8 

порядок оценки эквивалентно

($x + 32) - 8 

(т.е. + и - имеют одинаковый уровень приоритета и левоассоциативной). Как дерево:

(-) 
    /\ 
    (+) 8 
/\ 
$x 32 

Никакая часть этого синтаксического дерева имеет только постоянные узлы: $x + 32 не является постоянной величиной, а PREVIOUS_PART - 8 не является постоянным либо. Поэтому постоянная сворачивание (которая работает только на этом уровне дерева и не может изменять порядок частей дерева) не видит никаких шансов для оптимизации.

Вы получаете оптимизацию, которую вы переупорядочиваете до 32 - 8 + $x.

perlguts Документ постоянный складной и, в частности, заявляет, что он работает, заменяя части дерева.

+0

спасибо, это очень помогает. Но в моем случае я не перегружал оператора добавления. – varnie

+0

@varnie Я забыл, что Perl не сильно беспокоится о перегрузке для постоянного складывания. Это всего лишь деталь реализации того, как осуществляется постоянное свертывание. Он просто не видит, что '32 - 8' постоянна – amon