From 1ad01debf3835e322ec9e07f11708416f7789be5 Mon Sep 17 00:00:00 2001 From: Sergey Elantsev Date: Fri, 9 Apr 2021 22:59:30 +0300 Subject: [PATCH] tiny optimisations of dag.Set 1. Use hint for map size in Set.Copy(). 2. Use Set.Copy() if Set.Difference() argument is empty. --- dag/set.go | 12 ++++++------ dag/set_test.go | 9 +++++++++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/dag/set.go b/dag/set.go index 2e5d85b2d..390415e31 100644 --- a/dag/set.go +++ b/dag/set.go @@ -56,13 +56,13 @@ func (s Set) Intersection(other Set) Set { // Difference returns a set with the elements that s has but // other doesn't. func (s Set) Difference(other Set) Set { + if other == nil || other.Len() == 0 { + return s.Copy() + } + result := make(Set) for k, v := range s { - var ok bool - if other != nil { - _, ok = other[k] - } - if !ok { + if _, ok := other[k]; !ok { result.Add(v) } } @@ -105,7 +105,7 @@ func (s Set) List() []interface{} { // Copy returns a shallow copy of the set. func (s Set) Copy() Set { - c := make(Set) + c := make(Set, len(s)) for k, v := range s { c[k] = v } diff --git a/dag/set_test.go b/dag/set_test.go index d59eacfbd..721f2467d 100644 --- a/dag/set_test.go +++ b/dag/set_test.go @@ -31,6 +31,12 @@ func TestSetDifference(t *testing.T) { []interface{}{3, 2, 1, 4}, []interface{}{}, }, + { + "B is nil", + []interface{}{1, 2, 3}, + nil, + []interface{}{1, 2, 3}, + }, } for i, tc := range cases { @@ -44,6 +50,9 @@ func TestSetDifference(t *testing.T) { for _, v := range tc.B { two.Add(v) } + if tc.B == nil { + two = nil + } for _, v := range tc.Expected { expected.Add(v) }