paulmach / orb

Types and utilities for working with 2d geometry in Golang
MIT License
886 stars 103 forks source link

encoding/wkt: improve unmarshalling performance #142

Closed paulmach closed 7 months ago

paulmach commented 8 months ago

back in https://github.com/paulmach/orb/pull/128 we started to split strings by regexp to handle white space around parenthesis. This reduced the WKT unmarshalling performance significantly as described in https://github.com/paulmach/orb/issues/132

This PR fine tunes the unmarshalling by making a number of changes, most notably:

The current tests, and a few more, continue to pass, so I think these changes are safe.

Benchmarks show a big improvements.

Benchmarks vs the current master

benchmark                                   old ns/op     new ns/op     delta
BenchmarkUnmarshalPoint-10                  202           97.1          -51.97%
BenchmarkUnmarshalLineString-10             4021          505           -87.43%
BenchmarkUnmarshalLineString_small-10       688           145           -78.96%
BenchmarkUnmarshalPolygon-10                4159          594           -85.71%
BenchmarkUnmarshalMultiPolygon_small-10     2874          1111          -61.34%
BenchmarkUnmarshalMultiPolygon-10           240517        31122         -87.06%

benchmark                                   old allocs     new allocs     delta
BenchmarkUnmarshalPoint-10                  3              1              -66.67%
BenchmarkUnmarshalLineString-10             14             2              -85.71%
BenchmarkUnmarshalLineString_small-10       9              2              -77.78%
BenchmarkUnmarshalPolygon-10                16             3              -81.25%
BenchmarkUnmarshalMultiPolygon_small-10     35             11             -68.57%
BenchmarkUnmarshalMultiPolygon-10           615            36             -94.15%

benchmark                                   old bytes     new bytes     delta
BenchmarkUnmarshalPoint-10                  80            16            -80.00%
BenchmarkUnmarshalLineString-10             779           88            -88.70%
BenchmarkUnmarshalLineString_small-10       459           56            -87.80%
BenchmarkUnmarshalPolygon-10                819           112           -86.32%
BenchmarkUnmarshalMultiPolygon_small-10     2127          788           -62.95%
BenchmarkUnmarshalMultiPolygon-10           51058         5932          -88.38%

Benchmarks vs v0.9.0 (before we started using regexp)

benchmark                                   old ns/op     new ns/op     delta
BenchmarkUnmarshalPoint-10                  201           97.1          -51.78%
BenchmarkUnmarshalLineString_small-10       311           145           -53.44%
BenchmarkUnmarshalLineString-10             796           505           -36.55%
BenchmarkUnmarshalPolygon-10                874           594           -32.00%
BenchmarkUnmarshalMultiPolygon_small-10     1113          1111          -0.18%
BenchmarkUnmarshalMultiPolygon-10           43018         31122         -27.65%

benchmark                                   old allocs     new allocs     delta
BenchmarkUnmarshalPoint-10                  3              1              -66.67%
BenchmarkUnmarshalLineString_small-10       7              2              -71.43%
BenchmarkUnmarshalLineString-10             10             2              -80.00%
BenchmarkUnmarshalPolygon-10                12             3              -75.00%
BenchmarkUnmarshalMultiPolygon_small-10     25             11             -56.00%
BenchmarkUnmarshalMultiPolygon-10           345            36             -89.57%

benchmark                                   old bytes     new bytes     delta
BenchmarkUnmarshalPoint-10                  80            16            -80.00%
BenchmarkUnmarshalLineString_small-10       184           56            -69.57%
BenchmarkUnmarshalLineString-10             440           88            -80.00%
BenchmarkUnmarshalPolygon-10                480           112           -76.67%
BenchmarkUnmarshalMultiPolygon_small-10     752           788           +4.79%
BenchmarkUnmarshalMultiPolygon-10           29664         5932          -80.00%

benchmarks run on my m1 macbook.