Mercurial > gemma
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 } |