Benchmarks
September 28, 2025 · View on GitHub
Here are some benchmarks that measure the performance of the TG library.
- Creating geometries
- Point-in-polygon
- Line segment intersection
- Parsing and writing GeoJSON, WKT, WKB, and Hex
- Memory usage
- Natural and YStripes indexing
- Comparison with the GEOS library
To run these locally:
tests/run.sh bench # run all benchmarks
tests/run.sh bench pip # only point-in-polygon benchmarks
tests/run.sh bench pip_simple # only the simple point-in-polygon benchmarks
tests/run.sh bench intersects # only intersects benchmarks
tests/run.sh bench io # only parsing and writing benchmarks
GEOS_BENCH=1 tests/run.sh bench # include the GEOS library in benchmarks for comparison








Examples of polygons with natural indexing:
Brazil, Texas, Arizona, British Columbia, Rhode Island, Circle-1000, Random-1000, Random-100
Brazil, Texas, Arizona, British Columbia, Rhode Island, Circle-1000, Random-1000, Random-100
$ GEOS_BENCH=1 tests/run.sh bench
CC: cc
CFLAGS: -O3
OS: Linux
CPU: AMD Ryzen 9 5950X 16-Core Processor
Compiler: x86_64-linux-gnu-gcc-11 (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
TG Commit: d29ef5c
GEOS: 3.12.0-9136cb0
BENCHMARKING...
cc -O3 -DGEOS_BENCH -Ilibgeos/build/install/include bmalloc.c ../tg.c \
bench.c -lm bmalloc.cpp libgeos/build/install/lib/libgeos_c.a \
libgeos/build/install/lib/libgeos.a -lm -pthread -lstdc++
SEED=3276435090158169547
RUNS=10
== Point-in-polygon ==
Benchmark point-in-polygon operation for 10K random points that
are each within the polygon's MBR with an extra 10% padding.
Performs 10 runs and chooses the best results.
Brazil ops/sec ns/op points hits built bytes
tg/none 96,944 10315 39914 3257 46.73 µs 638,720
tg/natural 10,143,419 99 39914 3257 53.17 µs 681,360
tg/ystripes 15,174,761 66 39914 3257 884.06 µs 1,059,548
geos/none 29,708 33661 39914 3257 135.18 µs 958,104
geos/prepared 7,885,512 127 39914 3257 2059.94 µs 3,055,496
Texas ops/sec ns/op points hits built bytes
tg/none 298,569 3349 12478 3243 15.97 µs 199,744
tg/natural 12,129,277 82 12478 3243 17.40 µs 213,136
tg/ystripes 22,453,447 45 12478 3243 291.35 µs 355,548
geos/none 95,314 10492 12478 3243 37.19 µs 299,640
geos/prepared 9,868,950 101 12478 3243 559.57 µs 824,168
Arizona ops/sec ns/op points hits built bytes
tg/none 2,303,044 434 1582 6134 3.10 µs 25,408
tg/natural 21,754,688 46 1582 6134 3.81 µs 27,152
tg/ystripes 36,535,749 27 1582 6134 32.42 µs 57,996
geos/none 968,974 1032 1582 6134 5.96 µs 38,136
geos/prepared 16,288,559 61 1582 6134 48.64 µs 103,912
Br Columbia ops/sec ns/op points hits built bytes
tg/none 2,799,001 357 1148 3132 2.15 µs 18,464
tg/natural 16,364,822 61 1148 3132 3.58 µs 19,744
tg/ystripes 20,805,079 48 1148 3132 24.08 µs 29,660
geos/none 966,474 1035 1148 3132 6.20 µs 27,720
geos/prepared 13,332,180 75 1148 3132 60.32 µs 93,496
Rhode Island ops/sec ns/op points hits built bytes
tg/none 16,076,289 62 124 4428 1.60 µs 2,080
tg/natural 28,532,680 35 124 4428 1.91 µs 2,240
tg/ystripes 38,269,197 26 124 4428 4.05 µs 4,412
geos/none 5,196,114 192 124 4428 1.43 µs 3,144
geos/prepared 22,622,998 44 124 4428 11.44 µs 7,896
Circle-50 ops/sec ns/op points hits built bytes
tg/none 23,550,275 42 50 5478 1.19 µs 896
tg/natural 29,330,797 34 50 5478 1.67 µs 992
tg/ystripes 37,349,100 27 50 5478 3.58 µs 2,348
geos/none 6,943,062 144 50 5478 1.43 µs 1,368
geos/prepared 24,657,871 41 50 5478 7.63 µs 3,656
Circle-100 ops/sec ns/op points hits built bytes
tg/none 17,310,375 58 100 5530 1.19 µs 1,696
tg/natural 28,610,532 35 100 5530 1.67 µs 1,840
tg/ystripes 38,586,053 26 100 5530 3.58 µs 4,596
geos/none 5,416,198 185 100 5530 1.67 µs 2,568
geos/prepared 22,429,433 45 100 5530 10.01 µs 6,904
Circle-1000 ops/sec ns/op points hits built bytes
tg/none 3,399,776 294 1000 5502 2.62 µs 16,096
tg/natural 18,616,529 54 1000 5502 3.58 µs 17,216
tg/ystripes 38,164,731 26 1000 5502 18.60 µs 45,172
geos/none 1,092,551 915 1000 5502 6.68 µs 24,168
geos/prepared 17,203,872 58 1000 5502 55.79 µs 60,056
Circle-10000 ops/sec ns/op points hits built bytes
tg/none 382,304 2616 10000 5452 17.40 µs 160,096
tg/natural 14,251,797 70 10000 5452 20.50 µs 170,848
tg/ystripes 32,214,316 31 10000 5452 154.97 µs 450,804
geos/none 119,706 8354 10000 5452 28.37 µs 240,168
geos/prepared 12,101,281 83 10000 5452 521.90 µs 764,696
Random-50 ops/sec ns/op points hits built bytes
tg/none 17,682,563 57 50 2807 1.24 µs 896
tg/natural 22,944,770 44 50 2807 1.43 µs 992
tg/ystripes 23,484,344 43 50 2807 3.10 µs 2,372
geos/none 6,782,509 147 50 2807 1.67 µs 1,368
geos/prepared 17,425,442 57 50 2807 7.39 µs 3,656
Random-100 ops/sec ns/op points hits built bytes
tg/none 11,491,243 87 100 2608 1.19 µs 1,696
tg/natural 18,468,974 54 100 2608 1.67 µs 1,840
tg/ystripes 17,623,126 57 100 2608 4.29 µs 3,812
geos/none 4,869,171 205 100 2608 1.91 µs 2,568
geos/prepared 12,725,436 79 100 2608 10.01 µs 6,904
Random-1000 ops/sec ns/op points hits built bytes
tg/none 1,299,874 769 1000 2468 2.38 µs 16,096
tg/natural 3,374,610 296 1000 2468 3.10 µs 17,216
tg/ystripes 2,880,109 347 1000 2468 27.42 µs 31,260
geos/none 669,385 1494 1000 2468 8.11 µs 24,168
geos/prepared 1,365,244 732 1000 2468 67.23 µs 60,056
Random-10000 ops/sec ns/op points hits built bytes
tg/none 112,685 8874 10000 2298 12.64 µs 160,096
tg/natural 262,932 3803 10000 2298 15.02 µs 170,848
tg/ystripes 290,156 3446 10000 2298 320.91 µs 306,348
geos/none 63,730 15691 10000 2298 47.45 µs 240,168
geos/prepared 120,078 8328 10000 2298 669.48 µs 764,696
== Line intersect ==
Benchmark line intersecting polygon operation for 10K random line
segments that are each no larger than 10% the width of the polygon
and are within the polygon's MBR plus an extra 10% padding.
Performs 10 runs and chooses the best results.
Brazil ops/sec ns/op points hits built bytes
tg/none 27,393 36505 39914 5482 48.40 µs 638,720
tg/natural 2,025,548 494 39914 5482 58.65 µs 681,360
tg/ystripes 2,360,195 424 39914 5482 898.12 µs 1,059,548
geos/none 1,633 612174 39914 5482 106.57 µs 958,104
geos/prepared 1,033,334 968 39914 5482 2002.00 µs 3,055,496
Texas ops/sec ns/op points hits built bytes
tg/none 85,207 11736 12478 5498 13.83 µs 199,744
tg/natural 3,487,406 287 12478 5498 19.31 µs 213,136
tg/ystripes 4,838,278 207 12478 5498 303.51 µs 355,548
geos/none 4,859 205794 12478 5498 32.19 µs 299,640
geos/prepared 2,102,935 476 12478 5498 576.26 µs 824,168
Arizona ops/sec ns/op points hits built bytes
tg/none 1,213,348 824 1582 9148 2.38 µs 25,408
tg/natural 11,545,015 87 1582 9148 3.58 µs 27,152
tg/ystripes 17,281,845 58 1582 9148 32.66 µs 57,996
geos/none 320,391 3121 1582 9148 5.01 µs 38,136
geos/prepared 7,595,624 132 1582 9148 48.88 µs 103,912
Br Columbia ops/sec ns/op points hits built bytes
tg/none 797,138 1254 1148 5287 1.91 µs 18,464
tg/natural 5,992,718 167 1148 5287 2.86 µs 19,744
tg/ystripes 7,455,215 134 1148 5287 25.03 µs 29,660
geos/none 92,491 10812 1148 5287 3.81 µs 27,720
geos/prepared 4,507,580 222 1148 5287 46.49 µs 93,496
Rhode Island ops/sec ns/op points hits built bytes
tg/none 6,161,751 162 124 7119 0.95 µs 2,080
tg/natural 14,027,772 71 124 7119 1.67 µs 2,240
tg/ystripes 16,558,641 60 124 7119 3.34 µs 4,412
geos/none 943,770 1060 124 7119 1.43 µs 3,144
geos/prepared 8,683,859 115 124 7119 9.78 µs 7,896
Circle-100 ops/sec ns/op points hits built bytes
tg/none 8,263,010 121 100 8311 1.00 µs 1,696
tg/natural 14,857,612 67 100 8311 1.19 µs 1,840
tg/ystripes 18,699,527 53 100 8311 3.81 µs 4,596
geos/none 2,353,177 425 100 8311 1.43 µs 2,568
geos/prepared 9,852,722 101 100 8311 8.11 µs 6,904
Circle-1000 ops/sec ns/op points hits built bytes
tg/none 1,545,945 647 1000 8342 1.91 µs 16,096
tg/natural 9,580,411 104 1000 8342 3.10 µs 17,216
tg/ystripes 16,545,577 60 1000 8342 18.36 µs 45,172
geos/none 560,151 1785 1000 8342 3.58 µs 24,168
geos/prepared 7,264,121 138 1000 8342 36.72 µs 60,056
Circle-10000 ops/sec ns/op points hits built bytes
tg/none 169,751 5891 10000 8311 17.17 µs 160,096
tg/natural 5,744,834 174 10000 8311 20.50 µs 170,848
tg/ystripes 8,566,797 117 10000 8311 163.56 µs 450,804
geos/none 64,297 15553 10000 8311 28.61 µs 240,168
geos/prepared 3,221,926 310 10000 8311 507.35 µs 764,696
Random-100 ops/sec ns/op points hits built bytes
tg/none 11,834,943 84 100 2345 1.34 µs 1,696
tg/natural 17,901,425 56 100 2345 1.91 µs 1,840
tg/ystripes 17,939,709 56 100 2345 4.29 µs 3,716
geos/none 4,692,140 213 100 2345 1.91 µs 2,568
geos/prepared 12,542,775 80 100 2345 8.58 µs 6,904
Random-1000 ops/sec ns/op points hits built bytes
tg/none 1,272,080 786 1000 2289 2.15 µs 16,096
tg/natural 3,298,186 303 1000 2289 3.10 µs 17,216
tg/ystripes 2,798,254 357 1000 2289 28.13 µs 31,612
geos/none 652,891 1532 1000 2289 4.05 µs 24,168
geos/prepared 1,340,076 746 1000 2289 45.30 µs 60,056
Random-10000 ops/sec ns/op points hits built bytes
tg/none 113,505 8810 10000 2278 17.17 µs 160,096
tg/natural 265,475 3767 10000 2278 19.07 µs 170,848
tg/ystripes 291,795 3427 10000 2278 329.26 µs 307,116
geos/none 64,085 15604 10000 2278 48.40 µs 240,168
geos/prepared 120,187 8320 10000 2278 673.77 µs 764,696
== I/O ==
Benchmark reading and writing polygons from various formats.
Performs 10 runs and chooses the average.
Brazil ops/sec ns/op MB/sec
tg/wkb/read 28,320 35310 17249
tg/wkb/write 20,982 47660 12779
tg/hex/read 2,138 467515 2605
tg/hex/write 1,308 764370 797
tg/wkt/read 189 5268335 154
tg/wkt/write 283 3525686 173
tg/json/read 151 6611919 134
tg/json/write 284 3509903 174
geos/wkb/read 3,150 317430 1919
geos/wkb/write 833 1199269 508
geos/hex/read 48 20737457 59
geos/hex/write 54 18469691 33
geos/wkt/read 118 8452296 96
geos/wkt/write 205 4875159 125
geos/json/read 64 15405059 58
geos/json/write 124 8047152 76
Texas ops/sec ns/op MB/sec
tg/wkb/read 99,391 10061 18925
tg/wkb/write 242,445 4125 46164
tg/hex/read 6,921 144482 2636
tg/hex/write 4,456 224400 849
tg/wkt/read 593 1685023 150
tg/wkt/write 896 1115942 171
tg/json/read 451 2216625 124
tg/json/write 896 1114845 171
geos/wkb/read 10,212 97919 1945
geos/wkb/write 3,559 280952 678
geos/hex/read 164 6081295 63
geos/hex/write 195 5124617 37
geos/wkt/read 400 2495718 101
geos/wkt/write 678 1474404 129
geos/json/read 206 4837084 57
geos/json/write 408 2446246 78
Arizona ops/sec ns/op MB/sec
tg/wkb/read 635,500 1574 15348
tg/wkb/write 1,747,626 572 42208
tg/hex/read 54,542 18334 2635
tg/hex/write 34,807 28729 841
tg/wkt/read 4,512 221610 148
tg/wkt/write 7,147 139904 173
tg/json/read 3,560 280857 128
tg/json/write 7,189 139093 174
geos/wkb/read 78,840 12684 1904
geos/wkb/write 27,795 35977 671
geos/hex/read 1,315 760078 64
geos/hex/write 1,552 644183 37
geos/wkt/read 3,163 316143 104
geos/wkt/write 5,422 184417 131
geos/json/read 1,606 622559 58
geos/json/write 3,217 310826 78
Br Columbia ops/sec ns/op MB/sec
tg/wkb/read 806,596 1240 14139
tg/wkb/write 2,207,528 453 38697
tg/hex/read 73,973 13518 2593
tg/hex/write 41,775 23937 732
tg/wkt/read 6,433 155425 150
tg/wkt/write 9,894 101066 173
tg/json/read 4,827 207162 124
tg/json/write 10,024 99754 176
geos/wkb/read 107,271 9322 1880
geos/wkb/write 37,617 26584 659
geos/hex/read 1,818 549936 64
geos/hex/write 2,138 467539 37
geos/wkt/read 4,282 233483 100
geos/wkt/write 7,475 133777 131
geos/json/read 2,225 449252 57
geos/json/write 4,265 234437 75
Rhode Island ops/sec ns/op MB/sec
tg/wkb/read 2,796,202 358 5325
tg/wkb/write 8,388,608 119 15976
tg/hex/read 566,797 1764 2159
tg/hex/write 427,990 2337 815
tg/wkt/read 57,221 17476 141
tg/wkt/write 92,589 10800 176
tg/json/read 43,827 22817 119
tg/json/write 91,180 10967 174
geos/wkb/read 806,596 1240 1536
geos/wkb/write 285,326 3505 543
geos/hex/read 16,461 60749 63
geos/hex/write 19,418 51498 37
geos/wkt/read 39,162 25535 97
geos/wkt/write 66,260 15092 126
geos/json/read 19,065 52452 52
geos/json/write 36,503 27394 70