Мне было интересно, как оптимизировать постоянную складку, которую выполняет 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)
спасибо, это очень помогает. Но в моем случае я не перегружал оператора добавления. – varnie
@varnie Я забыл, что Perl не сильно беспокоится о перегрузке для постоянного складывания. Это всего лишь деталь реализации того, как осуществляется постоянное свертывание. Он просто не видит, что '32 - 8' постоянна – amon