From a645bc5eb9b9fabc024c076140013a8ad87dded5 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Fri, 21 Mar 2025 16:07:20 -0700 Subject: maps: implement faster clone MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit │ base │ experiment │ │ sec/op │ sec/op vs base │ MapClone-24 66.802m ± 7% 3.348m ± 2% -94.99% (p=0.000 n=10) Fixes #70836 Change-Id: I9e192b1ee82e18f5580ff18918307042a337fdcc Reviewed-on: https://go-review.googlesource.com/c/go/+/660175 Reviewed-by: Michael Pratt Auto-Submit: Keith Randall LUCI-TryBot-Result: Go LUCI Reviewed-by: Keith Randall --- src/runtime/map_swiss.go | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) (limited to 'src/runtime') diff --git a/src/runtime/map_swiss.go b/src/runtime/map_swiss.go index a8fe87257a..a1e6ab6b9d 100644 --- a/src/runtime/map_swiss.go +++ b/src/runtime/map_swiss.go @@ -330,22 +330,13 @@ func mapinitnoop() //go:linkname mapclone maps.clone func mapclone(m any) any { e := efaceOf(&m) - e.data = unsafe.Pointer(mapclone2((*abi.SwissMapType)(unsafe.Pointer(e._type)), (*maps.Map)(e.data))) + typ := (*abi.SwissMapType)(unsafe.Pointer(e._type)) + map_ := (*maps.Map)(e.data) + map_ = map_.Clone(typ) + e.data = (unsafe.Pointer)(map_) return m } -func mapclone2(t *abi.SwissMapType, src *maps.Map) *maps.Map { - dst := makemap(t, int(src.Used()), nil) - - var iter maps.Iter - iter.Init(t, src) - for iter.Next(); iter.Key() != nil; iter.Next() { - dst.Put(t, iter.Key(), iter.Elem()) - } - - return dst -} - // keys for implementing maps.keys // //go:linkname keys maps.keys -- cgit v1.3-5-g9baa