有效地保留最后N个推送项目的集合

问题描述 投票:0回答:1

鉴于:

  1. 具有预先知道容量的切片
  2. 切片的容量和数量很大,将使用大约15MB的内存,所以我不想浪费内存并希望保持最小的内存。
  3. 将通过删除第一个元素并将新元素添加到切片的末尾来更新切片。

b = append(b[1:], n)将增加容量

我写道,为了转移和分配自己

func shiftAndPut(a []int, n int) (b []int) {
    b = make([]int, cap(a), cap(a))
    for i,v := range(a[1:]) {
        b[i] = v
    }
    b[len(b)-1] = n
    return
}

https://play.golang.org/p/7xIBh0UPp2w

它保持容量相同,但需要各种计算

  1. 迭代切片一次,
  2. 召唤功能,
  3. 小时间的新变量,
  4. 范围函数中的子切片,增加了更多的计算,
  5. 等等

有没有更优化的方法来做到这一点?

arrays go memory slice
1个回答
1
投票

切片环缓冲区,自定义实现:

data := make([]int, cap, cap)
pointer := 0

data[pointer] = newData
pointer = (pointer+1) % cap

qazxsw poi包实施:

custom/ring

在评论帖中提出建议后,我在data := ring.New(cap) data.Value = newData data = data.Next() benchmark之间做了slice custom shifting

custom/ring

使用变量(指针或标志)的自定义切片移位更快,并且还优化了内存。

© www.soinside.com 2019 - 2024. All rights reserved.