MST

星途 面试题库

面试题:Go切片内存逃逸优化策略

假设你有一个频繁创建和使用切片的Go程序,性能出现瓶颈,经分析是由于切片内存逃逸导致,你会从哪些方面着手进行优化?请详细说明优化思路及对应的代码示例。
27.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

优化思路

  1. 预先分配足够内存:在创建切片时,提前根据预计的元素数量分配足够的内存,减少动态内存分配次数。这样可以避免在添加元素过程中因切片容量不足而频繁进行内存重新分配和拷贝。
  2. 复用切片:尽量复用已有的切片,避免每次都创建新的切片。对于临时使用的切片,可以在使用完后重置其长度,以便下次复用。

代码示例

  1. 预先分配足够内存
package main

import (
    "fmt"
)

func main() {
    // 预计有100个元素,提前分配内存
    var data []int
    data = make([]int, 0, 100)
    for i := 0; i < 100; i++ {
        data = append(data, i)
    }
    fmt.Println(data)
}

在上述代码中,make([]int, 0, 100) 预先分配了容纳100个 int 类型元素的内存空间,这样在后续的 append 操作中,只要元素数量不超过100,就不会触发重新分配内存。

  1. 复用切片
package main

import (
    "fmt"
)

var reusableSlice []int

func processData(data []int) {
    // 复用全局的reusableSlice
    reusableSlice = reusableSlice[:0]
    for _, num := range data {
        if num%2 == 0 {
            reusableSlice = append(reusableSlice, num)
        }
    }
    fmt.Println(reusableSlice)
}

func main() {
    originalData := []int{1, 2, 3, 4, 5, 6}
    processData(originalData)
    newData := []int{7, 8, 9, 10}
    processData(newData)
}

在这个示例中,定义了一个全局的 reusableSlice。在 processData 函数中,每次使用前先将其长度重置为0,然后复用该切片来存储处理后的数据。这样避免了每次都创建新的切片,减少了内存分配和垃圾回收的压力。