Perl内部和Moose:恒定折叠优化
发布时间:2020-12-15 23:20:38 所属栏目:大数据 来源:网络整理
导读:我一直对Perl执行的常量折叠优化感到好奇,但是当代码中有Moose涉及的机会是不会执行常量折叠时(如果我错了请纠正我). 我有Moose代码,其中包含如下方法: sub foo { my ($self) = shift; my $test_y = $self-pos-[1]; #... if ($self-is_map_val($self-pos-[0
我一直对Perl执行的常量折叠优化感到好奇,但是当代码中有Moose涉及的机会是不会执行常量折叠时(如果我错了请纠正我).
我有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) 解决方法
这与穆斯没有任何关系.在
$x + 32 - 8 评估顺序相当于 ($x + 32) - 8 (即 – 具有相同的优先级并且是左关联的).作为一棵树: (-) / (+) 8 / $x 32 该语法树的任何部分都只有常量节点:$x 32不是常量,PREVIOUS_PART – 8也不是常数.因此,常量折叠(仅在此树级操作,并且无法对树的部分重新排序)看不到任何优化机会. 您确实可以将优化重新排序为32 – 8 $x. perlguts文档常量折叠,并特别声明它通过替换树的部分来操作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |