From 91d6b3e49bf11af4cfcbd97c0a02be5da478504f Mon Sep 17 00:00:00 2001 From: "Tristan M." <54208010+Oudwins@users.noreply.github.com> Date: Wed, 19 Feb 2025 16:40:12 +0100 Subject: [PATCH] perf: issues syncpool and issues.Collect function to collect issues into sync pool (#93) --- internals/Issues.go | 4 ++++ internals/contexts.go | 53 ++++++++++++++++++++++--------------------- internals/pools.go | 11 +++++++++ utils.go | 26 +++++++++++++++++++++ 4 files changed, 68 insertions(+), 26 deletions(-) diff --git a/internals/Issues.go b/internals/Issues.go index d291bc8..5427fc9 100644 --- a/internals/Issues.go +++ b/internals/Issues.go @@ -163,6 +163,10 @@ func (e *ZogErr) String() string { return fmt.Sprintf("ZogError{Code: %v, Params: %v, Type: %v, Value: %v, Message: '%v', Error: %v}", SafeString(e.C), SafeString(e.ParamsM), SafeString(e.Typ), SafeString(e.Val), SafeString(e.Msg), SafeError(e.Err)) } +func (e *ZogErr) Free() { + ZogIssuePool.Put(e) +} + // list of errors. This is returned by processors for simple types (e.g. strings, numbers, booleans) type ZogIssueList = []ZogError diff --git a/internals/contexts.go b/internals/contexts.go index da1256b..53d1a51 100644 --- a/internals/contexts.go +++ b/internals/contexts.go @@ -109,22 +109,21 @@ type TestCtx struct { func (c *SchemaCtx) Issue() ZogIssue { // TODO handle catch here - return &ZogErr{ - EPath: c.Path.String(), - Typ: c.DType, - Val: c.Val, - } + e := ZogIssuePool.Get().(*ZogErr) + e.EPath = c.Path.String() + e.Typ = c.DType + e.Val = c.Val + return e } // Please don't depend on this method it may change func (c *SchemaCtx) IssueFromTest(test *Test, val any) ZogIssue { - e := &ZogErr{ - EPath: c.Path.String(), - Typ: c.DType, - Val: val, - C: test.IssueCode, - ParamsM: test.Params, - } + e := ZogIssuePool.Get().(*ZogErr) + e.C = test.IssueCode + e.EPath = c.Path.String() + e.Typ = c.DType + e.Val = val + e.ParamsM = test.Params if test.IssueFmtFunc != nil { test.IssueFmtFunc(e, c) } @@ -136,13 +135,13 @@ func (c *SchemaCtx) IssueFromTest(test *Test, val any) ZogIssue { // Please don't depend on this method it may change func (c *SchemaCtx) IssueFromCoerce(err error) ZogIssue { - return &ZogErr{ - C: zconst.IssueCodeCoerce, - EPath: c.Path.String(), - Typ: c.DType, - Val: c.Val, - Err: err, - } + e := ZogIssuePool.Get().(*ZogErr) + e.C = zconst.IssueCodeCoerce + e.EPath = c.Path.String() + e.Typ = c.DType + e.Val = c.Val + e.Err = err + return e } // Please don't depend on this method it may change @@ -162,13 +161,15 @@ func (c *SchemaCtx) Free() { func (c *TestCtx) Issue() ZogIssue { // TODO handle catch here - return &ZogErr{ - EPath: c.Path.String(), - Typ: c.DType, - Val: c.Val, - C: c.Test.IssueCode, - ParamsM: c.Test.Params, - } + zerr := ZogIssuePool.Get().(*ZogErr) + zerr.C = c.Test.IssueCode + zerr.EPath = c.Path.String() + zerr.Err = nil + zerr.Msg = "" + zerr.ParamsM = c.Test.Params + zerr.Typ = c.DType + zerr.Val = c.Val + return zerr } func (c *TestCtx) FmtErr(e ZogIssue) { diff --git a/internals/pools.go b/internals/pools.go index 12b2baf..5cebc37 100644 --- a/internals/pools.go +++ b/internals/pools.go @@ -26,6 +26,12 @@ var InternalIssueMapPool = sync.Pool{ }, } +var ZogIssuePool = sync.Pool{ + New: func() any { + return &ZogErr{} + }, +} + func ClearPools() { ExecCtxPool = sync.Pool{ New: func() any { @@ -47,6 +53,11 @@ func ClearPools() { return &ErrsMap{} }, } + ZogIssuePool = sync.Pool{ + New: func() any { + return &ZogErr{} + }, + } } diff --git a/utils.go b/utils.go index 5bb55f7..4857115 100644 --- a/utils.go +++ b/utils.go @@ -96,6 +96,12 @@ func (i *issueHelpers) SanitizeMap(m ZogIssueMap) map[string][]string { return errs } +func (i issueHelpers) SanitizeMapAndCollect(m ZogIssueMap) map[string][]string { + errs := i.SanitizeMap(m) + i.CollectMap(m) + return errs +} + func (i *issueHelpers) SanitizeList(l ZogIssueList) []string { errs := make([]string, len(l)) for i, err := range l { @@ -104,6 +110,26 @@ func (i *issueHelpers) SanitizeList(l ZogIssueList) []string { return errs } +func (i *issueHelpers) SanitizeListAndCollect(l ZogIssueList) []string { + errs := i.SanitizeList(l) + i.CollectList(l) + return errs +} + +func (i *issueHelpers) CollectMap(issues ZogIssueMap) { + for _, list := range issues { + i.CollectList(list) + } +} + +func (i *issueHelpers) CollectList(issues ZogIssueList) { + for _, err := range issues { + if err, ok := err.(*p.ZogErr); ok { + err.Free() + } + } +} + // ! ERRORS -> Deprecated // Deprecated: This will be removed in the future. type errHelpers struct {