mirror of
https://github.com/Mrs4s/MiraiGo.git
synced 2025-05-04 19:17:38 +08:00
NewWriterF with sync.Pool
多次写入,需要扩容时速度提升
This commit is contained in:
parent
f3beaae4e4
commit
207df5fc00
@ -4,12 +4,12 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Writer bytes.Buffer
|
type Writer bytes.Buffer
|
||||||
|
|
||||||
/*
|
var bufferPool = sync.Pool{
|
||||||
var bufferPool = sync.Pool{ // todo sync.Pool 无法通过单元测试
|
|
||||||
New: func() interface{} {
|
New: func() interface{} {
|
||||||
return new(bytes.Buffer)
|
return new(bytes.Buffer)
|
||||||
},
|
},
|
||||||
@ -27,7 +27,6 @@ func PutBuffer(buf *bytes.Buffer) {
|
|||||||
bufferPool.Put(buf)
|
bufferPool.Put(buf)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
func NewWriter() *Writer {
|
func NewWriter() *Writer {
|
||||||
return new(Writer)
|
return new(Writer)
|
||||||
@ -40,9 +39,11 @@ func PutWriter(w *Writer) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
func NewWriterF(f func(writer *Writer)) []byte {
|
func NewWriterF(f func(writer *Writer)) []byte {
|
||||||
w := new(bytes.Buffer)
|
w := NewBuffer()
|
||||||
f((*Writer)(w))
|
f((*Writer)(w))
|
||||||
return w.Bytes()
|
b := append([]byte(nil), w.Bytes()...)
|
||||||
|
PutBuffer(w)
|
||||||
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *Writer) Write(b []byte) {
|
func (w *Writer) Write(b []byte) {
|
||||||
|
@ -10,8 +10,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func NewWriterFOld(f func(writer *Writer)) []byte {
|
func NewWriterFOld(f func(writer *Writer)) []byte {
|
||||||
w := (*Writer)(new(bytes.Buffer))
|
w := new(bytes.Buffer)
|
||||||
f(w)
|
f((*Writer)(w))
|
||||||
return w.Bytes()
|
return w.Bytes()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,8 +53,8 @@ func TestNewWriterF(t *testing.T) {
|
|||||||
wg.Wait()
|
wg.Wait()
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkNewWriterFOld256(b *testing.B) {
|
func BenchmarkNewWriterFOld128(b *testing.B) {
|
||||||
test := make([]byte, 256)
|
test := make([]byte, 128)
|
||||||
rand.Read(test)
|
rand.Read(test)
|
||||||
b.StartTimer()
|
b.StartTimer()
|
||||||
b.RunParallel(func(pb *testing.PB) {
|
b.RunParallel(func(pb *testing.PB) {
|
||||||
@ -66,8 +66,8 @@ func BenchmarkNewWriterFOld256(b *testing.B) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkNewWriterF256(b *testing.B) {
|
func BenchmarkNewWriterF128(b *testing.B) {
|
||||||
test := make([]byte, 256)
|
test := make([]byte, 128)
|
||||||
rand.Read(test)
|
rand.Read(test)
|
||||||
b.StartTimer()
|
b.StartTimer()
|
||||||
b.RunParallel(func(pb *testing.PB) {
|
b.RunParallel(func(pb *testing.PB) {
|
||||||
@ -79,27 +79,31 @@ func BenchmarkNewWriterF256(b *testing.B) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkNewWriterFOld1024(b *testing.B) {
|
func BenchmarkNewWriterFOld128_3(b *testing.B) {
|
||||||
test := make([]byte, 1024)
|
test := make([]byte, 128)
|
||||||
rand.Read(test)
|
rand.Read(test)
|
||||||
b.StartTimer()
|
b.StartTimer()
|
||||||
b.RunParallel(func(pb *testing.PB) {
|
b.RunParallel(func(pb *testing.PB) {
|
||||||
for pb.Next() {
|
for pb.Next() {
|
||||||
NewWriterFOld(func(w *Writer) {
|
NewWriterFOld(func(w *Writer) {
|
||||||
w.Write(test)
|
w.Write(test)
|
||||||
|
w.Write(test)
|
||||||
|
w.Write(test)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkNewWriterF1024(b *testing.B) {
|
func BenchmarkNewWriterF128_3(b *testing.B) {
|
||||||
test := make([]byte, 1024)
|
test := make([]byte, 128)
|
||||||
rand.Read(test)
|
rand.Read(test)
|
||||||
b.StartTimer()
|
b.StartTimer()
|
||||||
b.RunParallel(func(pb *testing.PB) {
|
b.RunParallel(func(pb *testing.PB) {
|
||||||
for pb.Next() {
|
for pb.Next() {
|
||||||
NewWriterF(func(w *Writer) {
|
NewWriterF(func(w *Writer) {
|
||||||
w.Write(test)
|
w.Write(test)
|
||||||
|
w.Write(test)
|
||||||
|
w.Write(test)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user