Skip to content

Commit eaedaef

Browse files
committed
oob: improve performance
1 parent f407042 commit eaedaef

3 files changed

Lines changed: 36 additions & 4 deletions

File tree

message_pool.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package connect
22

33
import (
4+
"encoding/base64"
45
"encoding/binary"
56
"fmt"
67
"hash/maphash"
@@ -497,3 +498,23 @@ func ProtoMarshalWithTag(m proto.Message, tag uint8) ([]byte, error) {
497498
func ProtoUnmarshal(b []byte, m proto.Message) error {
498499
return proto.Unmarshal(b, m)
499500
}
501+
502+
func EncodeBase64(enc *base64.Encoding, src []byte) string {
503+
buf := MessagePoolGet(enc.EncodedLen(len(src)))
504+
defer MessagePoolReturn(buf)
505+
enc.Encode(buf, src)
506+
return string(buf)
507+
}
508+
509+
func DecodeBase64(enc *base64.Encoding, s string) ([]byte, error) {
510+
sbuf := MessagePoolGet(len(s))
511+
defer MessagePoolReturn(sbuf)
512+
copy(sbuf, s)
513+
buf := MessagePoolGet(enc.DecodedLen(len(s)))
514+
n, err := enc.Decode(buf, sbuf)
515+
if err != nil {
516+
MessagePoolReturn(buf)
517+
return nil, err
518+
}
519+
return buf[:n], nil
520+
}

message_pool_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package connect
22

33
import (
44
"bytes"
5+
"encoding/base64"
56
"fmt"
67
mathrand "math/rand"
78
"testing"
@@ -107,3 +108,14 @@ func TestMessagePoolShare(t *testing.T) {
107108
assert.Equal(t, shared, false)
108109
}
109110
}
111+
112+
func TestBase64(t *testing.T) {
113+
for range 128 {
114+
n := mathrand.Intn(512)
115+
b := make([]byte, n)
116+
mathrand.Read(b)
117+
b2, err := DecodeBase64(base64.StdEncoding, EncodeBase64(base64.StdEncoding, b))
118+
assert.Equal(t, err, nil)
119+
assert.Equal(t, b, b2)
120+
}
121+
}

transfer_oob_control.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,23 +75,22 @@ func (self *ApiOutOfBandControl) SendControl(
7575
}
7676
defer MessagePoolReturn(packBytes)
7777

78-
packByteStr := base64.StdEncoding.EncodeToString(packBytes)
79-
8078
self.api.ConnectControl(
8179
&ConnectControlArgs{
82-
Pack: packByteStr,
80+
Pack: EncodeBase64(base64.StdEncoding, packBytes),
8381
},
8482
NewApiCallback(func(result *ConnectControlResult, err error) {
8583
if err != nil {
8684
safeCallback(nil, err)
8785
return
8886
}
8987

90-
packBytes, err := base64.StdEncoding.DecodeString(result.Pack)
88+
packBytes, err := DecodeBase64(base64.StdEncoding, result.Pack)
9189
if err != nil {
9290
safeCallback(nil, err)
9391
return
9492
}
93+
defer MessagePoolReturn(packBytes)
9594

9695
responsePack := &protocol.Pack{}
9796
err = ProtoUnmarshal(packBytes, responsePack)

0 commit comments

Comments
 (0)