Labels: reduce allocations when creating from TSDB WAL (#13044)
* Labels: reduce allocations when creating from TSDB When reading the WAL, by passing references into the buffer we can avoid copying strings under `-tags stringlabels`. Signed-off-by: Bryan Boreham <bjboreham@gmail.com>
This commit is contained in:
parent
b718dca70b
commit
1bfb3ed062
|
@ -617,6 +617,13 @@ func (b *ScratchBuilder) Add(name, value string) {
|
|||
b.add = append(b.add, Label{Name: name, Value: value})
|
||||
}
|
||||
|
||||
// Add a name/value pair, using []byte instead of string.
|
||||
// The '-tags stringlabels' version of this function is unsafe, hence the name.
|
||||
// This version is safe - it copies the strings immediately - but we keep the same name so everything compiles.
|
||||
func (b *ScratchBuilder) UnsafeAddBytes(name, value []byte) {
|
||||
b.add = append(b.add, Label{Name: string(name), Value: string(value)})
|
||||
}
|
||||
|
||||
// Sort the labels added so far by name.
|
||||
func (b *ScratchBuilder) Sort() {
|
||||
slices.SortFunc(b.add, func(a, b Label) int { return strings.Compare(a.Name, b.Name) })
|
||||
|
|
|
@ -829,6 +829,12 @@ func (b *ScratchBuilder) Add(name, value string) {
|
|||
b.add = append(b.add, Label{Name: name, Value: value})
|
||||
}
|
||||
|
||||
// Add a name/value pair, using []byte instead of string to reduce memory allocations.
|
||||
// The values must remain live until Labels() is called.
|
||||
func (b *ScratchBuilder) UnsafeAddBytes(name, value []byte) {
|
||||
b.add = append(b.add, Label{Name: yoloString(name), Value: yoloString(value)})
|
||||
}
|
||||
|
||||
// Sort the labels added so far by name.
|
||||
func (b *ScratchBuilder) Sort() {
|
||||
slices.SortFunc(b.add, func(a, b Label) int { return strings.Compare(a.Name, b.Name) })
|
||||
|
|
|
@ -279,13 +279,12 @@ func (d *Decoder) Metadata(rec []byte, metadata []RefMetadata) ([]RefMetadata, e
|
|||
|
||||
// DecodeLabels decodes one set of labels from buf.
|
||||
func (d *Decoder) DecodeLabels(dec *encoding.Decbuf) labels.Labels {
|
||||
// TODO: reconsider if this function could be pushed down into labels.Labels to be more efficient.
|
||||
d.builder.Reset()
|
||||
nLabels := dec.Uvarint()
|
||||
for i := 0; i < nLabels; i++ {
|
||||
lName := dec.UvarintStr()
|
||||
lValue := dec.UvarintStr()
|
||||
d.builder.Add(lName, lValue)
|
||||
lName := dec.UvarintBytes()
|
||||
lValue := dec.UvarintBytes()
|
||||
d.builder.UnsafeAddBytes(lName, lValue)
|
||||
}
|
||||
return d.builder.Labels()
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue