9021大家已经在卷运行时间了,这刚好就是$算法$发展的本质。
“有一堆函数的代码和没有函数调用的代码,哪个运行的更快?”
我们先说结论:没有函数调用的代码运行的更快。但是可读性更差,而且运行速度的差距并不大。
我们可以提出来以下问题:
- 为什么函数的频发调用会导致性能的下降?
- 怎么解决这种性能的下降?
- 什么是内联扩展?
为什么函数的频发调用会导致性能的下降?
函数调用通常涉及将参数压入堆栈、跳转到函数代码、执行函数代码、将返回值放入适当的位置、然后跳回到调用函数的地方。
怎么解决这种性能的下降?
尾递归优化、死代码消除、常量传播和常量折叠、内联拓展等。这一章主要说内联拓展。
什么是内联扩展
维基百科:
Inline expansion is used to eliminate the time overhead (excess time) when a function is called. It is typically used for functions that execute frequently. It also has a space benefit for very small functions, and is an enabling transformation for other optimizations.
内联扩展用于消除调用函数时的时间开销(超额时间)。它通常用于频繁执行的函数。对于非常小的函数来说,它还具有空间优势,并且是一种支持其他优化的转换。
频繁地调用函数可能会导致一些额外的开销,这种开销是由于函数调用时的堆栈操作、参数传递和返回值处理等因素引起的。
为了避免这种开销,编译器会尝试将函数调用处的代码替换为函数体,这个过程称为内联扩展(inline expansion)。
ref:
https://www.jstage.jst.go.jp/article/sptj1978/44/3/44_3_206/_pdf
https://www.semanticscholar.org/search?q=Inline%20expansion&sort=relevance