Skip to content

Benchmarks

manby against tippecanoe 2.82.0, writing PMTiles, with the same tiles. Each figure is the median of three runs, and memory is peak resident memory. How these were measured is at the end.

An Apple M5 Max, 18 cores, 128 GB.

Seconds to make each tileset, on macOSmanbytippecanoe
Points, dropping the densest as needed
3.44 s, 17.8x faster
61.4 s
Points, clustered within 10 pixels, values summed
3.88 s, 14.0x faster
54.4 s
Points, clustering the densest as needed
4.07 s, 14.7x faster
59.8 s
Points, clustered at every zoom, values summed
7.82 s, 11.2x faster
87.7 s
Roads to z14
0.81 s, 14.6x faster
11.8 s
Tracts to z12
3.78 s, 12.3x faster
46.6 s
Tracts, coalescing the densest as needed
2.27 s, 10.9x faster
24.8 s
The figures as a table
BenchmarktippecanoemanbySpeedup
Points, dropping the densest as needed61.4 s3.44 s17.8x
Points, clustered within 10 pixels, values summed54.4 s3.88 s14.0x
Points, clustering the densest as needed59.8 s4.07 s14.7x
Points, clustered at every zoom, values summed87.7 s7.82 s11.2x
Roads to z1411.8 s0.81 s14.6x
Tracts to z1246.6 s3.78 s12.3x
Tracts, coalescing the densest as needed24.8 s2.27 s10.9x
Peak memory in MB, on macOSmanbytippecanoe
Points, dropping the densest as needed
919 MB
2,276 MB
Points, clustered within 10 pixels, values summed
891 MB
1,318 MB
Points, clustering the densest as needed
916 MB
2,330 MB
Points, clustered at every zoom, values summed
1,115 MB
3,443 MB
Roads to z14
177 MB
327 MB
Tracts to z12
338 MB
566 MB
Tracts, coalescing the densest as needed
366 MB
554 MB
The figures as a table
Benchmarktippecanoemanby
Points, dropping the densest as needed2,276 MB919 MB
Points, clustered within 10 pixels, values summed1,318 MB891 MB
Points, clustering the densest as needed2,330 MB916 MB
Points, clustered at every zoom, values summed3,443 MB1,115 MB
Roads to z14327 MB177 MB
Tracts to z12566 MB338 MB
Tracts, coalescing the densest as needed554 MB366 MB

A Lenovo Yoga Slim 7x, Snapdragon X Elite, 12 cores, 32 GB, Arch Linux ARM.

Seconds to make each tileset, on Linuxmanbytippecanoe
Points, dropping the densest as needed
5.86 s, 15.1x faster
88.5 s
Points, clustered within 10 pixels, values summed
6.02 s, 13.7x faster
82.5 s
Points, clustering the densest as needed
6.37 s, 14.1x faster
89.6 s
Points, clustered at every zoom, values summed
13.9 s, 9.6x faster
133.6 s
Roads to z14
1.51 s, 39.1x faster
59 s
Tracts to z12
7.77 s, 25.3x faster
196.8 s
Tracts, coalescing the densest as needed
4.46 s, 8.1x faster
36.1 s
The figures as a table
BenchmarktippecanoemanbySpeedup
Points, dropping the densest as needed88.5 s5.86 s15.1x
Points, clustered within 10 pixels, values summed82.5 s6.02 s13.7x
Points, clustering the densest as needed89.6 s6.37 s14.1x
Points, clustered at every zoom, values summed133.6 s13.9 s9.6x
Roads to z1459 s1.51 s39.1x
Tracts to z12196.8 s7.77 s25.3x
Tracts, coalescing the densest as needed36.1 s4.46 s8.1x
Peak memory in MB, on Linuxmanbytippecanoe
Points, dropping the densest as needed
994 MB
1,088 MB
Points, clustered within 10 pixels, values summed
974 MB
1,028 MB
Points, clustering the densest as needed
1,000 MB
1,165 MB
Points, clustered at every zoom, values summed
1,152 MB
1,498 MB
Roads to z14
236 MB
240 MB
Tracts to z12
360 MB
456 MB
Tracts, coalescing the densest as needed
379 MB
451 MB
The figures as a table
Benchmarktippecanoemanby
Points, dropping the densest as needed1,088 MB994 MB
Points, clustered within 10 pixels, values summed1,028 MB974 MB
Points, clustering the densest as needed1,165 MB1,000 MB
Points, clustered at every zoom, values summed1,498 MB1,152 MB
Roads to z14240 MB236 MB
Tracts to z12456 MB360 MB
Tracts, coalescing the densest as needed451 MB379 MB
  • tippecanoe uses 8 of the 12 cores here, as it rounds its thread count down to a power of 2. manby uses all 12.
  • tippecanoe’s SQLite step is slow on this disk, btrfs compressed with zstd. With its output in memory, the roads take it 27 s rather than 59.
  • Transparent huge pages, on as Arch sets them, add about a tenth to manby’s memory.

With --memory-budget=1G for manby, once each.

Seconds, with a 1 GB memory budget for manbymanbytippecanoe
40 million points, macOS
79 s, 8.3x faster
652 s
40 million points, Linux
121 s, 8.5x faster
1,025 s
The tracts 20 times over, macOS
137 s, 4.1x faster
564 s
The tracts 20 times over, Linux
269 s, 3.2x faster
854 s
The figures as a table
BenchmarktippecanoemanbySpeedup
40 million points, macOS652 s79 s8.3x
40 million points, Linux1,025 s121 s8.5x
The tracts 20 times over, macOS564 s137 s4.1x
The tracts 20 times over, Linux854 s269 s3.2x
Peak memory in MB, with a 1 GB memory budget for manbymanbytippecanoe
40 million points, macOS
1,139 MB
10,206 MB
40 million points, Linux
1,188 MB
6,379 MB
The tracts 20 times over, macOS
1,022 MB
4,810 MB
The tracts 20 times over, Linux
1,206 MB
3,730 MB
The figures as a table
Benchmarktippecanoemanby
40 million points, macOS10,206 MB1,139 MB
40 million points, Linux6,379 MB1,188 MB
The tracts 20 times over, macOS4,810 MB1,022 MB
The tracts 20 times over, Linux3,730 MB1,206 MB

tylertoo makes tiles of its own, not tippecanoe’s (how), so this compares time on the same features rather than the same output. Both made the same zoom levels with a 500 kB tile size limit.

Seconds to make each tileset, on macOSmanbytylertoo
Points to z6, dropping the densest as needed
3.98 s
5.61 s
Roads to z14, dropping the densest as needed
0.89 s
1.85 s
Tracts to z12
4.07 s
3.39 s
Tracts to z7, coalescing the densest as needed
2.69 s
0.9 s
The figures as a table
Benchmarktylertoomanby
Points to z6, dropping the densest as needed5.61 s3.98 s
Roads to z14, dropping the densest as needed1.85 s0.89 s
Tracts to z123.39 s4.07 s
Tracts to z7, coalescing the densest as needed0.9 s2.69 s
Peak memory in MB, on macOSmanbytylertoo
Points to z6, dropping the densest as needed
913 MB
1,329 MB
Roads to z14, dropping the densest as needed
180 MB
1,447 MB
Tracts to z12
342 MB
1,420 MB
Tracts to z7, coalescing the densest as needed
377 MB
1,139 MB
The figures as a table
Benchmarktylertoomanby
Points to z6, dropping the densest as needed1,329 MB913 MB
Roads to z14, dropping the densest as needed1,447 MB180 MB
Tracts to z121,420 MB342 MB
Tracts to z7, coalescing the densest as needed1,139 MB377 MB
  • tylertoo is faster on the tracts, three times at z7 and 1.2 times at z12. It fits each tile on its own, where tippecanoe, and so manby, keeps one threshold for a whole zoom level and makes the level again until every tile fits.
  • Its tiles hold more. At z5 they have 61,746 tract polygons, where tippecanoe’s have 17,094.
  • At its defaults it thins points more, keeping 1,094 at z0 where tippecanoe keeps 16,384.

Joining tilesets has manby join against tile-join.

For every run the tiles decode to exactly what tippecanoe makes, with one exception, which comes from tippecanoe’s own builds. Differences from tippecanoe explains it.

  • tippecanoe is the C++ built with its own Makefile. Its runs and manby’s come from separate sessions on the same machine, as tippecanoe’s do not change with manby’s version.
  • tylertoo is its main branch, 6c3cec4, as its release 0.8.0 does not have the size options yet. It read GeoParquet made from the GeoJSON with DuckDB, and alternated with manby in one session, so manby’s figures there differ a little from those above. manby took the same time from FlatGeobuf as from GeoJSON.
  • The data. The points are 4 million clustered random points (556 MB), or 40 million (5.6 GB), from bench/points.py. The roads are the 17,522 US primary roads of TIGER/Line 2024, 122,725 tiles at z14. The tracts are the 85,186 census tracts of the Census cartographic boundaries 2023, 312,073 tiles at z12, and 20 times over, moved north and south by bench/repeat.py.
  • The scripts are in bench/.

Each command runs as tippecanoe -f -o out.pmtiles or manby -f -o out.pmtiles, followed by these options.

Benchmark Options and input
Points, dropping the densest as needed -zg --drop-densest-as-needed -P points4m.geojsonl
Points, clustered within 10 pixels, values summed -zg -r1 --cluster-distance=10 --cluster-densest-as-needed --accumulate-attribute=value:sum -P points4m.geojsonl
Points, clustering the densest as needed -zg --cluster-densest-as-needed -P points4m.geojsonl
Points, clustered at every zoom, values summed -zg -r1 --cluster-densest-as-needed --accumulate-attribute=value:sum -P points4m.geojsonl
Roads to z14 -z14 -Z0 --drop-densest-as-needed -P tl_2024_us_primaryroads.geojsonl
Tracts to z12 -z12 -Z0 --coalesce-densest-as-needed -P cb_2023_us_tract_500k.geojsonl
Tracts, coalescing the densest as needed -zg --coalesce-densest-as-needed -P cb_2023_us_tract_500k.geojsonl
40 million points --memory-budget=1G -zg --drop-densest-as-needed -P points40m.geojsonl (budget for manby only)
The tracts 20 times over --memory-budget=1G -zg --coalesce-densest-as-needed -P tracts20.geojsonl (budget for manby only)

tylertoo ran as tylertoo tiles with --max-zoom 6 --size-valve drop for the points, --max-zoom 14 --size-valve drop for the roads, and --max-zoom 12 or --max-zoom 7 for the tracts, whose default size valve merges the densest polygons.