@@ -123,28 +123,29 @@ func decodeHeader(reader io.Reader) (variant byte,
123
123
124
124
var ErrVariantUnknown = errors .New ("node variant is unknown" )
125
125
126
+ // variantsOrderedByBitMask is an array of all variants sorted
127
+ // in ascending order by the number of LHS set bits each variant mask has.
128
+ // See https://spec.polkadot.network/#defn-node-header
129
+ // WARNING: DO NOT MUTATE.
130
+ // This array is defined at global scope for performance
131
+ // reasons only, instead of having it locally defined in
132
+ // the decodeHeaderByte function below.
133
+ // For 7 variants, the performance is improved by ~20%.
134
+ var variantsOrderedByBitMask = [... ]variant {
135
+ leafVariant , // mask 1100_0000
136
+ branchVariant , // mask 1100_0000
137
+ branchWithValueVariant , // mask 1100_0000
138
+ }
139
+
126
140
func decodeHeaderByte (header byte ) (variantBits ,
127
141
partialKeyLengthHeader , partialKeyLengthHeaderMask byte , err error ) {
128
- // variants is a slice of all variants sorted in ascending
129
- // order by the number of bits each variant mask occupy
130
- // in the header byte.
131
- // See https://spec.polkadot.network/#defn-node-header
132
- // Performance note: see `Benchmark_decodeHeaderByte`;
133
- // running with a locally scoped slice is as fast as having
134
- // it at global scope.
135
- variants := []variant {
136
- leafVariant , // mask 1100_0000
137
- branchVariant , // mask 1100_0000
138
- branchWithValueVariant , // mask 1100_0000
139
- }
140
-
141
- for i := len (variants ) - 1 ; i >= 0 ; i -- {
142
- variantBits = header & variants [i ].mask
143
- if variantBits != variants [i ].bits {
142
+ for i := len (variantsOrderedByBitMask ) - 1 ; i >= 0 ; i -- {
143
+ variantBits = header & variantsOrderedByBitMask [i ].mask
144
+ if variantBits != variantsOrderedByBitMask [i ].bits {
144
145
continue
145
146
}
146
147
147
- partialKeyLengthHeaderMask = ^ variants [i ].mask
148
+ partialKeyLengthHeaderMask = ^ variantsOrderedByBitMask [i ].mask
148
149
partialKeyLengthHeader = header & partialKeyLengthHeaderMask
149
150
return variantBits , partialKeyLengthHeader ,
150
151
partialKeyLengthHeaderMask , nil
0 commit comments