我一直在研究一些用于数据挖掘的Perl库。这些库充满了嵌套循环,用于收集和处理信息。我正在使用严格模式,我总是在第一个循环之外用my
声明我的变量。例如:
# Pretty useless code for clarity purposes:
my $flag = 1;
my ($v1, $v2);
while ($flag) {
for $v1 (1 .. 1000) {
# Lots and lots of code...
$v2 = $v1 * 2;
}
}
对于我所读到的here,性能方面,最好在循环之外声明它们,然而,我的代码的维护变得越来越困难,因为一些变量的声明最终很漂亮远离他们实际使用的地方。
这样的事情会更容易保持:
my $flag = 1;
while ($flag) {
for my $v1 (1 .. 1000) {
# Lots and lots of code...
my $v2 = $v1 * 2;
}
}
我对Perl没有多少经验,因为我主要使用C ++工作。在某些时候,我想开源我的大多数库,所以我希望它们尽可能地满足所有Perl大师的需求。
从专业的Perl开发人员的角度来看,这些选项之间最合适的选择是什么?
答案 0 :(得分:15)
一般规则是尽可能将每个变量声明为 late 。
如果变量的值不需要在循环的迭代中保持,那么将在循环中声明,或者作为for
循环的循环控制变量。
如果需要在循环迭代中保持静态(如$flag
),则在循环之前立即声明。
是的,如果每次执行一个块时丢弃并重新分配变量,则需要支付最小速度成本,但编程和维护成本是迄今为止最重要的效率,应该始终放在第一位。
在使代码工作并且发现运行速度太慢之前,您不应该优化代码;即便如此,将声明移到文件顶部还是可能会产生有用差异的妥协列表中的很长一段时间。
答案 1 :(得分:4)
优化可读性。这意味着在尽可能小的范围内声明变量。理想情况下,我可以同时看到变量声明和该变量的所有用法。我们只能在头脑中保留非常有限的上下文,因此在其使用附近声明变量使得更容易理解,编写和调试代码。
了解哪种变体表现更好难以估计,难以衡量,因为效果会相当小。但如果性能大致相当,我们也可以使用更易读的变体。
我个人经常尝试用单一赋值形式编写代码,其中不重新赋值变量,并避免使用像push @array, $elem
这样的变换器。这确保了变量的名称及其值始终可以互换,这使得更容易推理代码。这意味着每个变量声明也是一个初始化,它会删除整个类的错误。
答案 2 :(得分:0)
除非您需要在更大的范围内访问答案,否则您应该在准备好定义变量时声明变量。即便如此,明确地将值重新传递也会更容易理解。
答案 3 :(得分:0)
您给出的特定示例(声明循环变量)可能没有性能损失。正如您引用的link所说,性能差异的原因归结为变量是否在循环内初始化。在for循环的情况下,它将以任一方式初始化。
我几乎总是在最里面的范围内声明变量。它减少了犯错的几率。如果性能在特定循环中成为问题,我只会改变它。