mirror of
https://github.com/Mrs4s/MiraiGo.git
synced 2025-05-04 19:17:38 +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:
parent
4a777539be
commit
21ff14fd5c
@ -72,31 +72,17 @@ func (en *encoder) uvarint(v uint64) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (en *encoder) svarint(v int64) {
|
func (en *encoder) svarint(v int64) {
|
||||||
if v >= 0 {
|
en.uvarint(uint64(v)<<1 ^ uint64(v>>63))
|
||||||
en.uvarint(uint64(v) << 1)
|
|
||||||
} else {
|
|
||||||
en.uvarint(^uint64(v << 1))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (en *encoder) u32(v uint32) {
|
func (en *encoder) u32(v uint32) {
|
||||||
var b [4]byte
|
var b [8]byte
|
||||||
b[0] = byte(v)
|
binary.LittleEndian.PutUint32(b[:], v)
|
||||||
b[1] = byte(v >> 8)
|
|
||||||
b[2] = byte(v >> 16)
|
|
||||||
b[3] = byte(v >> 24)
|
|
||||||
_, _ = en.Write(b[:])
|
_, _ = en.Write(b[:])
|
||||||
}
|
}
|
||||||
|
|
||||||
func (en *encoder) u64(v uint64) {
|
func (en *encoder) u64(v uint64) {
|
||||||
var b [8]byte
|
var b [8]byte
|
||||||
b[0] = byte(v)
|
binary.LittleEndian.PutUint64(b[:], 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)
|
|
||||||
_, _ = en.Write(b[:])
|
_, _ = en.Write(b[:])
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
func Benchmark_encoder_uvarint(b *testing.B) {
|
||||||
b.Run("short", func(b *testing.B) {
|
b.Run("short", func(b *testing.B) {
|
||||||
benchEncoderUvarint(b, uint64(1))
|
benchEncoderUvarint(b, uint64(1))
|
||||||
@ -24,3 +32,15 @@ func Benchmark_encoder_uvarint(b *testing.B) {
|
|||||||
benchEncoderUvarint(b, math.MaxUint64)
|
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)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user