与内联代码相比,调用子例程是否会带来显着的性能损失?

Bil*_*ill 4 perl performance

老问题 - 我不知道 Perl 的运行效率如何。

我有一组 if/elsif/else 语句,用于处理报告中不同数据类型的数据行。我发现如果使用子例程调用而不是可变大小的内联代码块,则更容易阅读和查看代码。

一些较旧的语言在处理调用方面有很大的惩罚,因此内联包含短例程而不是调用它们会更快。我不需要在调用时传递变量。正在读取的行包含所有数据,并且重要的项目被放入变量中以供稍后处理。

可能不是关键的知识,但我努力使我的程序高效且可读。我已经有了 if 链,因此首先检查最常见的 if 。

我已经内联编写了代码。我无法实际测量它的运行速度。由于它每 15 分钟处理一次,因此我不想再不必要地占用文件。

tob*_*ink 6

Perl 子调用比大多数编程语言中的函数调用有更多的开销,但是与文件 IO、网络访问等相比,它仍然是相对较小的开销。除非您调用一个函数数千次,否则内联它没有什么优势。

你提到的一件事对我来说很突出:

我不需要在调用时传递变量。

这实际上为您提供了显着的优化可能性。

不要调用处理该行的函数为foo(),而是将其调用为&foo(带有&号且不带括号)。@_当以这种方式调用函数时,这是向 Perl 发出的信号,表明该函数不带参数,因此 Perl 将避免在调用过程中设置新数组。这节省了一点开销。

(副作用是该函数现在能够看到其调用者的@_数组!)

  • `goto &foo` 比常规函数调用慢,但可以保存堆栈帧,这在深度递归函数中非常有用。`&foo` 比常规函数调用快大约 20-40%。当然,这只是节省了调用本身的时间 - 它不会使函数体运行得更快。 (2认同)