Mercurial > gemma
changeset 924:c8146132059e
Precalculate WKB size for MultiLineStringZ to avoid reallocations.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Sat, 06 Oct 2018 13:20:31 +0200 |
parents | ec9c3a111bb7 |
children | 15bf101e1522 |
files | pkg/octree/vertex.go |
diffstat | 1 files changed, 16 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/pkg/octree/vertex.go Fri Oct 05 18:46:13 2018 +0200 +++ b/pkg/octree/vertex.go Sat Oct 06 13:20:31 2018 +0200 @@ -294,20 +294,26 @@ func (mls MultiLineStringZ) AsWKB() []byte { - var buf bytes.Buffer + // pre-calculate size to avoid reallocations. + size := 1 + 4 + 4 + for _, ml := range mls { + size += 1 + 4 + 4 + len(ml)*3*8 + } - binary.Write(&buf, binary.LittleEndian, wkbNDR) - binary.Write(&buf, binary.LittleEndian, wkbMultiLineStringZ) - binary.Write(&buf, binary.LittleEndian, uint32(len(mls))) + buf := bytes.NewBuffer(make([]byte, 0, size)) + + binary.Write(buf, binary.LittleEndian, wkbNDR) + binary.Write(buf, binary.LittleEndian, wkbMultiLineStringZ) + binary.Write(buf, binary.LittleEndian, uint32(len(mls))) for _, ml := range mls { - binary.Write(&buf, binary.LittleEndian, wkbNDR) - binary.Write(&buf, binary.LittleEndian, wkbLineStringZ) - binary.Write(&buf, binary.LittleEndian, uint32(len(ml))) + binary.Write(buf, binary.LittleEndian, wkbNDR) + binary.Write(buf, binary.LittleEndian, wkbLineStringZ) + binary.Write(buf, binary.LittleEndian, uint32(len(ml))) for _, p := range ml { - binary.Write(&buf, binary.LittleEndian, math.Float64bits(p.X)) - binary.Write(&buf, binary.LittleEndian, math.Float64bits(p.Y)) - binary.Write(&buf, binary.LittleEndian, math.Float64bits(p.Z)) + binary.Write(buf, binary.LittleEndian, math.Float64bits(p.X)) + binary.Write(buf, binary.LittleEndian, math.Float64bits(p.Y)) + binary.Write(buf, binary.LittleEndian, math.Float64bits(p.Z)) } }