我在玩这个代码
main_var.go
package main
func main() {
const size = 1000000
slice := make([]SomeStruct, size)
for _, s := range slice { // line 7
_ = s
}
}
type_small.go
package main
type SomeStruct struct {
ID0 int64
ID1 int64
ID2 int64
ID3 int64
ID4 int64
ID5 int64
ID6 int64
ID7 int64
ID8 int64
}
我注意到,如果我在ID9结构中添加另一个 64 位 int64(总共 10 * 8 字节 = 80 字节),则 for 循环会变慢。
如果我比较了程序集,它添加了复制元素的指令
// with 9 int64 (72 bytes)
0x001d 00029 (main_var.go:6) LEAQ type."".SomeStruct(SB), AX
0x0024 00036 (main_var.go:6) MOVQ AX, (SP)
0x0028 00040 (main_var.go:6) MOVQ $1000000, 8(SP)
0x0031 00049 (main_var.go:6) MOVQ $1000000, 16(SP)
0x003a 00058 (main_var.go:6) CALL runtime.makeslice(SB)
0x003f 00063 (main_var.go:6) XORL AX, AX
0x0041 00065 (main_var.go:7) INCQ AX
0x0044 00068 (main_var.go:7) CMPQ AX, $1000000
0x004a 00074 (main_var.go:7) JLT 65
0x004c 00076 (main_var.go:7) MOVQ 32(SP), BP
0x0051 00081 (main_var.go:7) ADDQ $40, SP
0x0055 00085 (main_var.go:7) RET
0x0056 00086 (main_var.go:7) NOP
0x0056 00086 (main_var.go:3) CALL runtime.morestack_noctxt(SB)
0x005b 00091 (main_var.go:3) JMP 0
// with 10 int64 (80 bytes), it added DUFFCOPY instruction
0x001d 00029 (main_var.go:6) LEAQ type."".SomeStruct(SB), AX
0x0024 00036 (main_var.go:6) MOVQ AX, (SP)
0x0028 00040 (main_var.go:6) MOVQ $1000000, 8(SP)
0x0031 00049 (main_var.go:6) MOVQ $1000000, 16(SP)
0x003a 00058 (main_var.go:6) CALL runtime.makeslice(SB)
0x003f 00063 (main_var.go:6) MOVQ 24(SP), AX
0x0044 00068 (main_var.go:6) XORL CX, CX
0x0046 00070 (main_var.go:7) JMP 76
我想知道为什么较大的结构(> 80 字节)的不同行为即使在这两种情况下都没有使用切片的元素。
湖上湖
慕雪6442864
随时随地看视频慕课网APP
相关分类