Skip to content

Commit ee5794e

Browse files
committed
reduce encoder allocs
1 parent 08da17c commit ee5794e

File tree

2 files changed

+38
-23
lines changed

2 files changed

+38
-23
lines changed

internal/encoder/dictionary.go

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,51 @@
11
package encoder
22

3-
import "github.com/IncSW/go-bencode/internal"
3+
import (
4+
"sort"
5+
"sync"
6+
7+
"github.com/IncSW/go-bencode/internal"
8+
)
9+
10+
const stringsArrayLen = 20
11+
12+
var stringsArrayPool = sync.Pool{
13+
New: func() interface{} {
14+
return &[stringsArrayLen]string{}
15+
},
16+
}
17+
18+
func sortStrings(ss []string) {
19+
if len(ss) <= stringsArrayLen {
20+
for i := 1; i < len(ss); i++ {
21+
for j := i; j > 0; j-- {
22+
if ss[j] >= ss[j-1] {
23+
break
24+
}
25+
ss[j], ss[j-1] = ss[j-1], ss[j]
26+
}
27+
}
28+
} else {
29+
sort.Strings(ss)
30+
}
31+
}
432

533
//go:nosplit
634
func (e *Encoder) encodeDictionary(data map[string]interface{}) error {
735
e.grow(1)
836
e.writeByte('d')
9-
keys := make([]string, 0, len(data))
37+
var keys []string
38+
if len(data) <= stringsArrayLen {
39+
stringsArray := stringsArrayPool.Get().(*[stringsArrayLen]string)
40+
defer stringsArrayPool.Put(stringsArray)
41+
keys = stringsArray[:0:len(data)]
42+
} else {
43+
keys = make([]string, 0, len(data))
44+
}
1045
for key, _ := range data {
1146
keys = append(keys, key)
1247
}
13-
internal.SortStrings(keys)
48+
sortStrings(keys)
1449
for _, key := range keys {
1550
e.encodeBytes(internal.S2B(key))
1651
err := e.encode(data[key])

internal/utils.go

Lines changed: 0 additions & 20 deletions
This file was deleted.

0 commit comments

Comments
 (0)