8.1 简介

函数调用的上下文切换存在固定的额外开销,如果程序中存在大量的函数调用,则势必会影响程序的执行性能。而上下文切换的开销是基本固定的,所以相对于函数的总体执行开销,小函数上下文切换所占的比重更大。因此减少程序中的小函数调用,是优化程序性能的重要方向。

Inline(内联)便是这样的一种技术,其用函数体替换掉函数调用,例如如下代码:

func sum(base, i int) int {
    return 100/base + i
}

func doSum(base int, ints []int) int {
    var s int
    for _, val := range ints {
        s += sum(base, val)
    }

    return s
}

Inline 之后代码为:

func doSum(base int, ints []int) int {
    var s int
    for _, val := range ints {
        s += 100/base + val
    }

    return s
}

这样我们就去掉了所有对函数 sum 的调用。不仅如此,编译器还可以对 Inline 之后的代码做进一步的优化,例如上述代码中, 100/base 在每次循环中都不会改变,因此编译器可以引入一个局部变量做进一步优化:

func doSum(base int, ints []int) int {
    var s int
    baseTemp := 100 / base
    for _, val := range ints {
        s += baseTemp + val
    }

    return s
}

这样 100/base 只需要计算一次,而不用在每个 for 循环体内重复计算。

最后更新于