我花了一些时间来试验 Go 的内部结构,最后我使用切片编写了自己的堆栈实现。正如 reddit 用户在这篇文章中正确指出的那样,正如另一个用户在这个 SO 答案中所概述的那样,Go 已经尝试优化切片调整大小。
然而,事实证明,我宁愿使用我自己的切片增长实现来获得性能提升,而不是坚持使用默认的实现。
这是我用来保存堆栈的结构:
type Stack struct {
slice []interface{}
blockSize int
}
const s_DefaultAllocBlockSize = 20;
这是我自己实现的Push方法
func (s *Stack) Push(elem interface{}) {
if len(s.slice) + 1 == cap(s.slice) {
slice := make([]interface{}, 0, len(s.slice) + s.blockSize)
copy(slice, s.slice)
s.slice = slice
}
s.slice = append(s.slice, elem)
}
这是一个简单的实现
func (s *Stack) Push(elem interface{}) {
s.slice = append(s.slice, elem)
}
运行我使用 Go 的测试包实现的基准测试,我自己的实现是这样执行的:
Benchmark_PushDefaultStack 20000000 87.7 ns/op 24 B/op 1 allocs/op
虽然依靠平原append的结果如下
Benchmark_PushDefaultStack 10000000 209 ns/op 90 B/op 1 allocs/op
我运行测试的机器是 2011 年初的 Mac Book Pro,2.3 GHz Intel Core i5 和 8GB RAM 1333MHz DDR3
编辑 实际的问题是:我的实现真的比默认的追加行为快吗?还是我没有考虑到什么?
胡说叔叔
慕无忌1623718
相关分类