diff options
| author | korzhao <korzhao95@gmail.com> | 2023-07-06 11:12:29 +0800 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2023-07-31 15:44:01 +0000 |
| commit | f024e390bb0cb124487fd75f564ef8178ccba8f4 (patch) | |
| tree | 360aa2dabdf09638247b1adacb7594f8ed7a0329 /src | |
| parent | c17e0cd2da0d69aba28d23aab12186eedc579dc1 (diff) | |
| download | go-f024e390bb0cb124487fd75f564ef8178ccba8f4.tar.xz | |
reflect: optimize DeepEqual() for maps
benchmark old ns/op new ns/op delta
BenchmarkMapsDeepEqual-10 235 200 -15.05%
benchmark old allocs new allocs delta
BenchmarkMapsDeepEqual-10 7 6 -14.29%
benchmark old bytes new bytes delta
BenchmarkMapsDeepEqual-10 96 48 -50.00%
Change-Id: Ifa625ad25524cc9ee438711917606626b33a9597
Reviewed-on: https://go-review.googlesource.com/c/go/+/512576
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Run-TryBot: Ian Lance Taylor <iant@google.com>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src')
| -rw-r--r-- | src/reflect/benchmark_test.go | 12 | ||||
| -rw-r--r-- | src/reflect/deepequal.go | 7 |
2 files changed, 16 insertions, 3 deletions
diff --git a/src/reflect/benchmark_test.go b/src/reflect/benchmark_test.go index 9241c2c3d3..b499ad7122 100644 --- a/src/reflect/benchmark_test.go +++ b/src/reflect/benchmark_test.go @@ -107,6 +107,18 @@ func BenchmarkDeepEqual(b *testing.B) { } } +func BenchmarkMapsDeepEqual(b *testing.B) { + m1 := map[int]int{ + 1: 1, 2: 2, + } + m2 := map[int]int{ + 1: 1, 2: 2, + } + for i := 0; i < b.N; i++ { + DeepEqual(m1, m2) + } +} + func BenchmarkIsZero(b *testing.B) { source := ValueOf(struct { ArrayComparable [4]T diff --git a/src/reflect/deepequal.go b/src/reflect/deepequal.go index 579781e703..961e170118 100644 --- a/src/reflect/deepequal.go +++ b/src/reflect/deepequal.go @@ -142,9 +142,10 @@ func deepValueEqual(v1, v2 Value, visited map[visit]bool) bool { if v1.UnsafePointer() == v2.UnsafePointer() { return true } - for _, k := range v1.MapKeys() { - val1 := v1.MapIndex(k) - val2 := v2.MapIndex(k) + iter := v1.MapRange() + for iter.Next() { + val1 := iter.Value() + val2 := v2.MapIndex(iter.Key()) if !val1.IsValid() || !val2.IsValid() || !deepValueEqual(val1, val2, visited) { return false } |
