1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-05-04 19:17:38 +08:00

feat(jce): optimize ReadSlice performance.

name                   old time/op    new time/op    delta
JceReader_ReadSlice-8    1.09ms ± 7%    0.52ms ± 1%   -52.48%  (p=0.000 n=10+10)

name                   old speed      new speed      delta
JceReader_ReadSlice-8  19.4MB/s ± 7%  40.8MB/s ± 1%  +110.25%  (p=0.000 n=10+10)

name                   old alloc/op   new alloc/op   delta
JceReader_ReadSlice-8     594kB ± 1%     266kB ± 0%   -55.22%  (p=0.000 n=9+9)

name                   old allocs/op  new allocs/op  delta
JceReader_ReadSlice-8     22.6k ± 0%     18.0k ± 0%   -19.98%  (p=0.000 n=10+10)
This commit is contained in:
wdvxdr 2021-08-12 20:43:19 +08:00
parent 8a3d449b7d
commit f4fca58809
No known key found for this signature in database
GPG Key ID: 703F8C071DE7A1B6
3 changed files with 57 additions and 9 deletions

View File

@ -380,26 +380,26 @@ func (r *JceReader) ReadSlice(i interface{}, tag int) {
if t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Slice { if t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Slice {
return return
} }
if v.IsNil() { t = t.Elem()
return
}
if !r.skipToTag(tag) { if !r.skipToTag(tag) {
return return
} }
hd, _ := r.readHead() hd, _ := r.readHead()
if hd.Type == 9 { if hd.Type == 9 {
s := r.ReadInt32(0) s := r.ReadInt32(0)
sv := reflect.MakeSlice(t, int(s), int(s))
t = t.Elem()
val := reflect.New(t)
for i := 0; i < int(s); i++ { for i := 0; i < int(s); i++ {
val := r.readObject(t.Elem(), 0) r.ReadObject(val.Interface(), 0)
v.Set(reflect.Append(v, val)) sv.Index(i).Set(val.Elem())
} }
v.Set(sv)
} }
if hd.Type == 13 { if hd.Type == 13 && t.Elem().Kind() == reflect.Uint8 {
r.readHead() r.readHead()
arr := r.readBytes(int(r.ReadInt32(0))) arr := r.readBytes(int(r.ReadInt32(0)))
for _, b := range arr { v.SetBytes(arr)
v.Set(reflect.Append(v, reflect.ValueOf(b)))
}
} }
} }
@ -427,8 +427,12 @@ func (r *JceReader) ReadObject(i interface{}, tag int) {
*o = r.ReadFloat64(tag) *o = r.ReadFloat64(tag)
case *string: case *string:
*o = r.ReadString(tag) *o = r.ReadString(tag)
case *[]byte:
r.ReadSlice(o, tag)
case IJceStruct: case IJceStruct:
r.readHead()
o.ReadFrom(r) o.ReadFrom(r)
r.skipToStructEnd()
} }
} }

43
binary/jce/reader_test.go Normal file
View File

@ -0,0 +1,43 @@
package jce
import (
"math/rand"
"testing"
"github.com/stretchr/testify/assert"
)
func TestJceReader_ReadSlice(t *testing.T) {
s := make([]int64, 50)
for i := range s {
s[i] = rand.Int63()
}
w := NewJceWriter()
w.WriteObject(s, 1)
r := NewJceReader(w.Bytes())
var result []int64
r.ReadSlice(&result, 1)
assert.Equal(t, s, result)
}
var test []*BigDataIPInfo
func BenchmarkJceReader_ReadSlice(b *testing.B) {
for i := 0; i <= 500; i++ {
test = append(test, &BigDataIPInfo{
Type: 1,
Server: "test1",
Port: 8080,
})
}
w := NewJceWriter()
w.WriteObject(test, 1)
src := w.Bytes()
b.SetBytes(int64(len(src)))
b.StartTimer()
var result = []BigDataIPInfo{}
for i := 0; i < b.N; i++ {
r := NewJceReader(src)
r.ReadSlice(&result, 1)
}
}

1
go.mod
View File

@ -6,6 +6,7 @@ require (
github.com/json-iterator/go v1.1.10 github.com/json-iterator/go v1.1.10
github.com/modern-go/reflect2 v1.0.1 github.com/modern-go/reflect2 v1.0.1
github.com/pkg/errors v0.9.1 github.com/pkg/errors v0.9.1
github.com/stretchr/testify v1.3.0
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
google.golang.org/protobuf v1.25.0 google.golang.org/protobuf v1.25.0
) )