【golang 技巧】通过提前下标访问,让编译器不要生成数据越界检查的代码(来自VictoriaLogs的未验证技巧)
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!
阅读 VictoriaLogs 源码时,发现这样一段代码:
// lib/logstorage/log_rows.go
func (lr *logRows) mustAddRows(src *LogRows) {
streamIDs := src.streamIDs
timestamps := src.timestamps
rows := src.rows
if len(rows) == 0 {
return
}
// a hint for the compiler for preventing from unnecessary bounds checks
_ = streamIDs[len(rows)-1]
_ = timestamps[len(rows)-1]
for i := range rows {
lr.mustAddRow(streamIDs[i], timestamps[i], rows[i])
}
}
令人惊叹的代码是这一段:
// a hint for the compiler for preventing from unnecessary bounds checks
_ = streamIDs[len(rows)-1]
_ = timestamps[len(rows)-1]
在循环之前,提前访问数组的最大边界,导致了循环内的数组下标访问,编译器就不会再生成边界检查代码
实在太酷了。
后续还需要验证一下这个技巧是否真的有效。

浙公网安备 33010602011771号