From 8aa12d3cb043859229810947da6c52e600d34b55 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Thu, 26 Jan 2023 13:59:35 -0700 Subject: struct.go: Cache structIndexes This should help save some CPU time and avoid some memory churn. --- struct.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'struct.go') diff --git a/struct.go b/struct.go index b7fc287..8a664c6 100644 --- a/struct.go +++ b/struct.go @@ -7,6 +7,8 @@ package lowmemjson import ( "reflect" + "git.lukeshu.com/go/typedsync" + "git.lukeshu.com/go/lowmemjson/internal" ) @@ -25,9 +27,19 @@ type structIndex struct { byName map[string]int } +var structIndexCache typedsync.CacheMap[reflect.Type, structIndex] + // indexStruct takes a struct Type, and indexes its fields for use by -// Decoder.Decode() and Encoder.Encode(). +// Decoder.Decode() and Encoder.Encode(). indexStruct caches its +// results. func indexStruct(typ reflect.Type) structIndex { + ret, _ := structIndexCache.LoadOrCompute(typ, indexStructReal) + return ret +} + +// indexStructReal is like indexStruct, but is the real indexer, +// bypassing the cache. +func indexStructReal(typ reflect.Type) structIndex { var byPos []structField byName := make(map[string][]int) -- cgit v1.2.3-2-g168b