背景

Q13 如何判断 2 个字符串切片(slice) 是相等的?
针对这个中的b = b[:len(a)],使用go 1.15.6编译,已经没有效果了,在len判断的时候就已经做了优化

遍历slice时处理越界的一个小技巧

b = b[:len(a)] // 这种写法是为了优化边界检查从而提升运行时效率的。在go语言中称之为 Bounds Check Elimination,简称为 BCE。

_ = b[:len(a)]

针对这个中的b = b[:len(a)]使用go 1.15.6编译已经没有效果了在len判断的时候就已经做了优化

验证

package main

func StringSliceEqualBCE(a, b []string) bool {
	if len(a) != len(b) {
		return false
	}
	if (a == nil) != (b == nil) {
		return false
	}
	b = b[:len(a)]
	for i, v := range a {
		if v != b[i] {
			return false
		}
	}
	return true
}

func f(s []int) {
	_ = s[2] // 只有这里有边界检查
	_ = s[1]
	_ = s[0]
}

func main() {
	StringSliceEqualBCE([]string{}, []string{})
	f([]int{})
}
(base) Didis-MacBook-Pro-4:BCE-边界检查 didiyu$ go build -gcflags="-d=ssa/check_bce/debug=1" main.go
# command-line-arguments
./main.go:20:7: Found IsInBounds

Q13 如何判断 2 个字符串切片(slice) 是相等的?

原创文章转载请注明出处: Go-去掉BCE(边界检查),提高运行时的效率