From 449b024228e2ba636b4a815147abd2ac23f3c18f Mon Sep 17 00:00:00 2001 From: Ryan Haksi Date: Mon, 4 Jan 2021 10:44:47 -0800 Subject: [PATCH] - eliminate 2 allocations in EachKey() --- parser.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/parser.go b/parser.go index c34d50d..7e302c7 100644 --- a/parser.go +++ b/parser.go @@ -370,12 +370,19 @@ func sameTree(p1, p2 []string) bool { return true } +const stackArraySize = 128 + func EachKey(data []byte, cb func(int, []byte, ValueType, error), paths ...[]string) int { var x struct{} - pathFlags := make([]bool, len(paths)) var level, pathsMatched, i int ln := len(data) + pathFlags := make([]bool, stackArraySize)[:] + if len(paths) > cap(pathFlags) { + pathFlags = make([]bool, len(paths))[:] + } + pathFlags = pathFlags[0:len(paths)] + var maxPath int for _, p := range paths { if len(p) > maxPath { @@ -383,7 +390,11 @@ func EachKey(data []byte, cb func(int, []byte, ValueType, error), paths ...[]str } } - pathsBuf := make([]string, maxPath) + pathsBuf := make([]string, stackArraySize)[:] + if maxPath > cap(pathsBuf) { + pathsBuf = make([]string, maxPath)[:] + } + pathsBuf = pathsBuf[0:maxPath] for i < ln { switch data[i] { @@ -658,7 +669,6 @@ func calcAllocateSpace(keys []string, setValue []byte, comma, object bool) int { } } - lk += len(setValue) for i := 1; i < len(keys); i++ { if string(keys[i][0]) == "[" {