我刚开始学习perl,我知道,常量在perl中被视为子例程。我不知道为什么为什么每次都在使用子例程调用并且CPU需要使用堆栈/跳转指令时使用常量是一种好习惯?
答案 0 :(得分:5)
这是一个合理的问题,但实际上没有函数调用开销。
首先让我们看看constant pragma文档
在表达式中使用常量时,Perl在编译时将其替换为其值,然后可以进一步优化表达式。特别是,如果常量为false,则if(CONSTANT)块中的任何代码都会被优化。
因此,您不必在运行时为函数调用付费。
进一步,在class NewUserForm(UserCreationForm):
email = forms.EmailField(required=True)
class Meta:
model = User
fields = ("username", "email", "password1", "password2")
def save(self, commit=True):
user = super(NewUserForm, self).save(commit=False)
user.email = self.cleaned_data['email']
if commit:
user.save()
return user
下,
在当前实现中,标量常量实际上是可插入的子例程。从Perl的5.004版本开始,直接插入适当的标量常量来代替某些子例程调用,从而节省了子例程调用的开销。看到 Constant Functions in perlsub,了解发生这种情况的方式和时间。
我们应该注意“ 当前实现”一词,但是我认为可以肯定的是,这种变化不会以造成运行时损失的方式发生变化。
请阅读本节的其余部分,并确保查看Caveats。
提到的Constant Functions in perlsub描述
原型为
Technical Notes
的函数可能是内联的候选对象。如果优化和常量折叠后的结果是常量或没有其他引用的词法范围标量,则将使用该结果代替不使用()
进行的函数调用。使用&
进行的呼叫永远不会内联。 (有关声明大多数常量的简便方法,请参见 constant.pm 。)
这确认了一般来说,效率是明智的。
另一方面,请注意,使用&
编译指示可能会引发疑问:在代码中是否应该使用裸字(可能不是)。
“好的做法”考虑了对不变的变量使用常量(只读)声明的编程好处。这种做法可以大大改善代码。