From 9846cb5ad3c34e81becba2b323f83ec243bba831 Mon Sep 17 00:00:00 2001 From: Ignacio Van Droogenbroeck Date: Mon, 2 Mar 2026 19:00:29 -0600 Subject: [PATCH] perf(encode): add map[string]string fast path in Encode() type switch Adds a direct type assertion case for map[string]string in Encode(), bypassing reflect.ValueOf + getEncoder dispatch. Also adds encodeMapStringString method that operates on the concrete type without reflection. Benchmark: MapStringString 192 ns -> 164 ns (-15%) --- encode.go | 2 ++ encode_map.go | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/encode.go b/encode.go index 8dec20b..4cd69d2 100644 --- a/encode.go +++ b/encode.go @@ -243,6 +243,8 @@ func (e *Encoder) Encode(v interface{}) error { return e.encodeInt64Cond(int64(v)) case time.Time: return e.EncodeTime(v) + case map[string]string: + return e.encodeMapStringString(v) case map[string]interface{}: if e.flags&sortMapKeysFlag != 0 { return e.EncodeMapSorted(v) diff --git a/encode_map.go b/encode_map.go index a5aa31b..a30afd2 100644 --- a/encode_map.go +++ b/encode_map.go @@ -93,6 +93,27 @@ func encodeMapStringInterfaceValue(e *Encoder, v reflect.Value) error { return e.EncodeMap(m) } +func (e *Encoder) encodeMapStringString(m map[string]string) error { + if m == nil { + return e.EncodeNil() + } + if err := e.EncodeMapLen(len(m)); err != nil { + return err + } + if e.flags&sortMapKeysFlag != 0 { + return e.encodeSortedMapStringString(m) + } + for mk, mv := range m { + if err := e.EncodeString(mk); err != nil { + return err + } + if err := e.EncodeString(mv); err != nil { + return err + } + } + return nil +} + func (e *Encoder) EncodeMap(m map[string]interface{}) error { if m == nil { return e.EncodeNil()