From ed6e3dfe2cd0c2601125c056c83b513bd91daba3 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 4 Jul 2023 17:52:58 +0530 Subject: [PATCH] Speedup Memset for single val --- tools/utils/misc.go | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/tools/utils/misc.go b/tools/utils/misc.go index 1bbeb2086..4cd0fd0f1 100644 --- a/tools/utils/misc.go +++ b/tools/utils/misc.go @@ -136,7 +136,8 @@ func Min[T constraints.Ordered](a T, items ...T) (ans T) { } func Memset[T any](dest []T, pattern ...T) []T { - if len(pattern) == 0 { + switch len(pattern) { + case 0: var zero T switch any(zero).(type) { case byte: // special case this as the compiler can generate efficient code for memset of a byte slice to zero @@ -150,11 +151,17 @@ func Memset[T any](dest []T, pattern ...T) []T { } } return dest - } - bp := copy(dest, pattern) - for bp < len(dest) { - copy(dest[bp:], dest[:bp]) - bp *= 2 + case 1: + val := pattern[0] + for i := range dest { + dest[i] = val + } + default: + bp := copy(dest, pattern) + for bp < len(dest) { + copy(dest[bp:], dest[:bp]) + bp *= 2 + } } return dest }