fix(storage): simple8b passes checkptr (#15512)

* fix(simple8b): disable checkptr on batch decodes

* perf: improve performance of simple8b encoding

```
name                      old time/op    new time/op    delta
EncodeAll/1_bit-24          35.8µs ± 2%    35.8µs ± 2%     ~     (p=0.887 n=10+7)
EncodeAll/2_bits-24         35.7µs ± 4%    35.6µs ± 3%     ~     (p=0.684 n=10+10)
EncodeAll/3_bits-24         36.5µs ± 3%    36.4µs ± 4%     ~     (p=0.780 n=10+9)
EncodeAll/4_bits-24         36.4µs ± 3%    37.8µs ± 2%   +3.71%  (p=0.000 n=10+10)
EncodeAll/5_bits-24         38.0µs ± 3%    38.3µs ± 2%     ~     (p=0.280 n=10+10)
EncodeAll/6_bits-24         39.4µs ± 1%    38.5µs ± 2%   -2.43%  (p=0.001 n=10+9)
EncodeAll/7_bits-24         39.6µs ± 3%    38.9µs ± 3%   -1.83%  (p=0.029 n=10+10)
EncodeAll/8_bits-24         40.3µs ± 3%    40.5µs ± 4%     ~     (p=0.278 n=10+9)
EncodeAll/10_bits-24        42.6µs ± 3%    41.9µs ± 2%     ~     (p=0.075 n=10+10)
EncodeAll/12_bits-24        44.2µs ± 2%    42.8µs ± 2%   -3.11%  (p=0.000 n=10+10)
EncodeAll/15_bits-24        46.0µs ± 1%    46.1µs ± 3%     ~     (p=0.447 n=9+10)
EncodeAll/20_bits-24        51.4µs ± 2%    50.0µs ± 2%   -2.86%  (p=0.000 n=10+10)
EncodeAll/30_bits-24        60.6µs ± 1%    58.1µs ± 2%   -4.02%  (p=0.000 n=10+10)
EncodeAll/60_bits-24        90.2µs ± 2%    85.2µs ± 1%   -5.50%  (p=0.000 n=10+10)
EncodeAll/combination-24     782µs ± 3%     762µs ± 5%     ~     (p=0.063 n=10+10)
Encode-24                   3.08µs ± 2%    3.09µs ± 1%     ~     (p=0.656 n=9+8)
Encoder-24                  4.58µs ± 0%    4.40µs ± 1%   -4.04%  (p=0.000 n=8+8)

```
pull/16525/head
Jacob Marble 2019-11-22 07:39:44 -08:00 committed by tmgordeeva
parent fc2090aeb4
commit 8f665ec2a7
1 changed files with 19 additions and 7 deletions

View File

@ -468,6 +468,8 @@ func Decode(dst *[240]uint64, v uint64) (n int, err error) {
// Decode writes the uncompressed values from src to dst. It returns the number // Decode writes the uncompressed values from src to dst. It returns the number
// of values written or an error. // of values written or an error.
//go:nocheckptr
// nocheckptr while the underlying struct layout doesn't change
func DecodeAll(dst, src []uint64) (value int, err error) { func DecodeAll(dst, src []uint64) (value int, err error) {
j := 0 j := 0
for _, v := range src { for _, v := range src {
@ -480,6 +482,8 @@ func DecodeAll(dst, src []uint64) (value int, err error) {
// DecodeBytesBigEndian writes the compressed, big-endian values from src to dst. It returns the number // DecodeBytesBigEndian writes the compressed, big-endian values from src to dst. It returns the number
// of values written or an error. // of values written or an error.
//go:nocheckptr
// nocheckptr while the underlying struct layout doesn't change
func DecodeBytesBigEndian(dst []uint64, src []byte) (value int, err error) { func DecodeBytesBigEndian(dst []uint64, src []byte) (value int, err error) {
if len(src)&7 != 0 { if len(src)&7 != 0 {
return 0, errors.New("src length is not multiple of 8") return 0, errors.New("src length is not multiple of 8")
@ -503,11 +507,6 @@ func canPack(src []uint64, n, bits int) bool {
return false return false
} }
end := len(src)
if n < end {
end = n
}
// Selector 0,1 are special and use 0 bits to encode runs of 1's // Selector 0,1 are special and use 0 bits to encode runs of 1's
if bits == 0 { if bits == 0 {
for _, v := range src { for _, v := range src {
@ -520,8 +519,8 @@ func canPack(src []uint64, n, bits int) bool {
max := uint64((1 << uint64(bits)) - 1) max := uint64((1 << uint64(bits)) - 1)
for i := 0; i < end; i++ { for _, s := range src[:n] {
if src[i] > max { if s > max {
return false return false
} }
} }
@ -541,6 +540,7 @@ func pack120(src []uint64) uint64 {
// pack60 packs 60 values from in using 1 bit each // pack60 packs 60 values from in using 1 bit each
func pack60(src []uint64) uint64 { func pack60(src []uint64) uint64 {
_ = src[59] // eliminate multiple bounds checks
return 2<<60 | return 2<<60 |
src[0] | src[0] |
src[1]<<1 | src[1]<<1 |
@ -607,6 +607,7 @@ func pack60(src []uint64) uint64 {
// pack30 packs 30 values from in using 2 bits each // pack30 packs 30 values from in using 2 bits each
func pack30(src []uint64) uint64 { func pack30(src []uint64) uint64 {
_ = src[29] // eliminate multiple bounds checks
return 3<<60 | return 3<<60 |
src[0] | src[0] |
src[1]<<2 | src[1]<<2 |
@ -642,6 +643,7 @@ func pack30(src []uint64) uint64 {
// pack20 packs 20 values from in using 3 bits each // pack20 packs 20 values from in using 3 bits each
func pack20(src []uint64) uint64 { func pack20(src []uint64) uint64 {
_ = src[19] // eliminate multiple bounds checks
return 4<<60 | return 4<<60 |
src[0] | src[0] |
src[1]<<3 | src[1]<<3 |
@ -667,6 +669,7 @@ func pack20(src []uint64) uint64 {
// pack15 packs 15 values from in using 3 bits each // pack15 packs 15 values from in using 3 bits each
func pack15(src []uint64) uint64 { func pack15(src []uint64) uint64 {
_ = src[14] // eliminate multiple bounds checks
return 5<<60 | return 5<<60 |
src[0] | src[0] |
src[1]<<4 | src[1]<<4 |
@ -687,6 +690,7 @@ func pack15(src []uint64) uint64 {
// pack12 packs 12 values from in using 5 bits each // pack12 packs 12 values from in using 5 bits each
func pack12(src []uint64) uint64 { func pack12(src []uint64) uint64 {
_ = src[11] // eliminate multiple bounds checks
return 6<<60 | return 6<<60 |
src[0] | src[0] |
src[1]<<5 | src[1]<<5 |
@ -704,6 +708,7 @@ func pack12(src []uint64) uint64 {
// pack10 packs 10 values from in using 6 bits each // pack10 packs 10 values from in using 6 bits each
func pack10(src []uint64) uint64 { func pack10(src []uint64) uint64 {
_ = src[9] // eliminate multiple bounds checks
return 7<<60 | return 7<<60 |
src[0] | src[0] |
src[1]<<6 | src[1]<<6 |
@ -719,6 +724,7 @@ func pack10(src []uint64) uint64 {
// pack8 packs 8 values from in using 7 bits each // pack8 packs 8 values from in using 7 bits each
func pack8(src []uint64) uint64 { func pack8(src []uint64) uint64 {
_ = src[7] // eliminate multiple bounds checks
return 8<<60 | return 8<<60 |
src[0] | src[0] |
src[1]<<7 | src[1]<<7 |
@ -732,6 +738,7 @@ func pack8(src []uint64) uint64 {
// pack7 packs 7 values from in using 8 bits each // pack7 packs 7 values from in using 8 bits each
func pack7(src []uint64) uint64 { func pack7(src []uint64) uint64 {
_ = src[6] // eliminate multiple bounds checks
return 9<<60 | return 9<<60 |
src[0] | src[0] |
src[1]<<8 | src[1]<<8 |
@ -744,6 +751,7 @@ func pack7(src []uint64) uint64 {
// pack6 packs 6 values from in using 10 bits each // pack6 packs 6 values from in using 10 bits each
func pack6(src []uint64) uint64 { func pack6(src []uint64) uint64 {
_ = src[5] // eliminate multiple bounds checks
return 10<<60 | return 10<<60 |
src[0] | src[0] |
src[1]<<10 | src[1]<<10 |
@ -755,6 +763,7 @@ func pack6(src []uint64) uint64 {
// pack5 packs 5 values from in using 12 bits each // pack5 packs 5 values from in using 12 bits each
func pack5(src []uint64) uint64 { func pack5(src []uint64) uint64 {
_ = src[4] // eliminate multiple bounds checks
return 11<<60 | return 11<<60 |
src[0] | src[0] |
src[1]<<12 | src[1]<<12 |
@ -765,6 +774,7 @@ func pack5(src []uint64) uint64 {
// pack4 packs 4 values from in using 15 bits each // pack4 packs 4 values from in using 15 bits each
func pack4(src []uint64) uint64 { func pack4(src []uint64) uint64 {
_ = src[3] // eliminate multiple bounds checks
return 12<<60 | return 12<<60 |
src[0] | src[0] |
src[1]<<15 | src[1]<<15 |
@ -774,6 +784,7 @@ func pack4(src []uint64) uint64 {
// pack3 packs 3 values from in using 20 bits each // pack3 packs 3 values from in using 20 bits each
func pack3(src []uint64) uint64 { func pack3(src []uint64) uint64 {
_ = src[2] // eliminate multiple bounds checks
return 13<<60 | return 13<<60 |
src[0] | src[0] |
src[1]<<20 | src[1]<<20 |
@ -782,6 +793,7 @@ func pack3(src []uint64) uint64 {
// pack2 packs 2 values from in using 30 bits each // pack2 packs 2 values from in using 30 bits each
func pack2(src []uint64) uint64 { func pack2(src []uint64) uint64 {
_ = src[1] // eliminate multiple bounds checks
return 14<<60 | return 14<<60 |
src[0] | src[0] |
src[1]<<30 src[1]<<30