mirror of
https://github.com/Mrs4s/MiraiGo.git
synced 2025-05-04 19:17:38 +08:00
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
This commit is contained in:
parent
e9537a09a2
commit
59e689bd46
@ -3,8 +3,10 @@ package jce
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
goBinary "encoding/binary"
|
goBinary "encoding/binary"
|
||||||
|
"github.com/modern-go/reflect2"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
type JceWriter struct {
|
type JceWriter struct {
|
||||||
@ -200,11 +202,26 @@ 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) {
|
func (w *JceWriter) WriteJceStructRaw(s IJceStruct) {
|
||||||
var (
|
var (
|
||||||
t = reflect.TypeOf(s).Elem()
|
|
||||||
v = reflect.ValueOf(s).Elem()
|
v = reflect.ValueOf(s).Elem()
|
||||||
|
ty2 = reflect2.TypeOf(s)
|
||||||
|
jceDec decoder
|
||||||
)
|
)
|
||||||
|
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++ {
|
for i := 0; i < t.NumField(); i++ {
|
||||||
strId := t.Field(i).Tag.Get("jceId")
|
strId := t.Field(i).Tag.Get("jceId")
|
||||||
if strId == "" {
|
if strId == "" {
|
||||||
@ -214,10 +231,15 @@ func (w *JceWriter) WriteJceStructRaw(s IJceStruct) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
obj := v.Field(i).Interface()
|
jceDec = append(jceDec, struct {
|
||||||
if obj != nil {
|
fieldID int
|
||||||
w.WriteObject(v.Field(i).Interface(), id)
|
id int
|
||||||
|
}{fieldID: i, id: id})
|
||||||
}
|
}
|
||||||
|
decoderCache.Store(ty2, jceDec) // 存入缓存
|
||||||
|
}
|
||||||
|
for _, dec := range jceDec {
|
||||||
|
w.WriteObject(v.Field(dec.fieldID).Interface(), dec.id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user