mirror of
https://github.com/fumiama/go-base16384.git
synced 2026-06-05 00:32:52 +08:00
name old time/op new time/op delta EncodeTo/16-8 10.6ns ± 0% 10.4ns ± 0% -2.07% (p=0.008 n=5+5) EncodeTo/256-8 80.8ns ± 0% 55.7ns ± 0% -31.11% (p=0.008 n=5+5) EncodeTo/4K-8 1.21µs ± 0% 0.82µs ± 0% -32.67% (p=0.016 n=4+5) EncodeTo/32K-8 9.64µs ± 0% 6.47µs ± 0% -32.90% (p=0.008 n=5+5) DecodeTo/16-8 9.79ns ± 0% 26.02ns ± 0% +165.85% (p=0.016 n=4+5) DecodeTo/256-8 80.9ns ± 0% 111.6ns ± 0% +37.98% (p=0.008 n=5+5) DecodeTo/4K-8 1.22µs ± 0% 1.17µs ± 0% -3.73% (p=0.008 n=5+5) DecodeTo/32K-8 9.71µs ± 1% 8.80µs ± 1% -9.37% (p=0.008 n=5+5) Encoder/16-8 76.5ns ± 0% 76.5ns ± 0% ~ (p=0.810 n=5+5) Encoder/256-8 356ns ± 0% 291ns ± 0% -18.22% (p=0.008 n=5+5) Encoder/4K-8 4.05µs ± 0% 3.70µs ± 0% -8.76% (p=0.008 n=5+5) Encoder/32K-8 34.1µs ± 0% 29.2µs ± 0% -14.30% (p=0.008 n=5+5) Decoder/16-8 205ns ± 0% 207ns ± 0% +1.08% (p=0.008 n=5+5) Decoder/256-8 262ns ± 0% 244ns ± 1% -6.94% (p=0.008 n=5+5) Decoder/4K-8 1.49µs ± 0% 1.12µs ± 0% -24.87% (p=0.008 n=5+5) Decoder/32K-8 11.0µs ± 0% 8.0µs ± 0% -27.00% (p=0.008 n=5+5) name old speed new speed delta EncodeTo/16-8 1.50GB/s ± 0% 1.54GB/s ± 0% +2.11% (p=0.008 n=5+5) EncodeTo/256-8 3.17GB/s ± 0% 4.60GB/s ± 0% +45.15% (p=0.008 n=5+5) EncodeTo/4K-8 3.37GB/s ± 0% 5.01GB/s ± 0% +48.51% (p=0.008 n=5+5) EncodeTo/32K-8 3.40GB/s ± 0% 5.06GB/s ± 0% +49.02% (p=0.008 n=5+5) DecodeTo/16-8 2.25GB/s ± 0% 0.85GB/s ± 0% -62.39% (p=0.016 n=4+5) DecodeTo/256-8 3.66GB/s ± 0% 2.65GB/s ± 0% -27.54% (p=0.008 n=5+5) DecodeTo/4K-8 3.84GB/s ± 0% 3.99GB/s ± 0% +3.87% (p=0.008 n=5+5) DecodeTo/32K-8 3.86GB/s ± 1% 4.26GB/s ± 1% +10.33% (p=0.008 n=5+5) Encoder/16-8 209MB/s ± 0% 209MB/s ± 0% ~ (p=0.802 n=5+5) Encoder/256-8 720MB/s ± 0% 880MB/s ± 0% +22.28% (p=0.008 n=5+5) Encoder/4K-8 1.01GB/s ± 0% 1.11GB/s ± 0% +9.60% (p=0.008 n=5+5) Encoder/32K-8 962MB/s ± 0% 1122MB/s ± 0% +16.69% (p=0.008 n=5+5) Decoder/16-8 78.1MB/s ± 0% 77.3MB/s ± 0% -1.08% (p=0.008 n=5+5) Decoder/256-8 977MB/s ± 0% 1050MB/s ± 1% +7.47% (p=0.008 n=5+5) Decoder/4K-8 2.76GB/s ± 0% 3.67GB/s ± 0% +33.10% (p=0.008 n=5+5) Decoder/32K-8 2.98GB/s ± 0% 4.08GB/s ± 0% +36.98% (p=0.008 n=5+5) name old alloc/op new alloc/op delta EncodeTo/16-8 0.00B 0.00B ~ (all equal) EncodeTo/256-8 0.00B 0.00B ~ (all equal) EncodeTo/4K-8 0.00B 0.00B ~ (all equal) EncodeTo/32K-8 0.00B 0.00B ~ (all equal) DecodeTo/16-8 0.00B 48.00B ± 0% +Inf% (p=0.008 n=5+5) DecodeTo/256-8 0.00B 576.00B ± 0% +Inf% (p=0.008 n=5+5) DecodeTo/4K-8 0.00B 6144.00B ± 0% +Inf% (p=0.008 n=5+5) DecodeTo/32K-8 0.00B 49152.00B ± 0% +Inf% (p=0.008 n=5+5) Encoder/16-8 24.0B ± 0% 24.0B ± 0% ~ (all equal) Encoder/256-8 472B ± 0% 24B ± 0% -94.92% (p=0.008 n=5+5) Encoder/4K-8 24.0B ± 0% 24.0B ± 0% ~ (all equal) Encoder/32K-8 41.0kB ± 0% 0.0kB ± 0% -99.94% (p=0.008 n=5+5) Decoder/16-8 1.39kB ± 0% 1.39kB ± 0% ~ (all equal) Decoder/256-8 1.39kB ± 0% 1.39kB ± 0% ~ (all equal) Decoder/4K-8 4.98kB ± 0% 4.98kB ± 0% ~ (all equal) Decoder/32K-8 41.1kB ± 0% 41.1kB ± 0% ~ (all equal) name old allocs/op new allocs/op delta EncodeTo/16-8 0.00 0.00 ~ (all equal) EncodeTo/256-8 0.00 0.00 ~ (all equal) EncodeTo/4K-8 0.00 0.00 ~ (all equal) EncodeTo/32K-8 0.00 0.00 ~ (all equal) DecodeTo/16-8 0.00 1.00 ± 0% +Inf% (p=0.008 n=5+5) DecodeTo/256-8 0.00 1.00 ± 0% +Inf% (p=0.008 n=5+5) DecodeTo/4K-8 0.00 1.00 ± 0% +Inf% (p=0.008 n=5+5) DecodeTo/32K-8 0.00 1.00 ± 0% +Inf% (p=0.008 n=5+5) Encoder/16-8 1.00 ± 0% 1.00 ± 0% ~ (all equal) Encoder/256-8 2.00 ± 0% 1.00 ± 0% -50.00% (p=0.008 n=5+5) Encoder/4K-8 1.00 ± 0% 1.00 ± 0% ~ (all equal) Encoder/32K-8 2.00 ± 0% 1.00 ± 0% -50.00% (p=0.008 n=5+5) Decoder/16-8 3.00 ± 0% 3.00 ± 0% ~ (all equal) Decoder/256-8 3.00 ± 0% 3.00 ± 0% ~ (all equal) Decoder/4K-8 3.00 ± 0% 3.00 ± 0% ~ (all equal) Decoder/32K-8 3.00 ± 0% 3.00 ± 0% ~ (all equal)
239 lines
5.3 KiB
Go
239 lines
5.3 KiB
Go
package base14
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/hex"
|
|
"io"
|
|
"math/rand"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestBase14(t *testing.T) {
|
|
assert.Equal(t, "蜮嘎惢磦筢貊豔耹嫹桊涖犧蟦癎摖壥禦籋萷犸粹瘛榞梄螢圓因苧璡屨灇炀瞸瘊暍严帉戀㴃", EncodeString("一个测试293大大的啊定位为恶的我284的我……#@%@%@"))
|
|
assert.Equal(t, "婀㴁", EncodeString("1"))
|
|
assert.Equal(t, "婌渀㴂", EncodeString("12"))
|
|
assert.Equal(t, "婌焰㴃", EncodeString("123"))
|
|
assert.Equal(t, "婌焳帀㴄", EncodeString("1234"))
|
|
assert.Equal(t, "婌焳廔㴅", EncodeString("12345"))
|
|
assert.Equal(t, "婌焳廔萀㴆", EncodeString("123456"))
|
|
assert.Equal(t, "婌焳廔萷", EncodeString("1234567"))
|
|
assert.Equal(t, "婌焳廔萷尀㴁", EncodeString("12345678"))
|
|
buf := make([]byte, 4096)
|
|
for i := 1; i < 4096; i++ {
|
|
rand.Read(buf[:i])
|
|
out := Decode(Encode(buf[:i]))
|
|
if !assert.Equal(t, hex.EncodeToString(buf[:i]), hex.EncodeToString(out)) {
|
|
t.Fatal()
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestEncoder(t *testing.T) {
|
|
buf := make([]byte, 1024*1024+1)
|
|
_, err := rand.Read(buf)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
w := bytes.NewBuffer(make([]byte, 0, 1024*1024+1))
|
|
for i := 0; i <= 1024*1024; i += rand.Intn(128) * 7 {
|
|
e := NewEncoder(bytes.NewReader(buf[:i]))
|
|
_, err = io.Copy(w, e)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !bytes.Equal(Encode(buf[:i]), w.Bytes()) {
|
|
t.Fail()
|
|
}
|
|
w.Reset()
|
|
}
|
|
}
|
|
|
|
func TestBufferedEncoder(t *testing.T) {
|
|
buf := make([]byte, 1024*1024+1)
|
|
_, err := rand.Read(buf)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
w := bytes.NewBuffer(make([]byte, 0, 1024*1024+1))
|
|
for i := 0; i <= 1024*1024; i += rand.Intn(128) * 7 {
|
|
e := NewBufferedEncoder(buf[:i])
|
|
_, err = io.Copy(w, e)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !bytes.Equal(Encode(buf[:i]), w.Bytes()) {
|
|
t.Fail()
|
|
}
|
|
w.Reset()
|
|
}
|
|
}
|
|
|
|
func TestDecoder(t *testing.T) {
|
|
buf := make([]byte, 1024*1024+1)
|
|
_, err := rand.Read(buf)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
encd := Encode(buf)
|
|
w := bytes.NewBuffer(make([]byte, 0, 1024*1024+1))
|
|
for i := 0; i <= 1024*1024; i += rand.Intn(128) * 8 {
|
|
d := NewDecoder(bytes.NewReader(encd[:i]))
|
|
_, err = io.Copy(w, d)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !bytes.Equal(buf[:i/8*7], w.Bytes()) {
|
|
t.Fail()
|
|
}
|
|
w.Reset()
|
|
}
|
|
}
|
|
|
|
func TestBufferedDecoder(t *testing.T) {
|
|
buf := make([]byte, 1024*1024+1)
|
|
_, err := rand.Read(buf)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
encd := Encode(buf)
|
|
w := bytes.NewBuffer(make([]byte, 0, 1024*1024+1))
|
|
for i := 0; i <= 1024*1024; i += rand.Intn(128) * 8 {
|
|
d := NewBufferedDecoder(encd[:i])
|
|
_, err = io.Copy(w, d)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !bytes.Equal(buf[:i/8*7], w.Bytes()) {
|
|
t.Fail()
|
|
}
|
|
w.Reset()
|
|
}
|
|
}
|
|
|
|
func benchEncode(b *testing.B, data []byte) {
|
|
_, err := rand.Read(data)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
buf := make([]byte, EncodeLen(len(data)))
|
|
b.SetBytes(int64(len(data)))
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
_ = EncodeTo(data, buf)
|
|
}
|
|
}
|
|
|
|
func benchDecode(b *testing.B, data []byte) {
|
|
_, err := rand.Read(data)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
buf := make([]byte, EncodeLen(len(data)))
|
|
err = EncodeTo(data, buf)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
b.SetBytes(int64(len(buf)))
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
_ = DecodeTo(buf, data)
|
|
}
|
|
}
|
|
|
|
func BenchmarkEncodeTo(b *testing.B) {
|
|
b.Run("16", func(b *testing.B) {
|
|
data := make([]byte, 16)
|
|
benchEncode(b, data)
|
|
})
|
|
b.Run("256", func(b *testing.B) {
|
|
data := make([]byte, 256)
|
|
benchEncode(b, data)
|
|
})
|
|
b.Run("4K", func(b *testing.B) {
|
|
data := make([]byte, 1024*4)
|
|
benchEncode(b, data)
|
|
})
|
|
b.Run("32K", func(b *testing.B) {
|
|
data := make([]byte, 1024*32)
|
|
benchEncode(b, data)
|
|
})
|
|
}
|
|
|
|
func BenchmarkDecodeTo(b *testing.B) {
|
|
b.Run("16", func(b *testing.B) {
|
|
data := make([]byte, 16)
|
|
benchDecode(b, data)
|
|
})
|
|
b.Run("256", func(b *testing.B) {
|
|
data := make([]byte, 256)
|
|
benchDecode(b, data)
|
|
})
|
|
b.Run("4K", func(b *testing.B) {
|
|
data := make([]byte, 4096)
|
|
benchDecode(b, data)
|
|
})
|
|
b.Run("32K", func(b *testing.B) {
|
|
data := make([]byte, 1024*32)
|
|
benchDecode(b, data)
|
|
})
|
|
}
|
|
|
|
func benchEncoder(b *testing.B, cnt int64) {
|
|
enc := NewEncoder(rand.New(rand.NewSource(0)))
|
|
buf := bytes.NewBuffer(make([]byte, 0, cnt))
|
|
b.SetBytes(cnt)
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
_, _ = io.CopyN(buf, enc, cnt)
|
|
buf.Reset()
|
|
}
|
|
}
|
|
|
|
func benchDecoder(b *testing.B, cnt int64) {
|
|
enc := NewEncoder(rand.New(rand.NewSource(0)))
|
|
buf := bytes.NewBuffer(make([]byte, 0, cnt))
|
|
_, err := io.CopyN(buf, enc, cnt)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
buf2 := bytes.NewBuffer(make([]byte, 0, cnt))
|
|
b.SetBytes(cnt)
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
_, _ = io.Copy(buf2, NewDecoder(bytes.NewReader(buf.Bytes())))
|
|
buf2.Reset()
|
|
}
|
|
}
|
|
|
|
func BenchmarkEncoder(b *testing.B) {
|
|
b.Run("16", func(b *testing.B) {
|
|
benchEncoder(b, 16)
|
|
})
|
|
b.Run("256", func(b *testing.B) {
|
|
benchEncoder(b, 256)
|
|
})
|
|
b.Run("4K", func(b *testing.B) {
|
|
benchEncoder(b, 1024*4)
|
|
})
|
|
b.Run("32K", func(b *testing.B) {
|
|
benchEncoder(b, 1024*32)
|
|
})
|
|
}
|
|
|
|
func BenchmarkDecoder(b *testing.B) {
|
|
b.Run("16", func(b *testing.B) {
|
|
benchDecoder(b, 16)
|
|
})
|
|
b.Run("256", func(b *testing.B) {
|
|
benchDecoder(b, 256)
|
|
})
|
|
b.Run("4K", func(b *testing.B) {
|
|
benchDecoder(b, 1024*4)
|
|
})
|
|
b.Run("32K", func(b *testing.B) {
|
|
benchDecoder(b, 1024*32)
|
|
})
|
|
}
|