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% |