perl - 如何在不牺牲性能的情况下保持良好的代码组织?

标签 perl performance code-organization

我赞成这样的观点,即变量不应该在您要使用它们之前进行初始化。如果变量是由将使用它的代码来表示的,那么它可以更容易地记住变量代表什么,并且它减少了变量在初始化和正确使用之间被滥用的可能性。

当在一两个循环中使用该变量时就会出现问题。然后,初始化成本成倍增加,并且可能开始影响性能。

在 Perl 中(或通常,视情况而定),是否有任何精巧的小技巧允许您将变量的初始化放在循环中,但只在第一次传递时初始化?

我想到了这样的事情:

my $variable = undef;
while ($outer_loop) {
    while ($inner_loop) {
       $variable = $variable || 'initial_value'
    }
}

注意:这意味着 $variable 不会在循环内重新分配。

现在也许是我,但这似乎有点不雅。

那么,这是我的问题:是否有更简洁的方法来做到这一点,或者我是否只需要克制自己并在代码组织上妥协,或者吸收上面那个“不雅”的解决方案?

最佳答案

要解决您评论中的问题(变量在函数中计算):

  • 用于优化您想要的这种逻辑的标准技术称为内存(针对该函数)。在其他方法中,Perl 有 Memoize 模块,或者您可以自己做。

      use Memoize;
      memoize('slow_function');
      while ($outer_loop) {
          while ($inner_loop) {
              my $variable = slow_function(arguments);
          }
      }
    
  • 此外,如果函数在整个循环中始终产生 100% 相同的值(按设计),只需通过在循环之前的语句中初始化变量来执行穷人内存。

    如果你有一个 3 页长的循环(例如,与循环内部相比,在循环之前进行初始化是一个可读性问题),那么你的编码问题不仅仅是初始化行的位置,并且需要首先重构您的代码。

    顺便说一句,如果您唯一关心的是将变量放在循环之前,它会破坏“此变量仅供在此循环内使用”的可读性上下文,您可以通过以下任一方式轻松解决:

    • 拥有良好记录的代码 - 相应地命名变量,或向初始化行添加注释,或两者兼而有之。

    • 或者,通过将变量命名为 my $default_value_for_next_loop = long_func(); ,并在循环内部实际创建一个本地循环变量,并从中初始化:my $loop_var = $default_value_for_next_loop;

此外,就您自己的方法而言 ($variable = $variable || 'initial_value';); 我个人认为绝对优雅且可读,但是!!!我很确定它实际上比直接 $variable = $default_value_for_next_loop; 执行更差,因为它有一个条件语句而不是直接赋值。但如果不进行基准测试,我无法确定。

关于perl - 如何在不牺牲性能的情况下保持良好的代码组织?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4683857/

相关文章:

Perl Redis 监听不订阅 channel

perl 一行只保留所需的行

perl - 在 Perl 中,如何向操作系统释放内存?

performance - 在 F# 中有效地投影列表列表

performance - 带有矢量图层的 Leaflet.js 非常慢

php - 在哪里放置实体的额外辅助函数

django - 为什么 django 强制所有模型类都在 models.py 中?

multithreading - Perl线程缓慢消耗内存

ASP.NET ReportViewer 在本地模式下非常慢

ios - 如何在 Objective-C 中定义 API Url