#include #include #include #include #include #include #include class OfflineDatabase : public benchmark::Fixture { public: void SetUp(const ::benchmark::State&) override { using namespace std::chrono_literals; db.setOfflineMapboxTileCountLimit(100000); response.data = std::make_shared(50 * 1024, 0); response.mustRevalidate = false; response.expires = mbgl::util::now() + 1h; resetAmbientTiles(); resetRegion(); } void resetAmbientTiles() { using namespace mbgl; db.clearTileCache(); for (unsigned i = 0; i < tileCount; ++i) { const Resource ambient = Resource::tile("mapbox://tile_ambient" + util::toString(i), 1, 0, 0, 0, Tileset::Scheme::XYZ); db.put(ambient, response); } } void resetRegion() { using namespace mbgl; auto regions = db.listRegions().value(); if (!regions.empty()) { db.deleteRegion(std::move(regions[0])); } OfflineTilePyramidRegionDefinition definition{ "mapbox://style", LatLngBounds::hull({1, 2}, {3, 4}), 5, 6, 2.0, true }; OfflineRegionMetadata metadata{{ 1, 2, 3 }}; auto region = db.createRegion(definition, metadata); regionID = region->getID(); for (unsigned i = 0; i < tileCount; ++i) { const Resource offline = Resource::tile("mapbox://tile_offline_region" + util::toString(i), 1.0, 0, 0, 0, Tileset::Scheme::XYZ); db.putRegionResource(regionID, offline, response); } } mbgl::Response response; mbgl::OfflineDatabase db{":memory:"}; const unsigned tileCount = 100; int64_t regionID = 0; }; BENCHMARK_F(OfflineDatabase, InvalidateRegion)(benchmark::State& state) { while (state.KeepRunning()) { db.invalidateRegion(regionID); } } BENCHMARK_F(OfflineDatabase, DeleteRegion)(benchmark::State& state) { while (state.KeepRunning()) { resetRegion(); } } BENCHMARK_F(OfflineDatabase, InsertTileRegion)(benchmark::State& state) { using namespace mbgl; while (state.KeepRunning()) { const Resource offline = Resource::tile("mapbox://InsertTileRegion" + util::toString(state.iterations()), 1, 0, 0, 0, Tileset::Scheme::XYZ); db.putRegionResource(regionID, offline, response); } } BENCHMARK_F(OfflineDatabase, InvalidateTileCache)(benchmark::State& state) { while (state.KeepRunning()) { db.invalidateTileCache(); } } BENCHMARK_F(OfflineDatabase, ClearTileCache)(benchmark::State& state) { while (state.KeepRunning()) { resetAmbientTiles(); } } BENCHMARK_F(OfflineDatabase, InsertTileCache)(benchmark::State& state) { using namespace mbgl; while (state.KeepRunning()) { const Resource ambient = Resource::tile("mapbox://InsertTileCache" + util::toString(state.iterations()), 1, 0, 0, 0, Tileset::Scheme::XYZ); db.put(ambient, response); } } BENCHMARK_F(OfflineDatabase, InsertBigTileCache)(benchmark::State& state) { using namespace mbgl; Response big; big.data = std::make_shared(util::DEFAULT_MAX_CACHE_SIZE / 100, 0); while (state.KeepRunning()) { const Resource ambient = Resource::tile("mapbox://InsertTileCache" + util::toString(state.iterations()), 1, 0, 0, 0, Tileset::Scheme::XYZ); db.put(ambient, big); } } BENCHMARK_F(OfflineDatabase, GetTile)(benchmark::State& state) { using namespace mbgl; std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<> dis(0, tileCount - 1); while (state.KeepRunning()) { auto res = db.get(Resource::tile("mapbox://tile_ambient" + util::toString(dis(gen)), 1, 0, 0, 0, Tileset::Scheme::XYZ)); assert(res != nullopt); } }