From 69789f6a323cb2b629b44979805a22efa37c0a03 Mon Sep 17 00:00:00 2001 From: bhardwaz007 Date: Sat, 26 Aug 2023 10:40:32 +0530 Subject: [PATCH 1/3] Errors() performance : using strings.Builder instead of string concatenation --- errors.go | 22 +++++++++++++++++++++- errors_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/errors.go b/errors.go index 6c76562..b0ae469 100644 --- a/errors.go +++ b/errors.go @@ -21,7 +21,10 @@ package battery -import "fmt" +import ( + "fmt" + "strings" +) // ErrNotFound variable represents battery not found error. // @@ -130,6 +133,23 @@ func (e Errors) Error() string { return s + "]" } +func (e Errors) ErrorBuilder() string { + var s strings.Builder + s.WriteString("[") + for idx, err := range e { + if err != nil { + if idx == len(e)-1 { + s.Write([]byte(err.Error())) + } else { + s.WriteString(err.Error()) + s.WriteString(" ") + } + } + } + s.WriteString("]") + return s.String() +} + func wrapError(err error) error { if perr, ok := err.(ErrPartial); ok { if perr.isNil() { diff --git a/errors_test.go b/errors_test.go index 5e91638..da8b798 100644 --- a/errors_test.go +++ b/errors_test.go @@ -76,3 +76,27 @@ func TestErrors(t *testing.T) { } } } + +func BenchmarkErrors_Error(b *testing.B) { + e := getErrors() + for i := 0; i < b.N; i++ { + _ = e.Error() + } +} + +func BenchmarkErrors_ErrorBuilder(b *testing.B) { + e := getErrors() + for i := 0; i < b.N; i++ { + _ = e.ErrorBuilder() + } +} + +func getErrors() Errors { + return Errors([]error{ + errors.New("1"), + errors.New("2"), + errors.New("3"), + errors.New("4"), + errors.New("5"), + }) +} From bf4a30b49de5e732424809c1deb5b01a394658fa Mon Sep 17 00:00:00 2001 From: bhardwaz007 Date: Sat, 26 Aug 2023 11:02:51 +0530 Subject: [PATCH 2/3] excluding []init --- errors_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/errors_test.go b/errors_test.go index da8b798..0d757fc 100644 --- a/errors_test.go +++ b/errors_test.go @@ -79,6 +79,7 @@ func TestErrors(t *testing.T) { func BenchmarkErrors_Error(b *testing.B) { e := getErrors() + b.ResetTimer() for i := 0; i < b.N; i++ { _ = e.Error() } @@ -86,6 +87,7 @@ func BenchmarkErrors_Error(b *testing.B) { func BenchmarkErrors_ErrorBuilder(b *testing.B) { e := getErrors() + b.ResetTimer() for i := 0; i < b.N; i++ { _ = e.ErrorBuilder() } From efd2e589ac78c2e09aa65de89570f38805a44898 Mon Sep 17 00:00:00 2001 From: bhardwaz007 Date: Wed, 27 Sep 2023 13:09:23 +0530 Subject: [PATCH 3/3] removed 2 versions and benchmarks, implemented suggestions --- errors.go | 19 ++----------------- errors_test.go | 9 +-------- 2 files changed, 3 insertions(+), 25 deletions(-) diff --git a/errors.go b/errors.go index b0ae469..be77876 100644 --- a/errors.go +++ b/errors.go @@ -121,29 +121,14 @@ func (p ErrPartial) noNil() bool { type Errors []error func (e Errors) Error() string { - s := "[" - for _, err := range e { - if err != nil { - s += err.Error() + " " - } - } - if len(s) > 1 { - s = s[:len(s)-1] - } - return s + "]" -} - -func (e Errors) ErrorBuilder() string { var s strings.Builder s.WriteString("[") for idx, err := range e { if err != nil { - if idx == len(e)-1 { - s.Write([]byte(err.Error())) - } else { - s.WriteString(err.Error()) + if idx >= 1 { s.WriteString(" ") } + s.WriteString(err.Error()) } } s.WriteString("]") diff --git a/errors_test.go b/errors_test.go index 0d757fc..f3db9d6 100644 --- a/errors_test.go +++ b/errors_test.go @@ -66,6 +66,7 @@ func TestErrors(t *testing.T) { {Errors{ErrFatal{errors.New("t1")}}, "[Could not retrieve battery info: `t1`]"}, {Errors{ErrPartial{Full: errors.New("t2")}, ErrFatal{errors.New("t3")}}, "[{Full:t2} Could not retrieve battery info: `t3`]"}, {Errors{ErrPartial{Full: errors.New("t4")}, ErrPartial{Current: errors.New("t5")}}, "[{Full:t4} {Current:t5}]"}, + {Errors{ErrFatal{errors.New("testing error")}, nil}, "[Could not retrieve battery info: `testing error`]"}, } for i, c := range cases { @@ -85,14 +86,6 @@ func BenchmarkErrors_Error(b *testing.B) { } } -func BenchmarkErrors_ErrorBuilder(b *testing.B) { - e := getErrors() - b.ResetTimer() - for i := 0; i < b.N; i++ { - _ = e.ErrorBuilder() - } -} - func getErrors() Errors { return Errors([]error{ errors.New("1"),