1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-05-04 11:07:40 +08:00

optimize(binary): allow inline (*encoder).svarint

name                       old time/op  new time/op  delta
encoder_svarint/short-8   7.12ns ± 2%  6.24ns ± 2%  -12.36%  (p=0.000 n=10+9)
encoder_svarint/medium-8  8.86ns ± 3%  7.82ns ± 2%  -11.76%  (p=0.000 n=10+10)
encoder_svarint/large-8   12.2ns ± 1%  11.4ns ± 2%   -5.99%  (p=0.000 n=10+10)

BTW, (*encoder).u32 and (*encoder).u64 can be inlined with go1.18
This commit is contained in:
wdvxdr 2021-11-07 13:56:40 +08:00
parent 4a777539be
commit 21ff14fd5c
No known key found for this signature in database
GPG Key ID: 703F8C071DE7A1B6
2 changed files with 24 additions and 18 deletions

View File

@ -72,31 +72,17 @@ func (en *encoder) uvarint(v uint64) {
}
func (en *encoder) svarint(v int64) {
if v >= 0 {
en.uvarint(uint64(v) << 1)
} else {
en.uvarint(^uint64(v << 1))
}
en.uvarint(uint64(v)<<1 ^ uint64(v>>63))
}
func (en *encoder) u32(v uint32) {
var b [4]byte
b[0] = byte(v)
b[1] = byte(v >> 8)
b[2] = byte(v >> 16)
b[3] = byte(v >> 24)
var b [8]byte
binary.LittleEndian.PutUint32(b[:], v)
_, _ = en.Write(b[:])
}
func (en *encoder) u64(v uint64) {
var b [8]byte
b[0] = byte(v)
b[1] = byte(v >> 8)
b[2] = byte(v >> 16)
b[3] = byte(v >> 24)
b[4] = byte(v >> 32)
b[5] = byte(v >> 40)
b[6] = byte(v >> 48)
b[7] = byte(v >> 56)
binary.LittleEndian.PutUint64(b[:], v)
_, _ = en.Write(b[:])
}

View File

@ -13,6 +13,14 @@ func benchEncoderUvarint(b *testing.B, v uint64) {
}
}
func benchEncoderSvarint(b *testing.B, v int64) {
e := encoder{}
for i := 0; i < b.N; i++ {
e.Reset()
e.svarint(v)
}
}
func Benchmark_encoder_uvarint(b *testing.B) {
b.Run("short", func(b *testing.B) {
benchEncoderUvarint(b, uint64(1))
@ -24,3 +32,15 @@ func Benchmark_encoder_uvarint(b *testing.B) {
benchEncoderUvarint(b, math.MaxUint64)
})
}
func Benchmark_encoder_svarint(b *testing.B) {
b.Run("short", func(b *testing.B) {
benchEncoderSvarint(b, int64(1))
})
b.Run("medium", func(b *testing.B) {
benchEncoderSvarint(b, int64(114514))
})
b.Run("large", func(b *testing.B) {
benchEncoderSvarint(b, math.MaxInt64)
})
}