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