]> Cypherpunks repositories - gostls13.git/commitdiff
errors: optimize errors.Join for single unwrappable errors
authordmathieu <42@dmathieu.com>
Wed, 11 Dec 2024 09:55:27 +0000 (09:55 +0000)
committerGopher Robot <gobot@golang.org>
Mon, 14 Apr 2025 13:49:08 +0000 (06:49 -0700)
Change-Id: I10bbb782ca7234cda8c82353f2255eec5be588c9
GitHub-Last-Rev: e5ad8fdb802e56bb36c41b4982ed27c1e0809af8
GitHub-Pull-Request: golang/go#70770
Reviewed-on: https://go-review.googlesource.com/c/go/+/635115
Auto-Submit: Sean Liao <sean@liao.dev>
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: Sean Liao <sean@liao.dev>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

src/errors/join.go
src/errors/join_test.go

index 349fc06ed9f75c3323a9d65c2e519713a9b33e7e..dd50089c293f7ce5f516b07838d2988c4a58022f 100644 (file)
@@ -26,6 +26,18 @@ func Join(errs ...error) error {
        if n == 0 {
                return nil
        }
+       if n == 1 {
+               for _, err := range errs {
+                       if err != nil {
+                               if _, ok := err.(interface {
+                                       Unwrap() []error
+                               }); ok {
+                                       return err
+                               }
+                       }
+               }
+       }
+
        e := &joinError{
                errs: make([]error, 0, n),
        }
index 4828dc4d755fd678d0b3ca31f7fdebc5e1dcaeaf..439b372ca0371d1aa546db1e18709d6ec2b8e7e9 100644 (file)
@@ -70,3 +70,37 @@ func TestJoinErrorMethod(t *testing.T) {
                }
        }
 }
+
+func BenchmarkJoin(b *testing.B) {
+       for _, bb := range []struct {
+               name string
+               errs []error
+       }{
+               {
+                       name: "no error",
+               },
+               {
+                       name: "single non-nil error",
+                       errs: []error{errors.New("err")},
+               },
+               {
+                       name: "multiple errors",
+                       errs: []error{errors.New("err"), errors.New("newerr"), errors.New("newerr2")},
+               },
+               {
+                       name: "unwrappable single error",
+                       errs: []error{errors.Join(errors.New("err"))},
+               },
+               {
+                       name: "nil first error",
+                       errs: []error{nil, errors.New("newerr")},
+               },
+       } {
+               b.Run(bb.name, func(b *testing.B) {
+                       b.ReportAllocs()
+                       for i := 0; i < b.N; i++ {
+                               _ = errors.Join(bb.errs...)
+                       }
+               })
+       }
+}