2014-01-24 82 views
4

我一直在研究一些用于数据挖掘的Perl库。这些库充满了用于收集和处理信息的嵌套循环。我正在使用严格模式,并且我总是在第一个循环之外用my声明我的变量。例如:在Perl中声明变量内部或外部的循环,最佳实践

# 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

如果这两者之间的性能差异实际上很重要,那么您应该使用C.为了可维护性,您已经发现'for $ foo'更好;尽可能在有限的范围内声明事物。 – ThisSuitIsBlackNot

回答

14

一般规则是尽可能将每个变量声明为后期

如果一个变量的值并不需要保持整个循环的迭代然后声明它内部环路,或作为用于for循环的循环控制变量。

如果需要在整个循环迭代中保持静态(如$flag),则在之前立即声明循环。

对了,还有,如果你放弃,并在每次执行块的时间重新分配一个变量,但编程和维护成本是目前最重要的效率,并应始终先放最小速度的成本支付。

在开始工作之前,您不应该优化您的代码,并发现运行速度太慢;即使如此,将声明移动到文件的顶部也是可能产生有益差异的妥协列表的很长一段路要走。

4

优化可读性。这意味着在尽可能小的范围内声明变量。理想情况下,我可以同时看到变量声明和变量的所有用法。我们只能在头脑中保留非常有限的上下文,因此在其使用附近声明变量使得更易于理解,编写和调试代码。

了解什么变体更好地执行很难估计,并且难以测量,因为效果会很小。但是,如果性能大致相当,我们不妨使用更易读的变体。

我个人经常尝试编写单一赋值表单中的代码,其中变量未被重新分配,并且避免了类似push @array, $elem的变体。这确保了变量的名称和它的值总是可以互换的,这使得更容易推理代码。这意味着每个变量声明也是一个初始化,它将删除整个类的错误。

+0

我明白你在说什么,但最后一段的例子会有所帮助。 – Borodin

+0

是的......你也把那段las段落给了我。 – calvillo

+2

@calvillo:什么意思是他从不*改变变量的值。如果需要从变量派生的值,那么他使用一个新变量。但我不明白这是如何与像数组和哈希聚合变量一起工作。分配一个完整的数组并且永远不要改变它看起来并不实际,除了明智地使用'map',它可以轻松地混淆代码的目的。 – Borodin

0

当你准备好定义变量时,你应该声明变量,除非你需要在更大范围内访问答案。即使将值明确地传回,也会更容易遵循。

0

您给出的特定示例(声明循环变量)可能不会影响性能。正如您所引用的link所说,性能差异的原因归结为变量是否在循环内初始化。在for循环的情况下,它将以任何方式初始化。

我几乎总是在最内层的范围内声明变量。它减少了犯错的几率。如果性能在特定的循环中成为问题,我只会改变这一点。

相关问题