我've been working on some Perl libraries for data mining. The libraries are full of nested loops for gathering and processing information. I'使用严格模式,我总是在第一个循环之外用 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开发人员的角度来看,这些选项之间最合适的选择是什么?
4 回答
除非需要在更大的范围内访问答案,否则应在准备好定义变量时声明变量 . 即便如此,明确地将值重新传递也会更容易理解 .
一般规则是尽可能晚地声明每个变量 .
如果变量的值不需要在循环的迭代中保持,则在循环内声明它,或者作为
for
循环的循环控制变量 .如果需要在循环迭代中保持静态(如
$flag
),则在循环之前立即声明它 .是的,如果每次执行一个块时丢弃并重新分配变量,则需要支付最低的速度成本,但编程和维护成本是迄今为止最重要的效率,应始终放在首位 .
在使代码工作并且发现运行速度太慢之前,您不应该优化代码;即使这样,将声明移动到文件的顶部也是可能产生有用差异的妥协列表的很长一段路 .
优化可读性 . 这意味着在尽可能小的范围内声明变量 . 理想情况下,我可以同时看到变量声明和该变量的所有用法 . 我们只能在头脑中保留非常有限的上下文,因此声明接近其使用的变量使得更容易理解,编写和调试代码 .
了解哪种变体表现更好难以估计,难以衡量,因为效果会相当小 . 但如果性能大致相当,我们也可以使用更易读的变体 .
我个人经常尝试在单个赋值形式中编写代码,其中变量不会被重新分配,并且避免使用像_876162这样的变换器 . 这确保了变量的名称及其值始终可以互换,这使得更容易推理代码 . 这意味着每个变量声明也是一个初始化,它会删除整个类的错误 .
您给出的特定示例(声明循环变量)可能没有性能损失 . 正如您引用的link所说,性能差异的原因归结为变量是否在循环内初始化 . 在for循环的情况下,它将以任一方式初始化 .
我几乎总是在最里面的范围内声明变量 . 它减少了犯错的几率 . 如果性能在特定循环中成为问题,我只会改变它 .