aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorkorzhao <korzhao95@gmail.com>2023-07-06 11:12:29 +0800
committerGopher Robot <gobot@golang.org>2023-07-31 15:44:01 +0000
commitf024e390bb0cb124487fd75f564ef8178ccba8f4 (patch)
tree360aa2dabdf09638247b1adacb7594f8ed7a0329 /src
parentc17e0cd2da0d69aba28d23aab12186eedc579dc1 (diff)
downloadgo-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.go12
-rw-r--r--src/reflect/deepequal.go7
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
}