MST

星途 面试题库

面试题:Go切片遍历中的性能优化实践

假设你有一个包含大量数据的Go切片,在遍历该切片进行复杂计算时,发现性能较低。请描述你会采取哪些优化措施来提升遍历切片时的性能,并给出相应的代码示例。
46.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

优化措施

  1. 减少内存分配:在遍历过程中尽量避免频繁创建新的对象或分配新的内存。
  2. 并行计算:如果计算任务可以并行化,使用Go的goroutine和channel进行并行处理。
  3. 避免不必要的操作:检查计算逻辑,去除任何不必要的计算或重复计算。
  4. 预分配内存:在创建切片时,预先分配足够的内存,避免在遍历过程中动态扩容。

代码示例

  1. 预分配内存
package main

import "fmt"

func main() {
    // 预分配内存
    data := make([]int, 0, 1000000)
    for i := 0; i < 1000000; i++ {
        data = append(data, i)
    }

    result := make([]int, len(data))
    for i, num := range data {
        // 复杂计算示例
        result[i] = num * num
    }

    fmt.Println(result)
}
  1. 并行计算
package main

import (
    "fmt"
    "sync"
)

func complexCalculation(num int) int {
    // 复杂计算示例
    return num * num
}

func main() {
    data := make([]int, 1000000)
    for i := 0; i < 1000000; i++ {
        data[i] = i
    }

    const numWorkers = 4
    chunkSize := (len(data) + numWorkers - 1) / numWorkers

    var wg sync.WaitGroup
    wg.Add(numWorkers)

    result := make([]int, len(data))

    for i := 0; i < numWorkers; i++ {
        start := i * chunkSize
        end := (i + 1) * chunkSize
        if i == numWorkers-1 {
            end = len(data)
        }

        go func(worker int) {
            defer wg.Done()
            for j := start; j < end; j++ {
                result[j] = complexCalculation(data[j])
            }
        }(i)
    }

    wg.Wait()

    fmt.Println(result)
}