Skip to content

Use JTS port for overlay/relate operations#682

Merged
peterstace merged 3 commits intomasterfrom
jts
Jan 30, 2026
Merged

Use JTS port for overlay/relate operations#682
peterstace merged 3 commits intomasterfrom
jts

Conversation

@peterstace
Copy link
Owner

@peterstace peterstace commented Jan 29, 2026

Description

Use JTS port for overlay/relate operations.

This is a significant change that:

  • Ports JTS (partially) to Go (see the internal/jtsport/... packages).

  • Uses that port for all relate/overlay operations.

  • Removes the previous DCEL implementation.

The motivation is to improve robustness/correctness of overlay/relate
operations.

Check List

Have you:

  • Added unit tests? Yes.

  • Add cmprefimpl tests? (if appropriate?) Yes.

  • Updated release notes? (if appropriate?) Yes.

Related Issue

Fixes the following:

Benchmark Results

Of note:

  • Slowdown for small size symmetric difference operations.
  • Speedup for all other overlay operations, including medium/large-sized symmetric difference.
Click to expand
goos: linux
goarch: arm64
pkg: github.com/peterstace/simplefeatures/geom
                                                           │ /tmp/tmp.5seLF0Dtd7 │         /tmp/tmp.OyLA0eHLIi         │
                                                           │       sec/op        │    sec/op     vs base               │
LineEnvelope/0-8                                                   2.586n ±   1%   2.618n ±  1%  +1.24% (p=0.001 n=15)
LineEnvelope/1-8                                                   2.422n ±   1%   2.430n ±  1%       ~ (p=0.519 n=15)
LineEnvelope/2-8                                                   2.493n ±   1%   2.494n ±  1%       ~ (p=0.943 n=15)
LineEnvelope/3-8                                                   2.524n ±   1%   2.538n ±  1%       ~ (p=0.395 n=15)
FastMin-8                                                          1.569n ±   1%   1.570n ±  1%       ~ (p=0.910 n=15)
FastMax-8                                                          1.100n ±   1%   1.101n ±  1%       ~ (p=0.878 n=15)
MathMin-8                                                          9.829n ±   0%   9.821n ±  0%       ~ (p=0.559 n=15)
MathMax-8                                                          9.830n ±   0%   9.833n ±  1%       ~ (p=0.290 n=15)
MarshalWKB/polygon/n=10-8                                          116.3n ±  10%   124.4n ±  6%       ~ (p=0.221 n=15)
MarshalWKB/polygon/n=100-8                                         462.9n ±  12%   512.6n ± 23%       ~ (p=0.539 n=15)
MarshalWKB/polygon/n=1000-8                                        3.820µ ±   4%   3.971µ ±  6%       ~ (p=0.187 n=15)
MarshalWKB/polygon/n=10000-8                                       39.84µ ±  10%   43.97µ ± 13%       ~ (p=0.067 n=15)
UnmarshalWKB/polygon/n=10-8                                        155.6n ±  10%   154.7n ±  6%       ~ (p=0.752 n=15)
UnmarshalWKB/polygon/n=100-8                                       573.7n ±   6%   567.1n ± 15%       ~ (p=0.870 n=15)
UnmarshalWKB/polygon/n=1000-8                                      4.162µ ±   9%   4.339µ ±  7%       ~ (p=0.305 n=15)
UnmarshalWKB/polygon/n=10000-8                                     44.49µ ±  13%   46.19µ ± 15%       ~ (p=0.325 n=15)
IntersectsLineStringWithLineString/n=10-8                          1.001µ ±   6%   1.013µ ±  2%       ~ (p=0.616 n=15)
IntersectsLineStringWithLineString/n=100-8                         11.78µ ±   4%   12.27µ ±  4%       ~ (p=0.056 n=15)
IntersectsLineStringWithLineString/n=1000-8                        120.4µ ±   7%   125.1µ ± 11%       ~ (p=0.461 n=15)
IntersectsLineStringWithLineString/n=10000-8                       1.722m ±   3%   1.698m ±  8%       ~ (p=0.935 n=15)
IntersectsMultiPointWithMultiPoint/n=20-8                          487.9n ±   1%   488.6n ±  2%       ~ (p=0.340 n=15)
IntersectsMultiPointWithMultiPoint/n=200-8                         5.372µ ±   2%   5.412µ ±  1%       ~ (p=0.430 n=15)
IntersectsMultiPointWithMultiPoint/n=2000-8                        44.51µ ±   3%   44.24µ ±  2%       ~ (p=0.744 n=15)
IntersectsMultiPointWithMultiPoint/n=20000-8                       499.7µ ±   2%   503.8µ ±  2%       ~ (p=0.305 n=15)
PolygonSingleRingValidation/n=10-8                                 1.261µ ±   2%   1.273µ ±  2%       ~ (p=0.418 n=15)
PolygonSingleRingValidation/n=100-8                                15.54µ ±   2%   15.74µ ±  3%       ~ (p=0.098 n=15)
PolygonSingleRingValidation/n=1000-8                               233.1µ ±   1%   229.9µ ±  5%       ~ (p=0.345 n=15)
PolygonSingleRingValidation/n=10000-8                              3.101m ±   1%   3.058m ±  2%       ~ (p=0.187 n=15)
PolygonMultipleRingsValidation/n=4-8                               3.771µ ±   3%   3.742µ ±  4%       ~ (p=0.967 n=15)
PolygonMultipleRingsValidation/n=36-8                              31.02µ ±   2%   31.06µ ±  2%       ~ (p=0.775 n=15)
PolygonMultipleRingsValidation/n=400-8                             381.9µ ±   1%   387.1µ ±  3%       ~ (p=0.137 n=15)
PolygonMultipleRingsValidation/n=4096-8                            4.716m ±   2%   4.818m ±  3%       ~ (p=0.187 n=15)
PolygonZigZagRingsValidation/n=10-8                                6.158µ ±   2%   6.294µ ±  2%  +2.21% (p=0.016 n=15)
PolygonZigZagRingsValidation/n=100-8                               61.59µ ±   2%   61.22µ ±  3%       ~ (p=0.486 n=15)
PolygonZigZagRingsValidation/n=1000-8                              889.9µ ±   1%   887.1µ ±  2%       ~ (p=0.285 n=15)
PolygonZigZagRingsValidation/n=10000-8                             11.62m ±   1%   11.59m ±  2%       ~ (p=0.539 n=15)
PolygonAnnulusValidation/n=10-8                                    2.018µ ±   1%   2.078µ ±  3%  +2.97% (p=0.003 n=15)
PolygonAnnulusValidation/n=100-8                                   17.74µ ±   2%   18.01µ ±  2%       ~ (p=0.345 n=15)
PolygonAnnulusValidation/n=1000-8                                  250.3µ ±   2%   253.8µ ±  2%       ~ (p=0.106 n=15)
PolygonAnnulusValidation/n=10000-8                                 3.931m ±   2%   4.003m ±  1%  +1.84% (p=0.045 n=15)
MultipolygonValidation/n=1-8                                       640.7n ±   5%   637.8n ±  2%       ~ (p=0.539 n=15)
MultipolygonValidation/n=4-8                                       2.376µ ±   4%   2.373µ ±  3%       ~ (p=0.280 n=15)
MultipolygonValidation/n=16-8                                      9.773µ ±   3%   9.857µ ±  3%       ~ (p=0.319 n=15)
MultipolygonValidation/n=64-8                                      39.91µ ±   3%   39.64µ ±  3%       ~ (p=0.902 n=15)
MultipolygonValidation/n=256-8                                     169.1µ ±   2%   169.0µ ±  2%       ~ (p=0.775 n=15)
MultipolygonValidation/n=1024-8                                    791.9µ ±   2%   799.4µ ±  2%       ~ (p=0.512 n=15)
MultiPolygonTwoCircles/n=10-8                                      4.608µ ±   9%   4.684µ ±  7%       ~ (p=0.976 n=15)
MultiPolygonTwoCircles/n=100-8                                     48.68µ ±   7%   48.68µ ±  6%       ~ (p=0.967 n=15)
MultiPolygonTwoCircles/n=1000-8                                    660.4µ ±   1%   661.3µ ±  2%       ~ (p=0.436 n=15)
MultiPolygonTwoCircles/n=10000-8                                   9.588m ±   2%   9.588m ±  1%       ~ (p=0.595 n=15)
MultiPolygonMultipleTouchingPoints/n=1-8                           4.259µ ±   1%   4.267µ ±  3%       ~ (p=0.267 n=15)
MultiPolygonMultipleTouchingPoints/n=10-8                          28.29µ ±   3%   28.79µ ±  3%       ~ (p=0.870 n=15)
MultiPolygonMultipleTouchingPoints/n=100-8                         345.4µ ±   2%   350.3µ ±  1%       ~ (p=0.202 n=15)
MultiPolygonMultipleTouchingPoints/n=1000-8                        4.326m ±   1%   4.366m ±  1%       ~ (p=0.074 n=15)
WKTParsing/point-8                                                 1.103µ ±   6%   1.139µ ±  5%       ~ (p=0.145 n=15)
DistancePolygonToPolygonOrdering/n=100_swap=false-8                22.54µ ±   2%   22.69µ ±  2%       ~ (p=0.233 n=15)
DistancePolygonToPolygonOrdering/n=100_swap=true-8                 22.18µ ±   2%   22.61µ ±  4%       ~ (p=0.056 n=15)
DistancePolygonToPolygonOrdering/n=1000_swap=false-8               429.1µ ±   1%   431.8µ ±  1%       ~ (p=0.539 n=15)
DistancePolygonToPolygonOrdering/n=1000_swap=true-8                429.3µ ±   1%   430.8µ ±  1%       ~ (p=1.000 n=15)
IntersectionPolygonWithPolygonOrdering/n=100_swap=false-8          3.197µ ±   3%   3.192µ ±  5%       ~ (p=0.361 n=15)
IntersectionPolygonWithPolygonOrdering/n=100_swap=true-8           3.274µ ±   8%   3.279µ ±  9%       ~ (p=0.943 n=15)
IntersectionPolygonWithPolygonOrdering/n=1000_swap=false-8         32.23µ ±   5%   31.72µ ±  5%       ~ (p=0.653 n=15)
IntersectionPolygonWithPolygonOrdering/n=1000_swap=true-8          32.81µ ±   6%   31.94µ ±  6%       ~ (p=0.595 n=15)
MultiLineStringIsSimpleManyLineStrings/n=100-8                     25.12µ ±   7%   25.08µ ±  7%       ~ (p=0.567 n=15)
MultiLineStringIsSimpleManyLineStrings/n=1000-8                    276.4µ ±   1%   285.1µ ±  2%  +3.13% (p=0.002 n=15)
ForceCWandForceCCW/0-8                                             13.21n ±   1%   13.41n ±  3%       ~ (p=0.113 n=15)
ForceCWandForceCCW/0#01-8                                          103.7n ±   1%   103.0n ±  2%       ~ (p=0.418 n=15)
ForceCWandForceCCW/1-8                                             13.64n ± 641%   13.59n ±  1%       ~ (p=0.675 n=15)
ForceCWandForceCCW/1#01-8                                          103.1n ±  87%   104.2n ±  4%       ~ (p=0.329 n=15)
ForceCWandForceCCW/2-8                                             21.41n ±   1%   21.43n ±  2%       ~ (p=0.690 n=15)
ForceCWandForceCCW/2#01-8                                          158.0n ±   4%   156.5n ±  9%       ~ (p=0.894 n=15)
ForceCWandForceCCW/3-8                                             21.75n ±   2%   21.84n ±  2%       ~ (p=0.229 n=15)
ForceCWandForceCCW/3#01-8                                          156.0n ±   3%   161.3n ±  3%       ~ (p=0.069 n=15)
ForceCWandForceCCW/4-8                                             29.14n ±   2%   29.05n ±  2%       ~ (p=0.616 n=15)
ForceCWandForceCCW/4#01-8                                          239.8n ±  10%   238.8n ±  5%       ~ (p=0.862 n=15)
ForceCWandForceCCW/5-8                                             29.44n ±   1%   29.28n ±  2%       ~ (p=0.862 n=15)
ForceCWandForceCCW/5#01-8                                          239.6n ±   5%   242.2n ±  8%       ~ (p=0.330 n=15)
ForceCWandForceCCW/6-8                                             57.53n ±   2%   57.78n ±  3%       ~ (p=0.894 n=15)
ForceCWandForceCCW/6#01-8                                          397.6n ±   6%   401.3n ±  4%       ~ (p=0.766 n=15)
EnvelopeTransformXY-8                                              9.989n ±   1%   9.980n ±  1%       ~ (p=0.645 n=15)
SequenceEnvelope/10-8                                              27.85n ±   1%   28.06n ±  1%  +0.75% (p=0.019 n=15)
SequenceEnvelope/100-8                                             272.1n ±   0%   272.2n ±  1%       ~ (p=0.383 n=15)
SequenceEnvelope/1000-8                                            2.559µ ±   0%   2.559µ ±  1%       ~ (p=0.660 n=15)
SequenceEnvelope/10000-8                                           25.19µ ±   1%   25.23µ ±  0%       ~ (p=0.506 n=15)
geomean                                                            3.728µ          3.762µ        +0.92%

                                                           │ /tmp/tmp.5seLF0Dtd7 │          /tmp/tmp.OyLA0eHLIi          │
                                                           │        B/op         │     B/op      vs base                 │
LineEnvelope/0-8                                                    0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=15) ¹
LineEnvelope/1-8                                                    0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=15) ¹
LineEnvelope/2-8                                                    0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=15) ¹
LineEnvelope/3-8                                                    0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=15) ¹
FastMin-8                                                           0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=15) ¹
FastMax-8                                                           0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=15) ¹
MathMin-8                                                           0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=15) ¹
MathMax-8                                                           0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=15) ¹
MarshalWKB/polygon/n=10-8                                           232.0 ± 0%       232.0 ± 0%       ~ (p=1.000 n=15) ¹
MarshalWKB/polygon/n=100-8                                        1.789Ki ± 0%     1.789Ki ± 0%       ~ (p=1.000 n=15) ¹
MarshalWKB/polygon/n=1000-8                                       16.04Ki ± 0%     16.04Ki ± 0%       ~ (p=1.000 n=15) ¹
MarshalWKB/polygon/n=10000-8                                      160.0Ki ± 0%     160.0Ki ± 0%       ~ (p=0.172 n=15)
UnmarshalWKB/polygon/n=10-8                                         272.0 ± 0%       272.0 ± 0%       ~ (p=1.000 n=15) ¹
UnmarshalWKB/polygon/n=100-8                                      1.844Ki ± 0%     1.844Ki ± 0%       ~ (p=1.000 n=15) ¹
UnmarshalWKB/polygon/n=1000-8                                     16.09Ki ± 0%     16.09Ki ± 0%       ~ (p=1.000 n=15) ¹
UnmarshalWKB/polygon/n=10000-8                                    160.1Ki ± 0%     160.1Ki ± 0%       ~ (p=1.000 n=15)
IntersectsLineStringWithLineString/n=10-8                         1.953Ki ± 0%     1.953Ki ± 0%       ~ (p=1.000 n=15) ¹
IntersectsLineStringWithLineString/n=100-8                        21.02Ki ± 0%     21.02Ki ± 0%       ~ (p=1.000 n=15) ¹
IntersectsLineStringWithLineString/n=1000-8                       173.3Ki ± 0%     173.3Ki ± 0%       ~ (p=1.000 n=15)
IntersectsLineStringWithLineString/n=10000-8                      2.091Mi ± 0%     2.091Mi ± 0%       ~ (p=0.877 n=15)
IntersectsMultiPointWithMultiPoint/n=20-8                           456.0 ± 0%       456.0 ± 0%       ~ (p=1.000 n=15) ¹
IntersectsMultiPointWithMultiPoint/n=200-8                        3.164Ki ± 0%     3.164Ki ± 0%       ~ (p=1.000 n=15) ¹
IntersectsMultiPointWithMultiPoint/n=2000-8                       53.33Ki ± 0%     53.33Ki ± 0%       ~ (p=1.000 n=15) ¹
IntersectsMultiPointWithMultiPoint/n=20000-8                      426.6Ki ± 0%     426.6Ki ± 0%       ~ (p=0.483 n=15)
PolygonSingleRingValidation/n=10-8                                1.672Ki ± 0%     1.672Ki ± 0%       ~ (p=1.000 n=15) ¹
PolygonSingleRingValidation/n=100-8                               15.02Ki ± 0%     15.02Ki ± 0%       ~ (p=1.000 n=15) ¹
PolygonSingleRingValidation/n=1000-8                              109.5Ki ± 0%     109.5Ki ± 0%       ~ (p=1.000 n=15) ¹
PolygonSingleRingValidation/n=10000-8                             1.466Mi ± 0%     1.466Mi ± 0%       ~ (p=0.120 n=15)
PolygonMultipleRingsValidation/n=4-8                              5.203Ki ± 0%     5.203Ki ± 0%       ~ (p=1.000 n=15) ¹
PolygonMultipleRingsValidation/n=36-8                             42.25Ki ± 0%     42.25Ki ± 0%       ~ (p=1.000 n=15) ¹
PolygonMultipleRingsValidation/n=400-8                            460.4Ki ± 0%     460.4Ki ± 0%       ~ (p=0.241 n=15)
PolygonMultipleRingsValidation/n=4096-8                           4.443Mi ± 0%     4.443Mi ± 0%       ~ (p=0.529 n=15)
PolygonZigZagRingsValidation/n=10-8                               7.703Ki ± 0%     7.703Ki ± 0%       ~ (p=1.000 n=15) ¹
PolygonZigZagRingsValidation/n=100-8                              59.55Ki ± 0%     59.55Ki ± 0%       ~ (p=1.000 n=15) ¹
PolygonZigZagRingsValidation/n=1000-8                             457.5Ki ± 0%     457.5Ki ± 0%       ~ (p=0.741 n=15)
PolygonZigZagRingsValidation/n=10000-8                            5.650Mi ± 0%     5.650Mi ± 0%       ~ (p=0.339 n=15)
PolygonAnnulusValidation/n=10-8                                   3.094Ki ± 0%     3.094Ki ± 0%       ~ (p=1.000 n=15) ¹
PolygonAnnulusValidation/n=100-8                                  22.64Ki ± 0%     22.64Ki ± 0%       ~ (p=1.000 n=15) ¹
PolygonAnnulusValidation/n=1000-8                                 222.1Ki ± 0%     222.1Ki ± 0%       ~ (p=0.483 n=15)
PolygonAnnulusValidation/n=10000-8                                2.787Mi ± 0%     2.787Mi ± 0%       ~ (p=0.530 n=15)
MultipolygonValidation/n=1-8                                        880.0 ± 0%       880.0 ± 0%       ~ (p=1.000 n=15) ¹
MultipolygonValidation/n=4-8                                      3.047Ki ± 0%     3.047Ki ± 0%       ~ (p=1.000 n=15) ¹
MultipolygonValidation/n=16-8                                     12.39Ki ± 0%     12.39Ki ± 0%       ~ (p=1.000 n=15) ¹
MultipolygonValidation/n=64-8                                     50.20Ki ± 0%     50.20Ki ± 0%       ~ (p=1.000 n=15) ¹
MultipolygonValidation/n=256-8                                    200.8Ki ± 0%     200.8Ki ± 0%       ~ (p=0.224 n=15)
MultipolygonValidation/n=1024-8                                   798.3Ki ± 0%     798.3Ki ± 0%       ~ (p=0.155 n=15)
MultiPolygonTwoCircles/n=10-8                                     7.375Ki ± 0%     7.375Ki ± 0%       ~ (p=1.000 n=15) ¹
MultiPolygonTwoCircles/n=100-8                                    66.38Ki ± 0%     66.38Ki ± 0%       ~ (p=1.000 n=15) ¹
MultiPolygonTwoCircles/n=1000-8                                   502.1Ki ± 0%     502.1Ki ± 0%  +0.00% (p=0.017 n=15)
MultiPolygonTwoCircles/n=10000-8                                  6.490Mi ± 0%     6.490Mi ± 0%       ~ (p=0.544 n=15)
MultiPolygonMultipleTouchingPoints/n=1-8                          5.500Ki ± 0%     5.500Ki ± 0%       ~ (p=1.000 n=15) ¹
MultiPolygonMultipleTouchingPoints/n=10-8                         27.30Ki ± 0%     27.30Ki ± 0%       ~ (p=1.000 n=15) ¹
MultiPolygonMultipleTouchingPoints/n=100-8                        216.0Ki ± 0%     216.0Ki ± 0%       ~ (p=0.169 n=15)
MultiPolygonMultipleTouchingPoints/n=1000-8                       2.177Mi ± 0%     2.177Mi ± 0%       ~ (p=0.130 n=15)
WKTParsing/point-8                                                1.731Ki ± 0%     1.731Ki ± 0%       ~ (p=1.000 n=15) ¹
DistancePolygonToPolygonOrdering/n=100_swap=false-8               26.88Ki ± 0%     26.88Ki ± 0%       ~ (p=1.000 n=15) ¹
DistancePolygonToPolygonOrdering/n=100_swap=true-8                26.88Ki ± 0%     26.88Ki ± 0%       ~ (p=1.000 n=15) ¹
DistancePolygonToPolygonOrdering/n=1000_swap=false-8              282.3Ki ± 0%     282.3Ki ± 0%       ~ (p=0.317 n=15)
DistancePolygonToPolygonOrdering/n=1000_swap=true-8               282.3Ki ± 0%     282.3Ki ± 0%       ~ (p=0.249 n=15)
IntersectionPolygonWithPolygonOrdering/n=100_swap=false-8         4.984Ki ± 0%     4.984Ki ± 0%       ~ (p=1.000 n=15) ¹
IntersectionPolygonWithPolygonOrdering/n=100_swap=true-8          4.984Ki ± 0%     4.984Ki ± 0%       ~ (p=1.000 n=15) ¹
IntersectionPolygonWithPolygonOrdering/n=1000_swap=false-8        50.02Ki ± 0%     50.02Ki ± 0%       ~ (p=0.731 n=15)
IntersectionPolygonWithPolygonOrdering/n=1000_swap=true-8         50.02Ki ± 0%     50.02Ki ± 0%       ~ (p=0.420 n=15)
MultiLineStringIsSimpleManyLineStrings/n=100-8                    39.77Ki ± 0%     39.77Ki ± 0%       ~ (p=1.000 n=15) ¹
MultiLineStringIsSimpleManyLineStrings/n=1000-8                   359.3Ki ± 0%     359.3Ki ± 0%       ~ (p=1.000 n=15)
ForceCWandForceCCW/0-8                                              0.000 ± 0%       0.000 ± 0%       ~ (p=0.598 n=15)
ForceCWandForceCCW/0#01-8                                           144.0 ± 0%       144.0 ± 0%       ~ (p=0.598 n=15)
ForceCWandForceCCW/1-8                                              0.000 ±  ?       0.000 ± 0%       ~ (p=0.330 n=15)
ForceCWandForceCCW/1#01-8                                           144.0 ±  ?       144.0 ± 0%       ~ (p=0.330 n=15)
ForceCWandForceCCW/2-8                                              0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=15)
ForceCWandForceCCW/2#01-8                                           256.0 ± 0%       256.0 ± 0%       ~ (p=1.000 n=15)
ForceCWandForceCCW/3-8                                              0.000 ± 0%       0.000 ± 0%       ~ (p=0.483 n=15)
ForceCWandForceCCW/3#01-8                                           256.0 ± 0%       256.0 ± 0%       ~ (p=0.483 n=15)
ForceCWandForceCCW/4-8                                              0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=15)
ForceCWandForceCCW/4#01-8                                           416.0 ± 0%       416.0 ± 0%       ~ (p=1.000 n=15)
ForceCWandForceCCW/5-8                                              0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=15)
ForceCWandForceCCW/5#01-8                                           416.0 ± 0%       416.0 ± 0%       ~ (p=1.000 n=15)
ForceCWandForceCCW/6-8                                              0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=15)
ForceCWandForceCCW/6#01-8                                           624.0 ± 0%       624.0 ± 0%       ~ (p=1.000 n=15)
EnvelopeTransformXY-8                                               0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=15) ¹
SequenceEnvelope/10-8                                               0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=15) ¹
SequenceEnvelope/100-8                                              0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=15) ¹
SequenceEnvelope/1000-8                                             0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=15) ¹
SequenceEnvelope/10000-8                                            0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=15) ¹
geomean                                                                        ²                 -0.00%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                                           │ /tmp/tmp.5seLF0Dtd7 │         /tmp/tmp.OyLA0eHLIi          │
                                                           │      allocs/op      │  allocs/op   vs base                 │
LineEnvelope/0-8                                                    0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=15) ¹
LineEnvelope/1-8                                                    0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=15) ¹
LineEnvelope/2-8                                                    0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=15) ¹
LineEnvelope/3-8                                                    0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=15) ¹
FastMin-8                                                           0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=15) ¹
FastMax-8                                                           0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=15) ¹
MathMin-8                                                           0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=15) ¹
MathMax-8                                                           0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=15) ¹
MarshalWKB/polygon/n=10-8                                           6.000 ± 0%      6.000 ± 0%       ~ (p=1.000 n=15) ¹
MarshalWKB/polygon/n=100-8                                          6.000 ± 0%      6.000 ± 0%       ~ (p=1.000 n=15) ¹
MarshalWKB/polygon/n=1000-8                                         6.000 ± 0%      6.000 ± 0%       ~ (p=1.000 n=15) ¹
MarshalWKB/polygon/n=10000-8                                        6.000 ± 0%      6.000 ± 0%       ~ (p=1.000 n=15) ¹
UnmarshalWKB/polygon/n=10-8                                         4.000 ± 0%      4.000 ± 0%       ~ (p=1.000 n=15) ¹
UnmarshalWKB/polygon/n=100-8                                        4.000 ± 0%      4.000 ± 0%       ~ (p=1.000 n=15) ¹
UnmarshalWKB/polygon/n=1000-8                                       4.000 ± 0%      4.000 ± 0%       ~ (p=1.000 n=15) ¹
UnmarshalWKB/polygon/n=10000-8                                      4.000 ± 0%      4.000 ± 0%       ~ (p=1.000 n=15) ¹
IntersectsLineStringWithLineString/n=10-8                           8.000 ± 0%      8.000 ± 0%       ~ (p=1.000 n=15) ¹
IntersectsLineStringWithLineString/n=100-8                          56.00 ± 0%      56.00 ± 0%       ~ (p=1.000 n=15) ¹
IntersectsLineStringWithLineString/n=1000-8                         344.0 ± 0%      344.0 ± 0%       ~ (p=1.000 n=15) ¹
IntersectsLineStringWithLineString/n=10000-8                       5.464k ± 0%     5.464k ± 0%       ~ (p=1.000 n=15) ¹
IntersectsMultiPointWithMultiPoint/n=20-8                           3.000 ± 0%      3.000 ± 0%       ~ (p=1.000 n=15) ¹
IntersectsMultiPointWithMultiPoint/n=200-8                          3.000 ± 0%      3.000 ± 0%       ~ (p=1.000 n=15) ¹
IntersectsMultiPointWithMultiPoint/n=2000-8                         5.000 ± 0%      5.000 ± 0%       ~ (p=1.000 n=15) ¹
IntersectsMultiPointWithMultiPoint/n=20000-8                        33.00 ± 0%      33.00 ± 0%       ~ (p=1.000 n=15) ¹
PolygonSingleRingValidation/n=10-8                                  8.000 ± 0%      8.000 ± 0%       ~ (p=1.000 n=15) ¹
PolygonSingleRingValidation/n=100-8                                 56.00 ± 0%      56.00 ± 0%       ~ (p=1.000 n=15) ¹
PolygonSingleRingValidation/n=1000-8                                344.0 ± 0%      344.0 ± 0%       ~ (p=1.000 n=15) ¹
PolygonSingleRingValidation/n=10000-8                              5.464k ± 0%     5.464k ± 0%       ~ (p=1.000 n=15) ¹
PolygonMultipleRingsValidation/n=4-8                                31.00 ± 0%      31.00 ± 0%       ~ (p=1.000 n=15) ¹
PolygonMultipleRingsValidation/n=36-8                               241.0 ± 0%      241.0 ± 0%       ~ (p=1.000 n=15) ¹
PolygonMultipleRingsValidation/n=400-8                             2.617k ± 0%     2.617k ± 0%       ~ (p=1.000 n=15) ¹
PolygonMultipleRingsValidation/n=4096-8                            25.95k ± 0%     25.95k ± 0%       ~ (p=1.000 n=15) ¹
PolygonZigZagRingsValidation/n=10-8                                 33.00 ± 0%      33.00 ± 0%       ~ (p=1.000 n=15) ¹
PolygonZigZagRingsValidation/n=100-8                                177.0 ± 0%      177.0 ± 0%       ~ (p=1.000 n=15) ¹
PolygonZigZagRingsValidation/n=1000-8                              1.041k ± 0%     1.041k ± 0%       ~ (p=1.000 n=15) ¹
PolygonZigZagRingsValidation/n=10000-8                             16.40k ± 0%     16.40k ± 0%       ~ (p=1.000 n=15) ¹
PolygonAnnulusValidation/n=10-8                                     17.00 ± 0%      17.00 ± 0%       ~ (p=1.000 n=15) ¹
PolygonAnnulusValidation/n=100-8                                    71.00 ± 0%      71.00 ± 0%       ~ (p=1.000 n=15) ¹
PolygonAnnulusValidation/n=1000-8                                   647.0 ± 0%      647.0 ± 0%       ~ (p=1.000 n=15) ¹
PolygonAnnulusValidation/n=10000-8                                 9.527k ± 0%     9.527k ± 0%       ~ (p=1.000 n=15) ¹
MultipolygonValidation/n=1-8                                        6.000 ± 0%      6.000 ± 0%       ~ (p=1.000 n=15) ¹
MultipolygonValidation/n=4-8                                        20.00 ± 0%      20.00 ± 0%       ~ (p=1.000 n=15) ¹
MultipolygonValidation/n=16-8                                       72.00 ± 0%      72.00 ± 0%       ~ (p=1.000 n=15) ¹
MultipolygonValidation/n=64-8                                       281.0 ± 0%      281.0 ± 0%       ~ (p=1.000 n=15) ¹
MultipolygonValidation/n=256-8                                     1.113k ± 0%     1.113k ± 0%       ~ (p=1.000 n=15) ¹
MultipolygonValidation/n=1024-8                                    4.441k ± 0%     4.441k ± 0%       ~ (p=1.000 n=15) ¹
MultiPolygonTwoCircles/n=10-8                                       40.00 ± 0%      40.00 ± 0%       ~ (p=1.000 n=15) ¹
MultiPolygonTwoCircles/n=100-8                                      232.0 ± 0%      232.0 ± 0%       ~ (p=1.000 n=15) ¹
MultiPolygonTwoCircles/n=1000-8                                    1.384k ± 0%     1.384k ± 0%       ~ (p=1.000 n=15) ¹
MultiPolygonTwoCircles/n=10000-8                                   21.86k ± 0%     21.86k ± 0%       ~ (p=0.483 n=15)
MultiPolygonMultipleTouchingPoints/n=1-8                            58.00 ± 0%      58.00 ± 0%       ~ (p=1.000 n=15) ¹
MultiPolygonMultipleTouchingPoints/n=10-8                           321.0 ± 0%      321.0 ± 0%       ~ (p=1.000 n=15) ¹
MultiPolygonMultipleTouchingPoints/n=100-8                         2.778k ± 0%     2.778k ± 0%       ~ (p=1.000 n=15) ¹
MultiPolygonMultipleTouchingPoints/n=1000-8                        27.46k ± 0%     27.46k ± 0%       ~ (p=1.000 n=15) ¹
WKTParsing/point-8                                                  23.00 ± 0%      23.00 ± 0%       ~ (p=1.000 n=15) ¹
DistancePolygonToPolygonOrdering/n=100_swap=false-8                 135.0 ± 0%      135.0 ± 0%       ~ (p=1.000 n=15) ¹
DistancePolygonToPolygonOrdering/n=100_swap=true-8                  135.0 ± 0%      135.0 ± 0%       ~ (p=1.000 n=15) ¹
DistancePolygonToPolygonOrdering/n=1000_swap=false-8               1.173k ± 0%     1.173k ± 0%       ~ (p=1.000 n=15) ¹
DistancePolygonToPolygonOrdering/n=1000_swap=true-8                1.173k ± 0%     1.173k ± 0%       ~ (p=1.000 n=15) ¹
IntersectionPolygonWithPolygonOrdering/n=100_swap=false-8           12.00 ± 0%      12.00 ± 0%       ~ (p=1.000 n=15) ¹
IntersectionPolygonWithPolygonOrdering/n=100_swap=true-8            12.00 ± 0%      12.00 ± 0%       ~ (p=1.000 n=15) ¹
IntersectionPolygonWithPolygonOrdering/n=1000_swap=false-8          60.00 ± 0%      60.00 ± 0%       ~ (p=1.000 n=15) ¹
IntersectionPolygonWithPolygonOrdering/n=1000_swap=true-8           60.00 ± 0%      60.00 ± 0%       ~ (p=1.000 n=15) ¹
MultiLineStringIsSimpleManyLineStrings/n=100-8                      254.0 ± 0%      254.0 ± 0%       ~ (p=1.000 n=15) ¹
MultiLineStringIsSimpleManyLineStrings/n=1000-8                    2.342k ± 0%     2.342k ± 0%       ~ (p=1.000 n=15) ¹
ForceCWandForceCCW/0-8                                              0.000 ± 0%      0.000 ± 0%       ~ (p=0.598 n=15)
ForceCWandForceCCW/0#01-8                                           3.000 ± 0%      3.000 ± 0%       ~ (p=0.598 n=15)
ForceCWandForceCCW/1-8                                              0.000 ±  ?      0.000 ± 0%       ~ (p=0.330 n=15)
ForceCWandForceCCW/1#01-8                                           3.000 ±  ?      3.000 ± 0%       ~ (p=0.330 n=15)
ForceCWandForceCCW/2-8                                              0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=15)
ForceCWandForceCCW/2#01-8                                           4.000 ± 0%      4.000 ± 0%       ~ (p=1.000 n=15)
ForceCWandForceCCW/3-8                                              0.000 ± 0%      0.000 ± 0%       ~ (p=0.483 n=15)
ForceCWandForceCCW/3#01-8                                           4.000 ± 0%      4.000 ± 0%       ~ (p=0.483 n=15)
ForceCWandForceCCW/4-8                                              0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=15)
ForceCWandForceCCW/4#01-8                                           7.000 ± 0%      7.000 ± 0%       ~ (p=1.000 n=15)
ForceCWandForceCCW/5-8                                              0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=15)
ForceCWandForceCCW/5#01-8                                           7.000 ± 0%      7.000 ± 0%       ~ (p=1.000 n=15)
ForceCWandForceCCW/6-8                                              0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=15)
ForceCWandForceCCW/6#01-8                                           12.00 ± 0%      12.00 ± 0%       ~ (p=1.000 n=15)
EnvelopeTransformXY-8                                               0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=15) ¹
SequenceEnvelope/10-8                                               0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=15) ¹
SequenceEnvelope/100-8                                              0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=15) ¹
SequenceEnvelope/1000-8                                             0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=15) ¹
SequenceEnvelope/10000-8                                            0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=15) ¹
geomean                                                                        ²                +0.00%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/peterstace/simplefeatures/internal/perf
                                               │ /tmp/tmp.5seLF0Dtd7 │          /tmp/tmp.OyLA0eHLIi          │
                                               │       sec/op        │    sec/op     vs base                 │
LineStringIsSimpleCircle/n=10-8                          1.049µ ± 2%   1.047µ ±  7%         ~ (p=0.616 n=15)
LineStringIsSimpleCircle/n=100-8                         14.01µ ± 1%   13.80µ ±  4%         ~ (p=0.752 n=15)
LineStringIsSimpleCircle/n=1000-8                        213.5µ ± 3%   212.2µ ±  1%         ~ (p=0.539 n=15)
LineStringIsSimpleCircle/n=10000-8                       2.949m ± 1%   2.953m ±  1%         ~ (p=0.683 n=15)
LineStringIsSimpleZigZag/10-8                            908.3n ± 6%   921.9n ±  9%         ~ (p=0.137 n=15)
LineStringIsSimpleZigZag/100-8                           13.99µ ± 2%   13.81µ ±  2%         ~ (p=0.412 n=15)
LineStringIsSimpleZigZag/1000-8                          198.3µ ± 1%   201.6µ ±  1%    +1.66% (p=0.029 n=15)
LineStringIsSimpleZigZag/10000-8                         2.862m ± 1%   2.881m ±  1%         ~ (p=0.250 n=15)
SetOperation/n=10/Go_Intersection-8                      27.59µ ± 2%   25.47µ ±  2%    -7.68% (p=0.000 n=15)
SetOperation/n=10/Go_Difference-8                        27.67µ ± 4%   22.29µ ±  1%   -19.44% (p=0.000 n=15)
SetOperation/n=10/Go_SymmetricDifference-8               35.16µ ± 3%   74.80µ ±  2%  +112.75% (p=0.000 n=15)
SetOperation/n=10/Go_Union-8                             28.00µ ± 1%   18.97µ ±  2%   -32.27% (p=0.000 n=15)
SetOperation/n=10/GEOS_Intersection-8                    13.25µ ± 1%   13.23µ ±  1%         ~ (p=0.691 n=15)
SetOperation/n=10/GEOS_Difference-8                      12.45µ ± 1%   12.42µ ±  1%         ~ (p=0.976 n=15)
SetOperation/n=10/GEOS_SymmetricDifference-8             12.99µ ± 1%   12.79µ ±  1%    -1.55% (p=0.001 n=15)
SetOperation/n=10/GEOS_Union-8                           11.43µ ± 1%   11.38µ ±  1%         ~ (p=0.202 n=15)
SetOperation/n=100/Go_Intersection-8                    180.76µ ± 2%   85.97µ ±  3%   -52.44% (p=0.000 n=15)
SetOperation/n=100/Go_Difference-8                      187.97µ ± 2%   65.97µ ±  3%   -64.91% (p=0.000 n=15)
SetOperation/n=100/Go_SymmetricDifference-8              248.3µ ± 2%   203.6µ ±  4%   -18.00% (p=0.000 n=15)
SetOperation/n=100/Go_Union-8                           197.67µ ± 2%   49.18µ ±  3%   -75.12% (p=0.000 n=15)
SetOperation/n=100/GEOS_Intersection-8                   29.98µ ± 2%   30.02µ ±  1%         ~ (p=0.838 n=15)
SetOperation/n=100/GEOS_Difference-8                     26.66µ ± 1%   26.39µ ±  3%         ~ (p=0.624 n=15)
SetOperation/n=100/GEOS_SymmetricDifference-8            25.88µ ± 2%   25.77µ ±  1%         ~ (p=0.061 n=15)
SetOperation/n=100/GEOS_Union-8                          22.64µ ± 2%   22.71µ ±  1%         ~ (p=0.595 n=15)
SetOperation/n=1000/Go_Intersection-8                   2021.1µ ± 1%   666.9µ ± 10%   -67.01% (p=0.000 n=15)
SetOperation/n=1000/Go_Difference-8                     2149.9µ ± 1%   474.3µ ±  3%   -77.94% (p=0.000 n=15)
SetOperation/n=1000/Go_SymmetricDifference-8             2.773m ± 1%   1.338m ±  2%   -51.75% (p=0.000 n=15)
SetOperation/n=1000/Go_Union-8                          2265.1µ ± 1%   297.3µ ±  2%   -86.88% (p=0.000 n=15)
SetOperation/n=1000/GEOS_Intersection-8                  167.0µ ± 1%   168.6µ ±  2%         ~ (p=0.345 n=15)
SetOperation/n=1000/GEOS_Difference-8                    142.9µ ± 1%   139.6µ ±  3%         ~ (p=0.098 n=15)
SetOperation/n=1000/GEOS_SymmetricDifference-8           140.0µ ± 2%   141.0µ ±  3%         ~ (p=0.305 n=15)
SetOperation/n=1000/GEOS_Union-8                         118.0µ ± 3%   118.4µ ±  2%         ~ (p=0.486 n=15)
geomean                                                  80.66µ        61.41µ         -23.86%

                                               │ /tmp/tmp.5seLF0Dtd7 │           /tmp/tmp.OyLA0eHLIi           │
                                               │        B/op         │     B/op      vs base                   │
LineStringIsSimpleCircle/n=10-8                         1.422Ki ± 0%   1.422Ki ± 0%         ~ (p=1.000 n=15) ¹
LineStringIsSimpleCircle/n=100-8                        14.77Ki ± 0%   14.77Ki ± 0%         ~ (p=1.000 n=15) ¹
LineStringIsSimpleCircle/n=1000-8                       109.3Ki ± 0%   109.3Ki ± 0%         ~ (p=1.000 n=15) ¹
LineStringIsSimpleCircle/n=10000-8                      1.466Mi ± 0%   1.466Mi ± 0%         ~ (p=0.877 n=15)
LineStringIsSimpleZigZag/10-8                           1.391Ki ± 0%   1.391Ki ± 0%         ~ (p=1.000 n=15) ¹
LineStringIsSimpleZigZag/100-8                          14.77Ki ± 0%   14.77Ki ± 0%         ~ (p=1.000 n=15) ¹
LineStringIsSimpleZigZag/1000-8                         109.3Ki ± 0%   109.3Ki ± 0%         ~ (p=1.000 n=15) ¹
LineStringIsSimpleZigZag/10000-8                        1.466Mi ± 0%   1.466Mi ± 0%         ~ (p=0.811 n=15)
SetOperation/n=10/Go_Intersection-8                     26.44Ki ± 0%   27.92Ki ± 0%    +5.61% (p=0.000 n=15)
SetOperation/n=10/Go_Difference-8                       26.66Ki ± 0%   23.41Ki ± 0%   -12.19% (p=0.000 n=15)
SetOperation/n=10/Go_SymmetricDifference-8              35.40Ki ± 0%   73.77Ki ± 0%  +108.41% (p=0.000 n=15)
SetOperation/n=10/Go_Union-8                            26.87Ki ± 0%   18.83Ki ± 0%   -29.92% (p=0.000 n=15)
SetOperation/n=10/GEOS_Intersection-8                   1.070Ki ± 0%   1.070Ki ± 0%         ~ (p=1.000 n=15) ¹
SetOperation/n=10/GEOS_Difference-8                     1.133Ki ± 0%   1.133Ki ± 0%         ~ (p=1.000 n=15) ¹
SetOperation/n=10/GEOS_SymmetricDifference-8            1.898Ki ± 0%   1.898Ki ± 0%         ~ (p=1.000 n=15) ¹
SetOperation/n=10/GEOS_Union-8                          1.195Ki ± 0%   1.195Ki ± 0%         ~ (p=1.000 n=15) ¹
SetOperation/n=100/Go_Intersection-8                    143.2Ki ± 0%   115.1Ki ± 0%   -19.65% (p=0.000 n=15)
SetOperation/n=100/Go_Difference-8                     149.84Ki ± 0%   80.14Ki ± 0%   -46.51% (p=0.000 n=15)
SetOperation/n=100/Go_SymmetricDifference-8             205.9Ki ± 0%   230.6Ki ± 0%   +11.97% (p=0.000 n=15)
SetOperation/n=100/Go_Union-8                          155.67Ki ± 0%   52.63Ki ± 0%   -66.19% (p=0.000 n=15)
SetOperation/n=100/GEOS_Intersection-8                  6.086Ki ± 0%   6.086Ki ± 0%         ~ (p=0.224 n=15)
SetOperation/n=100/GEOS_Difference-8                    7.336Ki ± 0%   7.336Ki ± 0%         ~ (p=1.000 n=15)
SetOperation/n=100/GEOS_SymmetricDifference-8           11.02Ki ± 0%   11.02Ki ± 0%         ~ (p=1.000 n=15)
SetOperation/n=100/GEOS_Union-8                         8.336Ki ± 0%   8.336Ki ± 0%         ~ (p=1.000 n=15)
SetOperation/n=1000/Go_Intersection-8                  1708.6Ki ± 0%   935.1Ki ± 0%   -45.27% (p=0.000 n=15)
SetOperation/n=1000/Go_Difference-8                    1727.5Ki ± 0%   606.8Ki ± 0%   -64.87% (p=0.000 n=15)
SetOperation/n=1000/Go_SymmetricDifference-8            2.089Mi ± 0%   1.635Mi ± 0%   -21.70% (p=0.000 n=15)
SetOperation/n=1000/Go_Union-8                         1852.8Ki ± 0%   366.9Ki ± 0%   -80.20% (p=0.000 n=15)
SetOperation/n=1000/GEOS_Intersection-8                 53.59Ki ± 0%   53.59Ki ± 0%         ~ (p=1.000 n=15) ¹
SetOperation/n=1000/GEOS_Difference-8                   64.34Ki ± 0%   64.34Ki ± 0%         ~ (p=1.000 n=15)
SetOperation/n=1000/GEOS_SymmetricDifference-8          96.65Ki ± 0%   96.65Ki ± 0%         ~ (p=0.682 n=15)
SetOperation/n=1000/GEOS_Union-8                        74.84Ki ± 0%   74.84Ki ± 0%         ~ (p=1.000 n=15)
geomean                                                 42.92Ki        36.68Ki        -14.53%
¹ all samples are equal

                                               │ /tmp/tmp.5seLF0Dtd7 │           /tmp/tmp.OyLA0eHLIi           │
                                               │      allocs/op      │  allocs/op    vs base                   │
LineStringIsSimpleCircle/n=10-8                           6.000 ± 0%     6.000 ± 0%         ~ (p=1.000 n=15) ¹
LineStringIsSimpleCircle/n=100-8                          54.00 ± 0%     54.00 ± 0%         ~ (p=1.000 n=15) ¹
LineStringIsSimpleCircle/n=1000-8                         342.0 ± 0%     342.0 ± 0%         ~ (p=1.000 n=15) ¹
LineStringIsSimpleCircle/n=10000-8                       5.462k ± 0%    5.462k ± 0%         ~ (p=1.000 n=15) ¹
LineStringIsSimpleZigZag/10-8                             6.000 ± 0%     6.000 ± 0%         ~ (p=1.000 n=15) ¹
LineStringIsSimpleZigZag/100-8                            54.00 ± 0%     54.00 ± 0%         ~ (p=1.000 n=15) ¹
LineStringIsSimpleZigZag/1000-8                           342.0 ± 0%     342.0 ± 0%         ~ (p=1.000 n=15) ¹
LineStringIsSimpleZigZag/10000-8                         5.462k ± 0%    5.462k ± 0%         ~ (p=1.000 n=15) ¹
SetOperation/n=10/Go_Intersection-8                       271.0 ± 0%     658.0 ± 0%  +142.80% (p=0.000 n=15)
SetOperation/n=10/Go_Difference-8                         272.0 ± 0%     541.0 ± 0%   +98.90% (p=0.000 n=15)
SetOperation/n=10/Go_SymmetricDifference-8                369.0 ± 0%    1673.0 ± 0%  +353.39% (p=0.000 n=15)
SetOperation/n=10/Go_Union-8                              277.0 ± 0%     423.0 ± 0%   +52.71% (p=0.000 n=15)
SetOperation/n=10/GEOS_Intersection-8                     23.00 ± 0%     23.00 ± 0%         ~ (p=1.000 n=15) ¹
SetOperation/n=10/GEOS_Difference-8                       23.00 ± 0%     23.00 ± 0%         ~ (p=1.000 n=15) ¹
SetOperation/n=10/GEOS_SymmetricDifference-8              32.00 ± 0%     32.00 ± 0%         ~ (p=1.000 n=15) ¹
SetOperation/n=10/GEOS_Union-8                            23.00 ± 0%     23.00 ± 0%         ~ (p=1.000 n=15) ¹
SetOperation/n=100/Go_Intersection-8                      573.0 ± 0%    2212.0 ± 0%  +286.04% (p=0.000 n=15)
SetOperation/n=100/Go_Difference-8                        598.0 ± 0%    1458.0 ± 0%  +143.81% (p=0.000 n=15)
SetOperation/n=100/Go_SymmetricDifference-8               838.0 ± 0%    4022.0 ± 0%  +379.95% (p=0.000 n=15)
SetOperation/n=100/Go_Union-8                             619.0 ± 0%     796.0 ± 0%   +28.59% (p=0.000 n=15)
SetOperation/n=100/GEOS_Intersection-8                    23.00 ± 0%     23.00 ± 0%         ~ (p=1.000 n=15) ¹
SetOperation/n=100/GEOS_Difference-8                      23.00 ± 0%     23.00 ± 0%         ~ (p=1.000 n=15) ¹
SetOperation/n=100/GEOS_SymmetricDifference-8             32.00 ± 0%     32.00 ± 0%         ~ (p=1.000 n=15) ¹
SetOperation/n=100/GEOS_Union-8                           23.00 ± 0%     23.00 ± 0%         ~ (p=1.000 n=15) ¹
SetOperation/n=1000/Go_Intersection-8                    3.664k ± 0%   17.442k ± 0%  +376.04% (p=0.000 n=15)
SetOperation/n=1000/Go_Difference-8                      3.665k ± 0%   10.356k ± 0%  +182.56% (p=0.000 n=15)
SetOperation/n=1000/Go_SymmetricDifference-8             4.770k ± 0%   26.707k ± 0%  +459.90% (p=0.000 n=15)
SetOperation/n=1000/Go_Union-8                           4.182k ± 0%    4.403k ± 0%    +5.28% (p=0.000 n=15)
SetOperation/n=1000/GEOS_Intersection-8                   23.00 ± 0%     23.00 ± 0%         ~ (p=1.000 n=15) ¹
SetOperation/n=1000/GEOS_Difference-8                     23.00 ± 0%     23.00 ± 0%         ~ (p=1.000 n=15) ¹
SetOperation/n=1000/GEOS_SymmetricDifference-8            32.00 ± 0%     32.00 ± 0%         ~ (p=1.000 n=15) ¹
SetOperation/n=1000/GEOS_Union-8                          23.00 ± 0%     23.00 ± 0%         ~ (p=1.000 n=15) ¹
geomean                                                   152.8          221.9        +45.25%
¹ all samples are equal

pkg: github.com/peterstace/simplefeatures/internal/rawgeos
               │ /tmp/tmp.5seLF0Dtd7 │        /tmp/tmp.OyLA0eHLIi         │
               │       sec/op        │   sec/op     vs base               │
NoOp/n=10-8              1.943µ ± 2%   1.975µ ± 2%       ~ (p=0.100 n=15)
NoOp/n=100-8             5.458µ ± 2%   5.506µ ± 2%       ~ (p=0.324 n=15)
NoOp/n=1000-8            38.97µ ± 2%   39.33µ ± 1%       ~ (p=0.567 n=15)
NoOp/n=10000-8           426.8µ ± 1%   424.0µ ± 1%       ~ (p=0.250 n=15)
geomean                  20.49µ        20.64µ       +0.70%

               │ /tmp/tmp.5seLF0Dtd7 │          /tmp/tmp.OyLA0eHLIi          │
               │        B/op         │     B/op      vs base                 │
NoOp/n=10-8               800.0 ± 0%     800.0 ± 0%       ~ (p=1.000 n=15) ¹
NoOp/n=100-8            5.484Ki ± 0%   5.484Ki ± 0%       ~ (p=1.000 n=15) ¹
NoOp/n=1000-8           48.23Ki ± 0%   48.23Ki ± 0%       ~ (p=1.000 n=15)
NoOp/n=10000-8          480.2Ki ± 0%   480.2Ki ± 0%       ~ (p=0.904 n=15)
geomean                 17.75Ki        17.75Ki       +0.00%
¹ all samples are equal

               │ /tmp/tmp.5seLF0Dtd7 │         /tmp/tmp.OyLA0eHLIi         │
               │      allocs/op      │ allocs/op   vs base                 │
NoOp/n=10-8               15.00 ± 0%   15.00 ± 0%       ~ (p=1.000 n=15) ¹
NoOp/n=100-8              15.00 ± 0%   15.00 ± 0%       ~ (p=1.000 n=15) ¹
NoOp/n=1000-8             15.00 ± 0%   15.00 ± 0%       ~ (p=1.000 n=15) ¹
NoOp/n=10000-8            15.00 ± 0%   15.00 ± 0%       ~ (p=1.000 n=15) ¹
geomean                   15.00        15.00       +0.00%
¹ all samples are equal

pkg: github.com/peterstace/simplefeatures/rtree
                       │ /tmp/tmp.5seLF0Dtd7 │        /tmp/tmp.OyLA0eHLIi         │
                       │       sec/op        │   sec/op     vs base               │
Bulk/n=10-8                      512.4n ± 4%   524.5n ± 7%       ~ (p=0.285 n=15)
Bulk/n=100-8                     7.215µ ± 1%   7.208µ ± 5%       ~ (p=0.894 n=15)
Bulk/n=1000-8                    161.5µ ± 1%   161.4µ ± 1%       ~ (p=1.000 n=15)
Bulk/n=10000-8                   2.303m ± 1%   2.293m ± 1%       ~ (p=0.775 n=15)
Bulk/n=100000-8                  25.80m ± 2%   25.87m ± 2%       ~ (p=0.838 n=15)
RangeSearch/n=10-8               7.943n ± 1%   7.940n ± 1%       ~ (p=0.713 n=15)
RangeSearch/n=100-8              37.10n ± 2%   37.31n ± 1%       ~ (p=0.775 n=15)
RangeSearch/n=1000-8             146.4n ± 1%   145.9n ± 1%       ~ (p=0.675 n=15)
RangeSearch/n=10000-8            531.7n ± 1%   533.1n ± 2%       ~ (p=0.560 n=15)
RangeSearch/n=100000-8           4.479µ ± 2%   4.467µ ± 1%       ~ (p=0.506 n=15)
geomean                          4.531µ        4.541µ       +0.22%

                       │ /tmp/tmp.5seLF0Dtd7 │          /tmp/tmp.OyLA0eHLIi          │
                       │        B/op         │     B/op      vs base                 │
Bulk/n=10-8                   1.016Ki ± 0%     1.016Ki ± 0%       ~ (p=1.000 n=15) ¹
Bulk/n=100-8                  10.77Ki ± 0%     10.77Ki ± 0%       ~ (p=1.000 n=15) ¹
Bulk/n=1000-8                 69.27Ki ± 0%     69.27Ki ± 0%       ~ (p=1.000 n=15) ¹
Bulk/n=10000-8                1.083Mi ± 0%     1.083Mi ± 0%       ~ (p=0.530 n=15)
Bulk/n=100000-8               10.83Mi ± 0%     10.83Mi ± 0%       ~ (p=0.675 n=15)
RangeSearch/n=10-8              0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=15) ¹
RangeSearch/n=100-8             0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=15) ¹
RangeSearch/n=1000-8            0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=15) ¹
RangeSearch/n=10000-8           0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=15) ¹
RangeSearch/n=100000-8          0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=15) ¹
geomean                                    ²                 +0.00%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                       │ /tmp/tmp.5seLF0Dtd7 │         /tmp/tmp.OyLA0eHLIi          │
                       │      allocs/op      │  allocs/op   vs base                 │
Bulk/n=10-8                     5.000 ± 0%      5.000 ± 0%       ~ (p=1.000 n=15) ¹
Bulk/n=100-8                    53.00 ± 0%      53.00 ± 0%       ~ (p=1.000 n=15) ¹
Bulk/n=1000-8                   341.0 ± 0%      341.0 ± 0%       ~ (p=1.000 n=15) ¹
Bulk/n=10000-8                 5.461k ± 0%     5.461k ± 0%       ~ (p=1.000 n=15) ¹
Bulk/n=100000-8                54.61k ± 0%     54.61k ± 0%       ~ (p=1.000 n=15)
RangeSearch/n=10-8              0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=15) ¹
RangeSearch/n=100-8             0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=15) ¹
RangeSearch/n=1000-8            0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=15) ¹
RangeSearch/n=10000-8           0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=15) ¹
RangeSearch/n=100000-8          0.000 ± 0%      0.000 ± 0%       ~ (p=1.000 n=15) ¹
geomean                                    ²                +0.00%                ²
¹ all samples are equal
² summaries must be >0 to compute geomean

@peterstace peterstace self-assigned this Jan 29, 2026
@peterstace peterstace changed the title Update CHANGELOG.md Use JTS port for overlay/relate operations. Jan 29, 2026
@peterstace peterstace changed the title Use JTS port for overlay/relate operations. Use JTS port for overlay/relate operations Jan 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant