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:
parent
8a3d449b7d
commit
f4fca58809
@ -380,26 +380,26 @@ func (r *JceReader) ReadSlice(i interface{}, tag int) {
|
||||
if t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Slice {
|
||||
return
|
||||
}
|
||||
if v.IsNil() {
|
||||
return
|
||||
}
|
||||
t = t.Elem()
|
||||
if !r.skipToTag(tag) {
|
||||
return
|
||||
}
|
||||
hd, _ := r.readHead()
|
||||
if hd.Type == 9 {
|
||||
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++ {
|
||||
val := r.readObject(t.Elem(), 0)
|
||||
v.Set(reflect.Append(v, val))
|
||||
r.ReadObject(val.Interface(), 0)
|
||||
sv.Index(i).Set(val.Elem())
|
||||
}
|
||||
v.Set(sv)
|
||||
}
|
||||
if hd.Type == 13 {
|
||||
if hd.Type == 13 && t.Elem().Kind() == reflect.Uint8 {
|
||||
r.readHead()
|
||||
arr := r.readBytes(int(r.ReadInt32(0)))
|
||||
for _, b := range arr {
|
||||
v.Set(reflect.Append(v, reflect.ValueOf(b)))
|
||||
}
|
||||
v.SetBytes(arr)
|
||||
}
|
||||
}
|
||||
|
||||
@ -427,8 +427,12 @@ func (r *JceReader) ReadObject(i interface{}, tag int) {
|
||||
*o = r.ReadFloat64(tag)
|
||||
case *string:
|
||||
*o = r.ReadString(tag)
|
||||
case *[]byte:
|
||||
r.ReadSlice(o, tag)
|
||||
case IJceStruct:
|
||||
r.readHead()
|
||||
o.ReadFrom(r)
|
||||
r.skipToStructEnd()
|
||||
}
|
||||
}
|
||||
|
||||
|
43
binary/jce/reader_test.go
Normal file
43
binary/jce/reader_test.go
Normal 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)
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user