About this report
Two things are measured for each service: single-tile request latency via pytest-benchmark, and load/throughput via siege (10 concurrent clients × 200 repeats per URL list). Both run against the services in Docker containers on a GitHub Actions runner, so treat absolute numbers as noisy and focus on the relative comparison between services.
Siege Metrics
- Elapsed time (s)
- Total wall-clock time siege took to run the full request list.
- Response time (s)
- Average time between sending a request and receiving the full response.
- Transaction rate (trans/sec)
- Average number of completed requests per second over the run.
- Concurrency
- Average number of simultaneous connections siege observed while the run was in progress.
Services
- COG | sync: titiler - GDAL for I/O and reprojection
- COG | async: async-titiler - Obstore for I/O, async-geotiff for cog metadata handling and GDAL for reprojection
- GeoZarr | sync (xarray): titiler-eopf - Obstore for I/O, Xarray for data handling and GDAL for reprojection
- GeoZarr | sync (zarr-python): custom app - Obstore for I/O, zarr-python for data handling and GDAL for reprojection
- GeoZarr | async (zarr-python): async-titiler - Obstore for I/O, zarr-python for data handling and GDAL for reprojection
- Mosaic scenario — tiling the same STAC-search mosaic, resolving assets through a STAC API (
titiler-stacapi sync vs. async-titiler-stacapi async).