tv1*_*902 2 perl constants subroutine
我刚开始学习perl,我知道,常量在perl中被视为子例程。我不知道为什么为什么每次使用常量时都使用常数是一个好习惯,而CPU需要使用堆栈/跳转指令?
这是一个合理的考虑,但实际上没有函数调用开销。
首先让我们看一下恒定的实用文档
在表达式中使用常量时,Perl在编译时将其替换为其值,然后可以进一步优化表达式。特别是,如果常量为false,则if(CONSTANT)块中的任何代码都将被优化。
因此,您无需在运行时为函数调用付费。
此外,根据Technical Notes它说
在当前的实现中,标量常量实际上是可插入的子例程。从Perl的5.004版本开始,直接插入适当的标量常量来代替某些子例程调用,从而节省了子例程调用的开销。有关如何以及何时发生这种情况的详细信息,请参见 perlsub中的常量函数。
我们应该注意“ 当前实现 ”一词,但是我认为可以安全地避免这种改变不会对运行时间造成影响。
请阅读本节的其余部分,并确保查看警告。
具有原型的函数
()可能是内联的候选对象。如果优化和常量折叠后的结果是常量或没有其他引用的词法范围标量,则将使用它代替不带的函数调用&。使用&进行的呼叫永远不会内联。(见constant.pm一种简单的方法来声明最常量。)
这证实了通常在效率上是明智的。
另一方面,请注意,使用constant编译指示可能会引起疑问:在代码中使用裸字是否值得关注(它可能会或可能不会)。
“良好做法”考虑了对不应该更改的变量使用常量(只读)声明的编程好处。这种做法通常会大大改善代码。
| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |