【发布时间】:2020-09-04 05:20:08
【问题描述】:
在我最近阅读的一个truncate实现中,作者使用以下方式清除截断项:
var nilItems = make(items, 16)
func (s *items) truncate(index int) {
var toClear items
*s, toClear = (*s)[:index], (*s)[index:]
for len(toClear) > 0 {
toClear = toClear[copy(toClear, nilItems):]
}
}
当我需要清除不需要的项目时,我只需遍历切片并将项目一一设置为nil。
我设置了一个简单的benchmark,看来for的循环方式更快。
我想知道使用copy 批量清算有什么好处。
【问题讨论】:
-
我看到基准测试显示相反。 Copy based clear 比 nil by loop 快。
-
nilby 循环可以在某些平台上使用runtime.memclrHasPointers,例如amd64这是一个memclr专业化,并且很难被击败。注意它使用runtime.memclrNoHeapPointers的值类型(例如[]int)。
标签: pointers go slice benchmarking memset