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.
The figures as a table
| Benchmark | tippecanoe | manby | Speedup |
|---|---|---|---|
| Points, dropping the densest as needed | 61.4 s | 3.44 s | 17.8x |
| Points, clustered within 10 pixels, values summed | 54.4 s | 3.88 s | 14.0x |
| Points, clustering the densest as needed | 59.8 s | 4.07 s | 14.7x |
| Points, clustered at every zoom, values summed | 87.7 s | 7.82 s | 11.2x |
| Roads to z14 | 11.8 s | 0.81 s | 14.6x |
| Tracts to z12 | 46.6 s | 3.78 s | 12.3x |
| Tracts, coalescing the densest as needed | 24.8 s | 2.27 s | 10.9x |
The figures as a table
| Benchmark | tippecanoe | manby |
|---|---|---|
| Points, dropping the densest as needed | 2,276 MB | 919 MB |
| Points, clustered within 10 pixels, values summed | 1,318 MB | 891 MB |
| Points, clustering the densest as needed | 2,330 MB | 916 MB |
| Points, clustered at every zoom, values summed | 3,443 MB | 1,115 MB |
| Roads to z14 | 327 MB | 177 MB |
| Tracts to z12 | 566 MB | 338 MB |
| Tracts, coalescing the densest as needed | 554 MB | 366 MB |
A Lenovo Yoga Slim 7x, Snapdragon X Elite, 12 cores, 32 GB, Arch Linux ARM.
The figures as a table
| Benchmark | tippecanoe | manby | Speedup |
|---|---|---|---|
| Points, dropping the densest as needed | 88.5 s | 5.86 s | 15.1x |
| Points, clustered within 10 pixels, values summed | 82.5 s | 6.02 s | 13.7x |
| Points, clustering the densest as needed | 89.6 s | 6.37 s | 14.1x |
| Points, clustered at every zoom, values summed | 133.6 s | 13.9 s | 9.6x |
| Roads to z14 | 59 s | 1.51 s | 39.1x |
| Tracts to z12 | 196.8 s | 7.77 s | 25.3x |
| Tracts, coalescing the densest as needed | 36.1 s | 4.46 s | 8.1x |
The figures as a table
| Benchmark | tippecanoe | manby |
|---|---|---|
| Points, dropping the densest as needed | 1,088 MB | 994 MB |
| Points, clustered within 10 pixels, values summed | 1,028 MB | 974 MB |
| Points, clustering the densest as needed | 1,165 MB | 1,000 MB |
| Points, clustered at every zoom, values summed | 1,498 MB | 1,152 MB |
| Roads to z14 | 240 MB | 236 MB |
| Tracts to z12 | 456 MB | 360 MB |
| Tracts, coalescing the densest as needed | 451 MB | 379 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.
Larger than memory
Section titled “Larger than memory”With --memory-budget=1G for manby, once each.
The figures as a table
| Benchmark | tippecanoe | manby | Speedup |
|---|---|---|---|
| 40 million points, macOS | 652 s | 79 s | 8.3x |
| 40 million points, Linux | 1,025 s | 121 s | 8.5x |
| The tracts 20 times over, macOS | 564 s | 137 s | 4.1x |
| The tracts 20 times over, Linux | 854 s | 269 s | 3.2x |
The figures as a table
| Benchmark | tippecanoe | manby |
|---|---|---|
| 40 million points, macOS | 10,206 MB | 1,139 MB |
| 40 million points, Linux | 6,379 MB | 1,188 MB |
| The tracts 20 times over, macOS | 4,810 MB | 1,022 MB |
| The tracts 20 times over, Linux | 3,730 MB | 1,206 MB |
Against tylertoo
Section titled “Against tylertoo”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.
The figures as a table
| Benchmark | tylertoo | manby |
|---|---|---|
| Points to z6, dropping the densest as needed | 5.61 s | 3.98 s |
| Roads to z14, dropping the densest as needed | 1.85 s | 0.89 s |
| Tracts to z12 | 3.39 s | 4.07 s |
| Tracts to z7, coalescing the densest as needed | 0.9 s | 2.69 s |
The figures as a table
| Benchmark | tylertoo | manby |
|---|---|---|
| Points to z6, dropping the densest as needed | 1,329 MB | 913 MB |
| Roads to z14, dropping the densest as needed | 1,447 MB | 180 MB |
| Tracts to z12 | 1,420 MB | 342 MB |
| Tracts to z7, coalescing the densest as needed | 1,139 MB | 377 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
Section titled “Joining”Joining tilesets has manby join against tile-join.
The same tiles
Section titled “The same tiles”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.
How these were measured
Section titled “How these were measured”- 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 bybench/repeat.py. - The scripts are in
bench/.
The commands
Section titled “The commands”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.