From f024e390bb0cb124487fd75f564ef8178ccba8f4 Mon Sep 17 00:00:00 2001 From: korzhao Date: Thu, 6 Jul 2023 11:12:29 +0800 Subject: [PATCH] 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 Reviewed-by: David Chase Auto-Submit: Ian Lance Taylor Reviewed-by: Ian Lance Taylor Run-TryBot: Ian Lance Taylor Run-TryBot: Ian Lance Taylor --- src/reflect/benchmark_test.go | 12 ++++++++++++ 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 } -- 2.50.0