17ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski/* 27ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * Copyright (C) 2016 The Android Open Source Project 37ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * 47ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 57ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * you may not use this file except in compliance with the License. 67ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * You may obtain a copy of the License at 77ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * 87ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 97ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * 107ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * Unless required by applicable law or agreed to in writing, software 117ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 127ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * See the License for the specific language governing permissions and 147ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski * limitations under the License. 157ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski */ 167ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 177ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski#include "benchmark/benchmark.h" 187ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 19da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski#include "android-base/stringprintf.h" 207ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski#include "androidfw/ApkAssets.h" 217ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski#include "androidfw/AssetManager.h" 227ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski#include "androidfw/AssetManager2.h" 237ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski#include "androidfw/ResourceTypes.h" 247ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 25c8f71aa67ea599cb80205496cb67e9e7a121299cAdam Lesinski#include "BenchmarkHelpers.h" 267ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski#include "TestHelpers.h" 277ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski#include "data/basic/R.h" 28da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski#include "data/libclient/R.h" 297ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski#include "data/styles/R.h" 307ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 317ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinskinamespace app = com::android::app; 32da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinskinamespace basic = com::android::basic; 33da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinskinamespace libclient = com::android::libclient; 347ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 357ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinskinamespace android { 367ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 377ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinskiconstexpr const static char* kFrameworkPath = "/system/framework/framework-res.apk"; 387ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 397ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinskistatic void BM_AssetManagerLoadAssets(benchmark::State& state) { 407ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski std::string path = GetTestDataPath() + "/basic/basic.apk"; 417ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski while (state.KeepRunning()) { 420c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski std::unique_ptr<const ApkAssets> apk = ApkAssets::Load(path); 437ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski AssetManager2 assets; 447ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski assets.SetApkAssets({apk.get()}); 457ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski } 467ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski} 477ad1110ecd6a840fcd2895c62668828a1ca029c6Adam LesinskiBENCHMARK(BM_AssetManagerLoadAssets); 487ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 497ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinskistatic void BM_AssetManagerLoadAssetsOld(benchmark::State& state) { 507ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski String8 path((GetTestDataPath() + "/basic/basic.apk").data()); 517ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski while (state.KeepRunning()) { 527ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski AssetManager assets; 537ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski assets.addAssetPath(path, nullptr /* cookie */, false /* appAsLib */, 547ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski false /* isSystemAsset */); 557ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 567ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski // Force creation. 577ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski assets.getResources(true); 587ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski } 597ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski} 607ad1110ecd6a840fcd2895c62668828a1ca029c6Adam LesinskiBENCHMARK(BM_AssetManagerLoadAssetsOld); 617ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 627ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinskistatic void BM_AssetManagerLoadFrameworkAssets(benchmark::State& state) { 637ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski std::string path = kFrameworkPath; 647ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski while (state.KeepRunning()) { 650c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski std::unique_ptr<const ApkAssets> apk = ApkAssets::Load(path); 667ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski AssetManager2 assets; 677ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski assets.SetApkAssets({apk.get()}); 687ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski } 697ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski} 707ad1110ecd6a840fcd2895c62668828a1ca029c6Adam LesinskiBENCHMARK(BM_AssetManagerLoadFrameworkAssets); 717ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 727ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinskistatic void BM_AssetManagerLoadFrameworkAssetsOld(benchmark::State& state) { 737ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski String8 path(kFrameworkPath); 747ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski while (state.KeepRunning()) { 757ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski AssetManager assets; 767ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski assets.addAssetPath(path, nullptr /* cookie */, false /* appAsLib */, 777ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski false /* isSystemAsset */); 787ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 797ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski // Force creation. 807ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski assets.getResources(true); 817ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski } 827ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski} 837ad1110ecd6a840fcd2895c62668828a1ca029c6Adam LesinskiBENCHMARK(BM_AssetManagerLoadFrameworkAssetsOld); 847ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 85da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinskistatic void GetResourceBenchmark(const std::vector<std::string>& paths, 86da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski const ResTable_config* config, uint32_t resid, 87da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski benchmark::State& state) { 880c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski std::vector<std::unique_ptr<const ApkAssets>> apk_assets; 89da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski std::vector<const ApkAssets*> apk_assets_ptrs; 90da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski for (const std::string& path : paths) { 910c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski std::unique_ptr<const ApkAssets> apk = ApkAssets::Load(path); 92da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski if (apk == nullptr) { 93da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski state.SkipWithError(base::StringPrintf("Failed to load assets %s", path.c_str()).c_str()); 94da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski return; 95da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski } 96da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski apk_assets_ptrs.push_back(apk.get()); 97da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski apk_assets.push_back(std::move(apk)); 987ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski } 997ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 100da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski AssetManager2 assetmanager; 101da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski assetmanager.SetApkAssets(apk_assets_ptrs); 102da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski if (config != nullptr) { 103da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski assetmanager.SetConfiguration(*config); 104da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski } 1057ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1067ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski Res_value value; 1077ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ResTable_config selected_config; 1087ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski uint32_t flags; 1097ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1107ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski while (state.KeepRunning()) { 111da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski assetmanager.GetResource(resid, false /* may_be_bag */, 0u /* density_override */, &value, 112da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski &selected_config, &flags); 1137ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski } 1147ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski} 1157ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 116da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinskistatic void BM_AssetManagerGetResource(benchmark::State& state) { 117da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski GetResourceBenchmark({GetTestDataPath() + "/basic/basic.apk"}, nullptr /*config*/, 118da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski basic::R::integer::number1, state); 119da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski} 120da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam LesinskiBENCHMARK(BM_AssetManagerGetResource); 121da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski 122da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinskistatic void BM_AssetManagerGetResourceOld(benchmark::State& state) { 123da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski GetResourceBenchmarkOld({GetTestDataPath() + "/basic/basic.apk"}, nullptr /*config*/, 124da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski basic::R::integer::number1, state); 125da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski} 1267ad1110ecd6a840fcd2895c62668828a1ca029c6Adam LesinskiBENCHMARK(BM_AssetManagerGetResourceOld); 1277ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 128da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinskistatic void BM_AssetManagerGetLibraryResource(benchmark::State& state) { 129da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski GetResourceBenchmark( 130da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski {GetTestDataPath() + "/lib_two/lib_two.apk", GetTestDataPath() + "/lib_one/lib_one.apk", 131da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski GetTestDataPath() + "/libclient/libclient.apk"}, 132da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski nullptr /*config*/, libclient::R::string::foo_one, state); 133da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski} 134da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam LesinskiBENCHMARK(BM_AssetManagerGetLibraryResource); 1357ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 136da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinskistatic void BM_AssetManagerGetLibraryResourceOld(benchmark::State& state) { 137da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski GetResourceBenchmarkOld( 138da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski {GetTestDataPath() + "/lib_two/lib_two.apk", GetTestDataPath() + "/lib_one/lib_one.apk", 139da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski GetTestDataPath() + "/libclient/libclient.apk"}, 140da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski nullptr /*config*/, libclient::R::string::foo_one, state); 141da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski} 142da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam LesinskiBENCHMARK(BM_AssetManagerGetLibraryResourceOld); 1437ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 144da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinskiconstexpr static const uint32_t kStringOkId = 0x0104000au; 1457ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 146da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinskistatic void BM_AssetManagerGetResourceFrameworkLocale(benchmark::State& state) { 1477ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ResTable_config config; 1487ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski memset(&config, 0, sizeof(config)); 1497ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski memcpy(config.language, "fr", 2); 150da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski GetResourceBenchmark({kFrameworkPath}, &config, kStringOkId, state); 1517ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski} 1527ad1110ecd6a840fcd2895c62668828a1ca029c6Adam LesinskiBENCHMARK(BM_AssetManagerGetResourceFrameworkLocale); 1537ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1547ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinskistatic void BM_AssetManagerGetResourceFrameworkLocaleOld(benchmark::State& state) { 1557ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski ResTable_config config; 1567ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski memset(&config, 0, sizeof(config)); 1577ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski memcpy(config.language, "fr", 2); 158da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski GetResourceBenchmarkOld({kFrameworkPath}, &config, kStringOkId, state); 1597ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski} 1607ad1110ecd6a840fcd2895c62668828a1ca029c6Adam LesinskiBENCHMARK(BM_AssetManagerGetResourceFrameworkLocaleOld); 1617ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1627ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinskistatic void BM_AssetManagerGetBag(benchmark::State& state) { 1630c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski std::unique_ptr<const ApkAssets> apk = ApkAssets::Load(GetTestDataPath() + "/styles/styles.apk"); 1647ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski if (apk == nullptr) { 1657ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski state.SkipWithError("Failed to load assets"); 1667ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski return; 1677ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski } 1687ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1697ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski AssetManager2 assets; 1707ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski assets.SetApkAssets({apk.get()}); 1717ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1727ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski while (state.KeepRunning()) { 1737ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski const ResolvedBag* bag = assets.GetBag(app::R::style::StyleTwo); 1747ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski const auto bag_end = end(bag); 1757ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski for (auto iter = begin(bag); iter != bag_end; ++iter) { 1767ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski uint32_t key = iter->key; 1777ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski Res_value value = iter->value; 1787ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski benchmark::DoNotOptimize(key); 1797ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski benchmark::DoNotOptimize(value); 1807ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski } 1817ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski } 1827ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski} 1837ad1110ecd6a840fcd2895c62668828a1ca029c6Adam LesinskiBENCHMARK(BM_AssetManagerGetBag); 1847ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1857ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinskistatic void BM_AssetManagerGetBagOld(benchmark::State& state) { 1867ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski AssetManager assets; 1877ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski if (!assets.addAssetPath(String8((GetTestDataPath() + "/styles/styles.apk").data()), 188da431a22da38f9c4085b5d71ed9a9c6122c6a5a6Adam Lesinski nullptr /*cookie*/, false /*appAsLib*/, false /*isSystemAssets*/)) { 1897ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski state.SkipWithError("Failed to load assets"); 1907ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski return; 1917ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski } 1927ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1937ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski const ResTable& table = assets.getResources(true); 1947ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 1957ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski while (state.KeepRunning()) { 1967ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski const ResTable::bag_entry* bag_begin; 1977ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski const ssize_t N = table.lockBag(app::R::style::StyleTwo, &bag_begin); 1987ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski const ResTable::bag_entry* const bag_end = bag_begin + N; 1997ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski for (auto iter = bag_begin; iter != bag_end; ++iter) { 2007ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski uint32_t key = iter->map.name.ident; 2017ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski Res_value value = iter->map.value; 2027ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski benchmark::DoNotOptimize(key); 2037ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski benchmark::DoNotOptimize(value); 2047ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski } 2057ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski table.unlockBag(bag_begin); 2067ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski } 2077ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski} 2087ad1110ecd6a840fcd2895c62668828a1ca029c6Adam LesinskiBENCHMARK(BM_AssetManagerGetBagOld); 2097ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 2100c40524953f3d36a880f91183302a2ea5c722930Adam Lesinskistatic void BM_AssetManagerGetResourceLocales(benchmark::State& state) { 2110c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski std::unique_ptr<const ApkAssets> apk = ApkAssets::Load(kFrameworkPath); 2120c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski if (apk == nullptr) { 2130c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski state.SkipWithError("Failed to load assets"); 2140c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski return; 2150c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski } 2160c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski 2170c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski AssetManager2 assets; 2180c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski assets.SetApkAssets({apk.get()}); 2190c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski 2200c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski while (state.KeepRunning()) { 2210c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski std::set<std::string> locales = 2220c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski assets.GetResourceLocales(false /*exclude_system*/, true /*merge_equivalent_languages*/); 2230c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski benchmark::DoNotOptimize(locales); 2240c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski } 2250c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski} 2260c40524953f3d36a880f91183302a2ea5c722930Adam LesinskiBENCHMARK(BM_AssetManagerGetResourceLocales); 2270c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski 2280c40524953f3d36a880f91183302a2ea5c722930Adam Lesinskistatic void BM_AssetManagerGetResourceLocalesOld(benchmark::State& state) { 2290c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski AssetManager assets; 2300c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski if (!assets.addAssetPath(String8(kFrameworkPath), nullptr /*cookie*/, false /*appAsLib*/, 2310c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski false /*isSystemAssets*/)) { 2320c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski state.SkipWithError("Failed to load assets"); 2330c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski return; 2340c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski } 2350c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski 2360c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski const ResTable& table = assets.getResources(true); 2370c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski 2380c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski while (state.KeepRunning()) { 2390c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski Vector<String8> locales; 2400c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski table.getLocales(&locales, true /*includeSystemLocales*/, true /*mergeEquivalentLangs*/); 2410c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski benchmark::DoNotOptimize(locales); 2420c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski } 2430c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski} 2440c40524953f3d36a880f91183302a2ea5c722930Adam LesinskiBENCHMARK(BM_AssetManagerGetResourceLocalesOld); 2450c40524953f3d36a880f91183302a2ea5c722930Adam Lesinski 2467ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski} // namespace android 247