> For the complete documentation index, see [llms.txt](https://gocompiler.shizhz.me/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://gocompiler.shizhz.me/8.-golang-bian-yi-qi-inline/8.1-jian-jie.md).

# 8.1 简介

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

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

```go
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 之后代码为：

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

    return s
}
```

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

```go
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 循环体内重复计算。
