From 59e689bd46ef85f5926a7fa3c4efd3b5a2f9cf23 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Sat, 30 Jan 2021 18:26:48 +0800 Subject: [PATCH 1/2] speed up jce pkg: github.com/Mrs4s/MiraiGo/binary/jce BenchmarkJceWriter_WriteJceStructRaw BenchmarkJceWriter_WriteJceStructRaw-8 200443 5966 ns/op BenchmarkJceWriter_WriteJceStructRaw2 BenchmarkJceWriter_WriteJceStructRaw2-8 481285 2659 ns/op --- binary/jce/writer.go | 50 +++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/binary/jce/writer.go b/binary/jce/writer.go index b6728b82..7f1835f6 100644 --- a/binary/jce/writer.go +++ b/binary/jce/writer.go @@ -3,8 +3,10 @@ package jce import ( "bytes" goBinary "encoding/binary" + "github.com/modern-go/reflect2" "reflect" "strconv" + "sync" ) type JceWriter struct { @@ -200,24 +202,44 @@ func (w *JceWriter) WriteObject(i interface{}, tag int) { } } +type decoder []struct { + fieldID int + id int +} + +var decoderCache = sync.Map{} + +// WriteJceStructRaw 写入 Jce 结构体 func (w *JceWriter) WriteJceStructRaw(s IJceStruct) { var ( - t = reflect.TypeOf(s).Elem() - v = reflect.ValueOf(s).Elem() + v = reflect.ValueOf(s).Elem() + ty2 = reflect2.TypeOf(s) + jceDec decoder ) - for i := 0; i < t.NumField(); i++ { - strId := t.Field(i).Tag.Get("jceId") - if strId == "" { - continue - } - id, err := strconv.Atoi(strId) - if err != nil { - continue - } - obj := v.Field(i).Interface() - if obj != nil { - w.WriteObject(v.Field(i).Interface(), id) + dec, ok := decoderCache.Load(ty2) + if ok { // 从缓存中加载 + jceDec = dec.(decoder) + } else { // 初次反射 + jceDec = decoder{} + t := reflect.TypeOf(s).Elem() + for i := 0; i < t.NumField(); i++ { + strId := t.Field(i).Tag.Get("jceId") + if strId == "" { + continue + } + id, err := strconv.Atoi(strId) + if err != nil { + continue + } + jceDec = append(jceDec, struct { + fieldID int + id int + }{fieldID: i, id: id}) } + decoderCache.Store(ty2, jceDec) // 存入缓存 + } + for _, dec := range jceDec { + w.WriteObject(v.Field(dec.fieldID).Interface(), dec.id) } } From a782ccbf104c67dca6f3e98806e86a16e2a75d5e Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Sat, 30 Jan 2021 18:47:43 +0800 Subject: [PATCH 2/2] fix --- binary/jce/writer.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/binary/jce/writer.go b/binary/jce/writer.go index 7f1835f6..6c178603 100644 --- a/binary/jce/writer.go +++ b/binary/jce/writer.go @@ -239,7 +239,10 @@ func (w *JceWriter) WriteJceStructRaw(s IJceStruct) { decoderCache.Store(ty2, jceDec) // 存入缓存 } for _, dec := range jceDec { - w.WriteObject(v.Field(dec.fieldID).Interface(), dec.id) + obj := v.Field(dec.fieldID).Interface() + if obj != nil { + w.WriteObject(obj, dec.id) + } } }