Skip to content

Instantly share code, notes, and snippets.

@lesismal
Last active December 13, 2023 18:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lesismal/0cee2bb8d76c7f907a8e2a8401b4fd41 to your computer and use it in GitHub Desktop.
Save lesismal/0cee2bb8d76c7f907a8e2a8401b4fd41 to your computer and use it in GitHub Desktop.
go generics performance

看了下简单的基础类型泛型汇编

// main.go
package main

func SumInt8(a, b int8) int8 {
	return a + b
}

func SumInt32(a, b int32) int32 {
	return a + b
}

func SumFloat32(a, b float32) float32 {
	return a + b
}

func SumFloat64(a, b float64) float64 {
	return a + b
}

func SumGenerics[T int8 | int32 | float32 | float64](a, b T) T {
	return a + b
}

func main() {
	SumInt8(1, 2)
	SumInt32(1, 2)
	SumFloat32(1.0, 2.0)
	SumFloat64(1.0, 2.0)
	SumGenerics[int8](1, 2)
	SumGenerics[int32](1, 2)
	SumGenerics[float32](1.0, 2.0)
	SumGenerics(1.0, 2.0)
}
ubuntu@ubuntu:~/generics$ go tool compile -S main.go 
ubuntu@ubuntu:~/generics$ go tool objdump main.o 
TEXT "".SumInt8(SB) gofile../home/ubuntu/generics/main.go
  main.go:4		0x2cb7			01d8			ADDL BX, AX		
  main.go:4		0x2cb9			c3			RET			

TEXT "".SumInt32(SB) gofile../home/ubuntu/generics/main.go
  main.go:8		0x2cba			01d8			ADDL BX, AX		
  main.go:8		0x2cbc			c3			RET			

TEXT "".SumFloat32(SB) gofile../home/ubuntu/generics/main.go
  main.go:12		0x2cbd			f30f58c1		ADDSS X1, X0		
  main.go:12		0x2cc1			c3			RET			

TEXT "".SumFloat64(SB) gofile../home/ubuntu/generics/main.go
  main.go:16		0x2cc2			f20f58c1		ADDSD X1, X0		
  main.go:16		0x2cc6			c3			RET			

TEXT "".main(SB) gofile../home/ubuntu/generics/main.go
  main.go:32		0x2cc7			c3			RET			

TEXT "".SumGenerics[go.shape.int8_0](SB) gofile../home/ubuntu/generics/main.go
  main.go:20		0x2ed6			8d040b			LEAL 0(BX)(CX*1), AX	
  main.go:20		0x2ed9			c3			RET			

TEXT "".SumGenerics[go.shape.int32_0](SB) gofile../home/ubuntu/generics/main.go
  main.go:20		0x2eda			8d040b			LEAL 0(BX)(CX*1), AX	
  main.go:20		0x2edd			c3			RET			

TEXT "".SumGenerics[go.shape.float32_0](SB) gofile../home/ubuntu/generics/main.go
  main.go:20		0x2ede			f30f58c1		ADDSS X1, X0		
  main.go:20		0x2ee2			c3			RET			

TEXT "".SumGenerics[go.shape.float64_0](SB) gofile../home/ubuntu/generics/main.go
  main.go:20		0x2ee3			f20f58c1		ADDSD X1, X0		
  main.go:20		0x2ee7			c3			RET		

int8/int32的泛型生成的汇编是用的 LEAL 指令,非泛型的是 ADDL 指令,虽然都是一条指令但是LEAL内存加载应该比 ADDL 慢一点,这应该是你说的换成int会快一点的原因吧; 另外,泛型 float32/float64 生成的汇编与非泛型的汇编是一致的,都是 ADDSS/ADDSD 指令,所以性能应该没差别。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment