我编写了这个函数uniq,它接受 s 的排序切片int并返回删除了重复项的切片:
func uniq(x []int) []int {
i := 0
for i < len(x)-1 {
if x[i] == x[i+1] {
copy(x[i:], x[i+1:])
x = x[:len(x)-1]
} else {
i++
}
}
return x
}
和uniq2,重写uniq具有相同的结果:
func uniq2(x []int) []int {
i := 0
l := len(x)
for i < l-1 {
if x[i] == x[i+1] {
copy(x[i:], x[i+1:])
l--
} else {
i++
}
}
return x[:l]
}
这两个函数之间的唯一区别是,在 中,我不是每次都uniq2切片x 和直接访问,而是保存到一个变量 并在每次移动切片时递减它。len(x)len(x)l
我认为这uniq2会比uniq 因为len(x)不再称为迭代要快一点,但实际上,它慢得莫名其妙。
通过这个生成随机排序切片并调用uniq/ uniq21000 次的测试,我在 Linux 上运行它:
func main() {
rand.Seed(time.Now().Unix())
for i := 0; i < 1000; i++ {
_ = uniq(genSlice())
//_ = uniq2(genSlice())
}
}
func genSlice() []int {
x := make([]int, 0, 1000)
for num := 1; num <= 10; num++ {
amount := rand.Intn(1000)
for i := 0; i < amount; i++ {
x = append(x, num)
}
}
return x
}
$ go build uniq.go
$ time ./uniq
uniq通常需要5--6秒才能完成。whileuniq2慢两倍多,需要 12--15 秒。
为什么我将切片长度保存到变量的地方比我直接调用的地方uniq2慢得多?uniqlen
不应该稍微快点吗?
斯蒂芬大帝
慕婉清6462132
随时随地看视频慕课网APP
相关分类