gendry
gendry copied to clipboard
improve `scanner.Map`'s performance by caching resolved tags
scanner.Map
方法通过反射获取key name,开销较大,这里通过缓存结构体的key name解析结果来提升性能。
具体表现如下,通过使用缓存可以将scanner.Map
接口的吞吐提升1-2倍。
$ go test -run=BenchmarkMap -bench=BenchmarkMap -cpu=1,2,4,8 -benchtime=20000000x -benchmem
goos: darwin
goarch: amd64
pkg: github.com/didi/gendry/scanner
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
BenchmarkMapWithCache 20000000 265.4 ns/op 360 B/op 4 allocs/op
BenchmarkMapWithCache-2 20000000 152.2 ns/op 360 B/op 4 allocs/op
BenchmarkMapWithCache-4 20000000 88.22 ns/op 360 B/op 4 allocs/op
BenchmarkMapWithCache-8 20000000 70.87 ns/op 360 B/op 4 allocs/op
BenchmarkMapDisableCache 20000000 695.3 ns/op 400 B/op 9 allocs/op
BenchmarkMapDisableCache-2 20000000 348.7 ns/op 400 B/op 9 allocs/op
BenchmarkMapDisableCache-4 20000000 195.2 ns/op 400 B/op 9 allocs/op
BenchmarkMapDisableCache-8 20000000 169.8 ns/op 400 B/op 9 allocs/op
PASS
ok github.com/didi/gendry/scanner 39.892s