From 449fd49fd393860a4183e04244621dace920d655 Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Tue, 2 Feb 2021 13:21:28 +0800 Subject: [PATCH] =?UTF-8?q?:zap:speed=20up=20jce=20writer=20again=20Benchm?= =?UTF-8?q?arkJceWriter=5FWriteJceStructRaw=20BenchmarkJceWriter=5FWriteJc?= =?UTF-8?q?eStructRaw-8=20=20=20=20=09=20=20414883=09=20=20=20=20=20=20265?= =?UTF-8?q?9=20ns/op=20BenchmarkJceWriter=5FWriteJceStructRaw2=20Benchmark?= =?UTF-8?q?JceWriter=5FWriteJceStructRaw2-8=20=20=20=09=20=20925503=09=20?= =?UTF-8?q?=20=20=20=20=201460=20ns/op=20=E5=8F=88=E5=BF=AB=E4=BA=861?= =?UTF-8?q?=E5=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- binary/jce/writer.go | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/binary/jce/writer.go b/binary/jce/writer.go index 6c178603..21a1b4bf 100644 --- a/binary/jce/writer.go +++ b/binary/jce/writer.go @@ -7,6 +7,7 @@ import ( "reflect" "strconv" "sync" + "unsafe" ) type JceWriter struct { @@ -203,8 +204,9 @@ func (w *JceWriter) WriteObject(i interface{}, tag int) { } type decoder []struct { - fieldID int - id int + ty reflect2.Type + offset uintptr + id int } var decoderCache = sync.Map{} @@ -212,7 +214,6 @@ var decoderCache = sync.Map{} // WriteJceStructRaw 写入 Jce 结构体 func (w *JceWriter) WriteJceStructRaw(s IJceStruct) { var ( - v = reflect.ValueOf(s).Elem() ty2 = reflect2.TypeOf(s) jceDec decoder ) @@ -221,9 +222,10 @@ func (w *JceWriter) WriteJceStructRaw(s IJceStruct) { jceDec = dec.(decoder) } else { // 初次反射 jceDec = decoder{} - t := reflect.TypeOf(s).Elem() + t := reflect2.TypeOf(s).(reflect2.PtrType).Elem().(reflect2.StructType) for i := 0; i < t.NumField(); i++ { - strId := t.Field(i).Tag.Get("jceId") + field := t.Field(i) + strId := field.Tag().Get("jceId") if strId == "" { continue } @@ -232,14 +234,15 @@ func (w *JceWriter) WriteJceStructRaw(s IJceStruct) { continue } jceDec = append(jceDec, struct { - fieldID int - id int - }{fieldID: i, id: id}) + ty reflect2.Type + offset uintptr + id int + }{ty: field.Type(), offset: field.Offset(), id: id}) } decoderCache.Store(ty2, jceDec) // 存入缓存 } for _, dec := range jceDec { - obj := v.Field(dec.fieldID).Interface() + var obj = dec.ty.UnsafeIndirect(unsafe.Pointer(uintptr(reflect2.PtrOf(s)) + dec.offset)) // MAGIC! if obj != nil { w.WriteObject(obj, dec.id) }