gpt4 book ai didi

performance - 结构 slice 与指向结构的指针 slice

转载 作者:IT老高 更新时间:2023-10-28 12:58:45 24 4
gpt4 key购买 nike

我经常使用结构 slice 。以下是此类结构的示例:

type MyStruct struct {
val1, val2, val3 int
text1, text2, text3 string
list []SomeType
}

所以我将 slice 定义如下:

[]MyStruct

假设我有大约一百万个元素,我正在大量使用 slice :

  • 我经常添加新元素。 (元素总数未知。)
  • 我时不时地对其进行排序。
  • 我也会删除元素(虽然不如添加新元素那么多)。
  • 我经常阅读元素并将它们传递(作为函数参数)。
  • 元素本身的内容不会改变。

我的理解是,这会导致实际结构的大量改组。另一种方法是创建一个指向结构的指针 slice :

[]*MyStruct

现在结构保持在原来的位置,我们只处理我认为占用空间较小的指针,因此会使我的操作更快。但现在我要给垃圾收集器做更多的工作。

  • 您能否提供有关何时直接使用结构以及何时使用指向结构的指针的一般准则?
  • 我应该担心留给 GC 的工作量吗?
  • 复制结构与复制指针的性能开销是否可以忽略不计?
  • 也许一百万个元素并不多。当 slice 变得更大时(当然,仍然适合 RAM),这一切会如何变化?

最佳答案

我自己只是对此感到好奇。跑了一些基准测试:

type MyStruct struct {
F1, F2, F3, F4, F5, F6, F7 string
I1, I2, I3, I4, I5, I6, I7 int64
}

func BenchmarkAppendingStructs(b *testing.B) {
var s []MyStruct

for i := 0; i < b.N; i++ {
s = append(s, MyStruct{})
}
}

func BenchmarkAppendingPointers(b *testing.B) {
var s []*MyStruct

for i := 0; i < b.N; i++ {
s = append(s, &MyStruct{})
}
}

结果:

BenchmarkAppendingStructs  1000000        3528 ns/op
BenchmarkAppendingPointers 5000000 246 ns/op

要点:我们在纳秒内。对于小片来说可能可以忽略不计。但是对于数百万次操作来说,这是毫秒和微秒之间的差异。

顺便说一句,我尝试使用预先分配的 slice (容量为 1000000)再次运行基准测试,以消除 append() 定期复制底层数组的开销。附加结构下降了 1000ns,附加指针根本没有改变。

关于performance - 结构 slice 与指向结构的指针 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27622083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com