2 回答
TA贡献1804条经验 获得超8个赞
我相信你的例子更快,因为你有一个相当小的数据集,并且初始容量为 0。在你的 append 版本中,你通过更早地(到 20 岁)增加块大小来抢占大量分配,从而绕过(在这种情况下)昂贵的重新分配,带您完成所有那些微不足道的小容量 0,1,2,4,8,16,32,64 等
如果您的数据集大得多,这可能会因大副本的成本而被边缘化。我在 Go 中看到了很多对切片的误用。通过使您的切片具有合理的默认容量,可以获得明显的性能优势。
TA贡献1744条经验 获得超4个赞
阅读您的代码、测试、基准和结果,很容易看出它们是有缺陷的。完整的代码审查超出了 StackOverflow 的范围。
一个特定的错误。
// Push pushes a new element to the stack
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)
}
应该
// Push pushes a new element to the stack
func (s *Stack) Push(elem interface{}) {
if len(s.slice)+1 == cap(s.slice) {
slice := make([]interface{}, len(s.slice), len(s.slice)+s.blockSize)
copy(slice, s.slice)
s.slice = slice
}
s.slice = append(s.slice, elem)
}
复制切片
该函数将copy切片元素从源复制src到目标,dst并返回复制的元素数。复制的元素的数目是最小len(src)和len(dst)。
你复制了0,你应该复制len(s.slice)。
正如预期的那样,您的推送算法非常慢:
append:
Benchmark_PushDefaultStack-4 2000000 941 ns/op 49 B/op 1 allocs/op
alediaferia:
Benchmark_PushDefaultStack-4 100000 1246315 ns/op 42355 B/op 1 allocs/op
这是如何append工作的:追加复杂性。
还有其他一些错误。您的基准测试结果通常无效。
- 2 回答
- 0 关注
- 232 浏览
添加回答
举报