给定的常量作为子例程实现,考虑到性能开销,使用它们实际上是一个好习惯吗? [已关闭]

问题描述 投票:0回答:1

我刚开始学习perl,我开始知道,constant在perl中被视为子程序。我想知道如果每次都在调用子程序并且CPU需要使用堆栈/跳转指令,为什么使用常量是一个很好的做法?

perl constants subroutine
1个回答
5
投票

这是一个合理的担忧,但实际上没有函数调用开销。

让我们首先看一下constant pragma文档

当表达式中使用常量时,Perl 在编译时将其替换为其值,然后可以进一步优化表达式。特别是,如果常量为 false,则 if (CONSTANT) 块中的任何代码都将被优化。

因此您无需为运行时的函数调用付费。

此外,在

Technical Notes
下它说

在当前的实现中,标量常量实际上是可内联的子例程。从 Perl 5.004 版本开始,直接插入适当的标量常量来代替某些子例程调用,从而节省了子例程调用的开销。看 perlsub 中的常量函数 了解有关如何以及何时发生这种情况的详细信息。

我们应该注意“当前实现”短语,但我认为可以安全地期望它不会以会施加运行时惩罚的方式改变。

请阅读本节的其余部分,并确保看到注意事项

提到的perlsub中的常量函数描述了

具有

()
原型的函数是内联的潜在候选者。如果优化和常量折叠之后的结果是常量或没有其他引用的词法范围标量,那么它将用于代替没有
&
的函数调用。使用
&
进行的调用永远不会内联。 (有关声明大多数常量的简单方法,请参阅 constant.pm。)

这证实了人们通常具有良好的效率。

另一方面,请注意,使用

constant
编译指示可能会引发您的代码中是否需要考虑使用裸字的问题(可能会也可能不会)。

“良好实践”涉及对不应更改的变量使用常量(只读)声明的编程好处。这种做法通常会大大改善代码。

© www.soinside.com 2019 - 2024. All rights reserved.