Go False-Sharing

linux查看cacheline大小.

> cat /sys/devices/system/cpu/cpu1/cache/index0/coherency_line_size 
64

osx查看cacheline大小.

> sysctl hw.cachelinesize
hw.cachelinesize: 64

测试代码

const (
	N             = 1024 * 1024
	CacheLineSize = 8 // 8 * 8 bytes
)

func Benchmark_True(b *testing.B) {
	arr := make([][]int64, N)
	for i := 0; i < N; i++ {
		arr[i] = make([]int64, CacheLineSize)
	}

	for k := 0; k < b.N; k++ {
		var n int64
		for i := 0; i < N; i++ {
			for j := 0; j < CacheLineSize; j++ {
				n += arr[i][j]
			}
		}
	}
}

func Benchmark_False(b *testing.B) {
	arr := make([][]int64, N)
	for i := 0; i < N; i++ {
		arr[i] = make([]int64, CacheLineSize)
	}

	for k := 0; k < b.N; k++ {
		var n int64
		for i := 0; i < CacheLineSize; i++ {
			for j := 0; j < N; j++ {
				n += arr[j][i]
			}
		}
	}
}

结果

no true false ratio
0 11969223ns/op 16002570ns/op 74.79%
1 11837657ns/op 15893455ns/op 74.48%
2 11972342ns/op 16790093ns/op 71.30%