编译优化

关于函数调用开销,也是很多人担心的地方。 我认为有几个点可以交流: 首先,提取函数只是消除重复的一种方式,还有其他的方式,比如以下这个例子:

第二个点是,整洁易维护的代码,更有利于编译优化,比如常量折叠,方法内联等。就是在编译期的时候,像宏展开一样,将函数代码替换到调用的地方去。 对于一些方法提取,缩小了变量的作用域和生命周期,更有利于内存利用。 还有一些运行时优化,比如惰性求值,如果一个函数是纯函数,在输入参数没有变化的情况下,可以直接使用缓存的值,而进行重新运行,不仅没有方法调用,还减少了计算,提升了运行性能。

第三个点是,要看运行的频率。如果是底层代码,运行的频率很高,那可能会牺牲一些可读性换取可维护性,比如使用位运算等。这就要具体场景具体分析,比如咱们写的是编译器,对于大部分用户,是低频次的,但对程序员来说就是高频的,那就要区别对待,可能提供不同的版本或者参数控制。

第四点是,不要过早优化。对于性能优化,要在有工具支撑,数据驱动的方式下进行才最有效。 可能改进一下文件读写策略,算法,缓存,能带来大幅的性能提升,这时就可以忽略函数调用的额外开销。