comparison pkg/octree/vertex.go @ 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 221e64cb0c82
children 15bf101e1522
comparison
equal deleted inserted replaced
923:ec9c3a111bb7 924:c8146132059e
292 return nil 292 return nil
293 } 293 }
294 294
295 func (mls MultiLineStringZ) AsWKB() []byte { 295 func (mls MultiLineStringZ) AsWKB() []byte {
296 296
297 var buf bytes.Buffer 297 // pre-calculate size to avoid reallocations.
298 298 size := 1 + 4 + 4
299 binary.Write(&buf, binary.LittleEndian, wkbNDR)
300 binary.Write(&buf, binary.LittleEndian, wkbMultiLineStringZ)
301 binary.Write(&buf, binary.LittleEndian, uint32(len(mls)))
302
303 for _, ml := range mls { 299 for _, ml := range mls {
304 binary.Write(&buf, binary.LittleEndian, wkbNDR) 300 size += 1 + 4 + 4 + len(ml)*3*8
305 binary.Write(&buf, binary.LittleEndian, wkbLineStringZ) 301 }
306 binary.Write(&buf, binary.LittleEndian, uint32(len(ml))) 302
303 buf := bytes.NewBuffer(make([]byte, 0, size))
304
305 binary.Write(buf, binary.LittleEndian, wkbNDR)
306 binary.Write(buf, binary.LittleEndian, wkbMultiLineStringZ)
307 binary.Write(buf, binary.LittleEndian, uint32(len(mls)))
308
309 for _, ml := range mls {
310 binary.Write(buf, binary.LittleEndian, wkbNDR)
311 binary.Write(buf, binary.LittleEndian, wkbLineStringZ)
312 binary.Write(buf, binary.LittleEndian, uint32(len(ml)))
307 for _, p := range ml { 313 for _, p := range ml {
308 binary.Write(&buf, binary.LittleEndian, math.Float64bits(p.X)) 314 binary.Write(buf, binary.LittleEndian, math.Float64bits(p.X))
309 binary.Write(&buf, binary.LittleEndian, math.Float64bits(p.Y)) 315 binary.Write(buf, binary.LittleEndian, math.Float64bits(p.Y))
310 binary.Write(&buf, binary.LittleEndian, math.Float64bits(p.Z)) 316 binary.Write(buf, binary.LittleEndian, math.Float64bits(p.Z))
311 } 317 }
312 } 318 }
313 319
314 return buf.Bytes() 320 return buf.Bytes()
315 } 321 }