1d9f0492fSopenharmony_ci/* 2d9f0492fSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3d9f0492fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4d9f0492fSopenharmony_ci * you may not use this file except in compliance with the License. 5d9f0492fSopenharmony_ci * You may obtain a copy of the License at 6d9f0492fSopenharmony_ci * 7d9f0492fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8d9f0492fSopenharmony_ci * 9d9f0492fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10d9f0492fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11d9f0492fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12d9f0492fSopenharmony_ci * See the License for the specific language governing permissions and 13d9f0492fSopenharmony_ci * limitations under the License. 14d9f0492fSopenharmony_ci */ 15d9f0492fSopenharmony_ci 16d9f0492fSopenharmony_ci#include <benchmark/benchmark.h> 17d9f0492fSopenharmony_ci#include "benchmark_fwk.h" 18d9f0492fSopenharmony_ci#include "init_param.h" 19d9f0492fSopenharmony_ci#include "param_init.h" 20d9f0492fSopenharmony_ci#include "parameter.h" 21d9f0492fSopenharmony_ci#include "sys_param.h" 22d9f0492fSopenharmony_ci 23d9f0492fSopenharmony_ciusing namespace std; 24d9f0492fSopenharmony_ciusing namespace init_benchmark_test; 25d9f0492fSopenharmony_cinamespace { 26d9f0492fSopenharmony_cistatic int g_maxCount = 512; 27d9f0492fSopenharmony_ci} 28d9f0492fSopenharmony_ci 29d9f0492fSopenharmony_cistatic inline int TestRandom(void) 30d9f0492fSopenharmony_ci{ 31d9f0492fSopenharmony_ci return random(); 32d9f0492fSopenharmony_ci} 33d9f0492fSopenharmony_ci 34d9f0492fSopenharmony_cinamespace init_benchmark_param { 35d9f0492fSopenharmony_cistruct LocalParameterTestState { 36d9f0492fSopenharmony_ci explicit LocalParameterTestState(int nprops) noexcept : nprops(nprops), valid(false) 37d9f0492fSopenharmony_ci { 38d9f0492fSopenharmony_ci static const char paramNameChars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_."; 39d9f0492fSopenharmony_ci if (g_maxCount < nprops) { 40d9f0492fSopenharmony_ci fprintf(stderr, "Invalid nprops %d\n", nprops); 41d9f0492fSopenharmony_ci return; 42d9f0492fSopenharmony_ci } 43d9f0492fSopenharmony_ci names = new char *[nprops]; 44d9f0492fSopenharmony_ci nameLens = new int[nprops]; 45d9f0492fSopenharmony_ci values = new char *[nprops]; 46d9f0492fSopenharmony_ci valueLens = new int[nprops]; 47d9f0492fSopenharmony_ci 48d9f0492fSopenharmony_ci srandom(nprops); 49d9f0492fSopenharmony_ci int count = 0; 50d9f0492fSopenharmony_ci for (int i = 0; i < nprops; i++) { 51d9f0492fSopenharmony_ci // Make sure the name has at least 10 characters to make 52d9f0492fSopenharmony_ci // it very unlikely to generate the same TestRandom name. 53d9f0492fSopenharmony_ci nameLens[i] = (TestRandom() % (PARAM_NAME_LEN_MAX - 10)) + 10; // 10 name len 54d9f0492fSopenharmony_ci names[i] = new char[PARAM_NAME_LEN_MAX + 1]; 55d9f0492fSopenharmony_ci size_t paramNameLen = sizeof(paramNameChars) - 1; 56d9f0492fSopenharmony_ci for (int j = 0; j < nameLens[i]; j++) { 57d9f0492fSopenharmony_ci if (j == 0 || names[i][j - 1] == '.' || j == nameLens[i] - 1) { 58d9f0492fSopenharmony_ci // Certain values are not allowed: 59d9f0492fSopenharmony_ci // - Don't start name with '.' 60d9f0492fSopenharmony_ci // - Don't allow '.' to appear twice in a row 61d9f0492fSopenharmony_ci // - Don't allow the name to end with '.' 62d9f0492fSopenharmony_ci // This assumes that '.' is the last character in the 63d9f0492fSopenharmony_ci // array so that decrementing the length by one removes 64d9f0492fSopenharmony_ci // the value from the possible values. 65d9f0492fSopenharmony_ci paramNameLen--; 66d9f0492fSopenharmony_ci } 67d9f0492fSopenharmony_ci names[i][j] = paramNameChars[TestRandom() % paramNameLen]; 68d9f0492fSopenharmony_ci } 69d9f0492fSopenharmony_ci names[i][nameLens[i]] = 0; 70d9f0492fSopenharmony_ci 71d9f0492fSopenharmony_ci // Make sure the value contains at least 1 character. 72d9f0492fSopenharmony_ci valueLens[i] = (TestRandom() % (PARAM_VALUE_LEN_MAX - 1)) + 1; 73d9f0492fSopenharmony_ci values[i] = new char[PARAM_VALUE_LEN_MAX]; 74d9f0492fSopenharmony_ci for (int j = 0; j < valueLens[i]; j++) { 75d9f0492fSopenharmony_ci values[i][j] = paramNameChars[TestRandom() % (sizeof(paramNameChars) - 1)]; 76d9f0492fSopenharmony_ci } 77d9f0492fSopenharmony_ci 78d9f0492fSopenharmony_ci if (SystemSetParameter(names[i], values[i]) != 0) { 79d9f0492fSopenharmony_ci count++; 80d9f0492fSopenharmony_ci } 81d9f0492fSopenharmony_ci } 82d9f0492fSopenharmony_ci if (count > 0) { 83d9f0492fSopenharmony_ci fprintf(stderr, "Failed to add a property, count %d\n", count); 84d9f0492fSopenharmony_ci } 85d9f0492fSopenharmony_ci valid = true; 86d9f0492fSopenharmony_ci } 87d9f0492fSopenharmony_ci 88d9f0492fSopenharmony_ci LocalParameterTestState(const LocalParameterTestState&) = delete; 89d9f0492fSopenharmony_ci LocalParameterTestState & operator=(const LocalParameterTestState&) = delete; 90d9f0492fSopenharmony_ci 91d9f0492fSopenharmony_ci ~LocalParameterTestState() noexcept 92d9f0492fSopenharmony_ci { 93d9f0492fSopenharmony_ci for (int i = 0; i < nprops; i++) { 94d9f0492fSopenharmony_ci delete names[i]; 95d9f0492fSopenharmony_ci delete values[i]; 96d9f0492fSopenharmony_ci } 97d9f0492fSopenharmony_ci delete[] names; 98d9f0492fSopenharmony_ci delete[] nameLens; 99d9f0492fSopenharmony_ci delete[] values; 100d9f0492fSopenharmony_ci delete[] valueLens; 101d9f0492fSopenharmony_ci } 102d9f0492fSopenharmony_ci 103d9f0492fSopenharmony_cipublic: 104d9f0492fSopenharmony_ci const int nprops; 105d9f0492fSopenharmony_ci char **names; 106d9f0492fSopenharmony_ci int *nameLens; 107d9f0492fSopenharmony_ci char **values; 108d9f0492fSopenharmony_ci int *valueLens; 109d9f0492fSopenharmony_ci bool valid; 110d9f0492fSopenharmony_ci}; 111d9f0492fSopenharmony_ci} 112d9f0492fSopenharmony_ci 113d9f0492fSopenharmony_cistatic init_benchmark_param::LocalParameterTestState *g_localParamTester = nullptr; 114d9f0492fSopenharmony_ci 115d9f0492fSopenharmony_civoid CreateLocalParameterTest(int max) 116d9f0492fSopenharmony_ci{ 117d9f0492fSopenharmony_ci g_maxCount = max > 0 ? max : g_maxCount; 118d9f0492fSopenharmony_ci g_localParamTester = new init_benchmark_param::LocalParameterTestState(g_maxCount); 119d9f0492fSopenharmony_ci if (g_localParamTester == nullptr) { 120d9f0492fSopenharmony_ci exit(0); 121d9f0492fSopenharmony_ci } 122d9f0492fSopenharmony_ci} 123d9f0492fSopenharmony_ci 124d9f0492fSopenharmony_ci/** 125d9f0492fSopenharmony_ci * @brief for parameter get 126d9f0492fSopenharmony_ci * 127d9f0492fSopenharmony_ci * @param state 128d9f0492fSopenharmony_ci */ 129d9f0492fSopenharmony_cistatic void BMCachedParameterGet(benchmark::State &state) 130d9f0492fSopenharmony_ci{ 131d9f0492fSopenharmony_ci if (g_localParamTester == nullptr || !g_localParamTester->valid) { 132d9f0492fSopenharmony_ci fprintf(stderr, "Invalid nprops %d \n", g_maxCount); 133d9f0492fSopenharmony_ci return; 134d9f0492fSopenharmony_ci } 135d9f0492fSopenharmony_ci 136d9f0492fSopenharmony_ci CachedHandle handle = CachedParameterCreate(g_localParamTester->names[TestRandom() % g_maxCount], "4444444"); 137d9f0492fSopenharmony_ci for (auto _ : state) { 138d9f0492fSopenharmony_ci benchmark::DoNotOptimize(CachedParameterGet(handle)); 139d9f0492fSopenharmony_ci } 140d9f0492fSopenharmony_ci state.SetItemsProcessed(state.iterations()); 141d9f0492fSopenharmony_ci} 142d9f0492fSopenharmony_ci 143d9f0492fSopenharmony_ci/** 144d9f0492fSopenharmony_ci * @brief for parameter get, static handle 145d9f0492fSopenharmony_ci * 146d9f0492fSopenharmony_ci * @param state 147d9f0492fSopenharmony_ci */ 148d9f0492fSopenharmony_cistatic void BMCachedParameterGetChangedStatic(benchmark::State &state) 149d9f0492fSopenharmony_ci{ 150d9f0492fSopenharmony_ci if (g_localParamTester == nullptr || !g_localParamTester->valid) { 151d9f0492fSopenharmony_ci fprintf(stderr, "Invalid nprops %d \n", g_maxCount); 152d9f0492fSopenharmony_ci return; 153d9f0492fSopenharmony_ci } 154d9f0492fSopenharmony_ci 155d9f0492fSopenharmony_ci for (auto _ : state) { 156d9f0492fSopenharmony_ci static CachedHandle handle = CachedParameterCreate( 157d9f0492fSopenharmony_ci g_localParamTester->names[TestRandom() % g_maxCount], "xxxxxx"); 158d9f0492fSopenharmony_ci int changed = 0; 159d9f0492fSopenharmony_ci benchmark::DoNotOptimize(CachedParameterGetChanged(handle, &changed)); 160d9f0492fSopenharmony_ci } 161d9f0492fSopenharmony_ci state.SetItemsProcessed(state.iterations()); 162d9f0492fSopenharmony_ci} 163d9f0492fSopenharmony_ci 164d9f0492fSopenharmony_ci/** 165d9f0492fSopenharmony_ci * @brief for parameter get, global handle 166d9f0492fSopenharmony_ci * 167d9f0492fSopenharmony_ci * @param state 168d9f0492fSopenharmony_ci */ 169d9f0492fSopenharmony_cistatic void BMCachedParameterGetChangedGlobal(benchmark::State &state) 170d9f0492fSopenharmony_ci{ 171d9f0492fSopenharmony_ci if (g_localParamTester == nullptr || !g_localParamTester->valid) { 172d9f0492fSopenharmony_ci fprintf(stderr, "Invalid nprops %d \n", g_maxCount); 173d9f0492fSopenharmony_ci return; 174d9f0492fSopenharmony_ci } 175d9f0492fSopenharmony_ci 176d9f0492fSopenharmony_ci CachedHandle handle = CachedParameterCreate(g_localParamTester->names[TestRandom() % g_maxCount], "xxxxxxxxx"); 177d9f0492fSopenharmony_ci for (auto _ : state) { 178d9f0492fSopenharmony_ci int changed = 0; 179d9f0492fSopenharmony_ci benchmark::DoNotOptimize(CachedParameterGetChanged(handle, &changed)); 180d9f0492fSopenharmony_ci } 181d9f0492fSopenharmony_ci state.SetItemsProcessed(state.iterations()); 182d9f0492fSopenharmony_ci} 183d9f0492fSopenharmony_ci 184d9f0492fSopenharmony_ci/** 185d9f0492fSopenharmony_ci * @brief for parameter get, global handle 186d9f0492fSopenharmony_ci * 187d9f0492fSopenharmony_ci * @param state 188d9f0492fSopenharmony_ci */ 189d9f0492fSopenharmony_cistatic void BMCachedParameterGetChangedGlobal2(benchmark::State &state) 190d9f0492fSopenharmony_ci{ 191d9f0492fSopenharmony_ci if (g_localParamTester == nullptr || !g_localParamTester->valid) { 192d9f0492fSopenharmony_ci fprintf(stderr, "Invalid nprops %d \n", g_maxCount); 193d9f0492fSopenharmony_ci return; 194d9f0492fSopenharmony_ci } 195d9f0492fSopenharmony_ci 196d9f0492fSopenharmony_ci CachedHandle handle = nullptr; 197d9f0492fSopenharmony_ci for (auto _ : state) { 198d9f0492fSopenharmony_ci if (handle == nullptr) { 199d9f0492fSopenharmony_ci handle = CachedParameterCreate(g_localParamTester->names[TestRandom() % g_maxCount], "xxxxxxxxx"); 200d9f0492fSopenharmony_ci } 201d9f0492fSopenharmony_ci int changed = 0; 202d9f0492fSopenharmony_ci benchmark::DoNotOptimize(CachedParameterGetChanged(handle, &changed)); 203d9f0492fSopenharmony_ci } 204d9f0492fSopenharmony_ci state.SetItemsProcessed(state.iterations()); 205d9f0492fSopenharmony_ci} 206d9f0492fSopenharmony_ci 207d9f0492fSopenharmony_ci/** 208d9f0492fSopenharmony_ci * @brief for get 209d9f0492fSopenharmony_ci * data exist 210d9f0492fSopenharmony_ci * 211d9f0492fSopenharmony_ci * @param state 212d9f0492fSopenharmony_ci */ 213d9f0492fSopenharmony_cistatic void BMSystemReadParam(benchmark::State &state) 214d9f0492fSopenharmony_ci{ 215d9f0492fSopenharmony_ci if (g_localParamTester == nullptr || !g_localParamTester->valid) { 216d9f0492fSopenharmony_ci fprintf(stderr, "Invalid nprops %d \n", g_maxCount); 217d9f0492fSopenharmony_ci return; 218d9f0492fSopenharmony_ci } 219d9f0492fSopenharmony_ci { 220d9f0492fSopenharmony_ci char value[PARAM_VALUE_LEN_MAX] = {0}; 221d9f0492fSopenharmony_ci uint32_t len = PARAM_VALUE_LEN_MAX; 222d9f0492fSopenharmony_ci SystemReadParam(g_localParamTester->names[TestRandom() % g_maxCount], value, &len); 223d9f0492fSopenharmony_ci } 224d9f0492fSopenharmony_ci for (auto _ : state) { 225d9f0492fSopenharmony_ci char value[PARAM_VALUE_LEN_MAX] = {0}; 226d9f0492fSopenharmony_ci uint32_t len = PARAM_VALUE_LEN_MAX; 227d9f0492fSopenharmony_ci SystemReadParam(g_localParamTester->names[TestRandom() % g_maxCount], value, &len); 228d9f0492fSopenharmony_ci } 229d9f0492fSopenharmony_ci state.SetItemsProcessed(state.iterations()); 230d9f0492fSopenharmony_ci} 231d9f0492fSopenharmony_ci 232d9f0492fSopenharmony_ci/** 233d9f0492fSopenharmony_ci * @brief for get 234d9f0492fSopenharmony_ci * data not exist 235d9f0492fSopenharmony_ci * 236d9f0492fSopenharmony_ci * @param state 237d9f0492fSopenharmony_ci */ 238d9f0492fSopenharmony_cistatic void BMSystemReadParam_none(benchmark::State &state) 239d9f0492fSopenharmony_ci{ 240d9f0492fSopenharmony_ci if (g_localParamTester == nullptr || !g_localParamTester->valid) { 241d9f0492fSopenharmony_ci fprintf(stderr, "Invalid nprops %d \n", g_maxCount); 242d9f0492fSopenharmony_ci return; 243d9f0492fSopenharmony_ci } 244d9f0492fSopenharmony_ci { 245d9f0492fSopenharmony_ci char value[PARAM_VALUE_LEN_MAX] = {0}; 246d9f0492fSopenharmony_ci uint32_t len = PARAM_VALUE_LEN_MAX; 247d9f0492fSopenharmony_ci SystemReadParam("test.aaa.aaa.aaa", value, &len); 248d9f0492fSopenharmony_ci } 249d9f0492fSopenharmony_ci for (auto _ : state) { 250d9f0492fSopenharmony_ci char value[PARAM_VALUE_LEN_MAX] = {0}; 251d9f0492fSopenharmony_ci uint32_t len = PARAM_VALUE_LEN_MAX; 252d9f0492fSopenharmony_ci SystemReadParam("test.aaa.aaa.aaa", value, &len); 253d9f0492fSopenharmony_ci } 254d9f0492fSopenharmony_ci state.SetItemsProcessed(state.iterations()); 255d9f0492fSopenharmony_ci} 256d9f0492fSopenharmony_ci 257d9f0492fSopenharmony_ci/** 258d9f0492fSopenharmony_ci * @brief for find 259d9f0492fSopenharmony_ci * 260d9f0492fSopenharmony_ci * @param state 261d9f0492fSopenharmony_ci */ 262d9f0492fSopenharmony_cistatic void BMSystemFindParameter(benchmark::State &state) 263d9f0492fSopenharmony_ci{ 264d9f0492fSopenharmony_ci if (g_localParamTester == nullptr || !g_localParamTester->valid) { 265d9f0492fSopenharmony_ci fprintf(stderr, "Invalid nprops %d \n", g_maxCount); 266d9f0492fSopenharmony_ci return; 267d9f0492fSopenharmony_ci } 268d9f0492fSopenharmony_ci 269d9f0492fSopenharmony_ci for (auto _ : state) { 270d9f0492fSopenharmony_ci ParamHandle handle = 0; 271d9f0492fSopenharmony_ci SystemFindParameter(g_localParamTester->names[TestRandom() % g_maxCount], &handle); 272d9f0492fSopenharmony_ci } 273d9f0492fSopenharmony_ci state.SetItemsProcessed(state.iterations()); 274d9f0492fSopenharmony_ci} 275d9f0492fSopenharmony_ci 276d9f0492fSopenharmony_ci/** 277d9f0492fSopenharmony_ci * @brief for find, and read value 278d9f0492fSopenharmony_ci * 279d9f0492fSopenharmony_ci * @param state 280d9f0492fSopenharmony_ci */ 281d9f0492fSopenharmony_cistatic void BMSystemGetParameterValue(benchmark::State &state) 282d9f0492fSopenharmony_ci{ 283d9f0492fSopenharmony_ci if (g_localParamTester == nullptr || !g_localParamTester->valid) { 284d9f0492fSopenharmony_ci fprintf(stderr, "Invalid nprops %d \n", g_maxCount); 285d9f0492fSopenharmony_ci return; 286d9f0492fSopenharmony_ci } 287d9f0492fSopenharmony_ci 288d9f0492fSopenharmony_ci ParamHandle *handle = new ParamHandle[g_maxCount]; 289d9f0492fSopenharmony_ci for (int i = 0; i < g_maxCount; ++i) { 290d9f0492fSopenharmony_ci SystemFindParameter(g_localParamTester->names[TestRandom() % g_maxCount], &handle[i]); 291d9f0492fSopenharmony_ci } 292d9f0492fSopenharmony_ci 293d9f0492fSopenharmony_ci int i = 0; 294d9f0492fSopenharmony_ci char value[PARAM_VALUE_LEN_MAX]; 295d9f0492fSopenharmony_ci for (auto _ : state) { 296d9f0492fSopenharmony_ci uint32_t len = PARAM_VALUE_LEN_MAX; 297d9f0492fSopenharmony_ci SystemGetParameterValue(handle[i], value, &len); 298d9f0492fSopenharmony_ci i = (i + 1) % g_maxCount; 299d9f0492fSopenharmony_ci } 300d9f0492fSopenharmony_ci state.SetItemsProcessed(state.iterations()); 301d9f0492fSopenharmony_ci delete[] handle; 302d9f0492fSopenharmony_ci} 303d9f0492fSopenharmony_ci 304d9f0492fSopenharmony_ci/** 305d9f0492fSopenharmony_ci * @brief for find, and read commit id 306d9f0492fSopenharmony_ci * 307d9f0492fSopenharmony_ci * @param state 308d9f0492fSopenharmony_ci */ 309d9f0492fSopenharmony_cistatic void BMSystemGetParameterCommitId(benchmark::State &state) 310d9f0492fSopenharmony_ci{ 311d9f0492fSopenharmony_ci if (g_localParamTester == nullptr || !g_localParamTester->valid) { 312d9f0492fSopenharmony_ci fprintf(stderr, "Invalid nprops %d \n", g_maxCount); 313d9f0492fSopenharmony_ci return; 314d9f0492fSopenharmony_ci } 315d9f0492fSopenharmony_ci 316d9f0492fSopenharmony_ci ParamHandle *handle = new ParamHandle[g_maxCount]; 317d9f0492fSopenharmony_ci for (int i = 0; i < g_maxCount; ++i) { 318d9f0492fSopenharmony_ci SystemFindParameter(g_localParamTester->names[TestRandom() % g_maxCount], &handle[i]); 319d9f0492fSopenharmony_ci } 320d9f0492fSopenharmony_ci 321d9f0492fSopenharmony_ci int i = 0; 322d9f0492fSopenharmony_ci for (auto _ : state) { 323d9f0492fSopenharmony_ci uint32_t commitId = 0; 324d9f0492fSopenharmony_ci SystemGetParameterCommitId(handle[i], &commitId); 325d9f0492fSopenharmony_ci i = (i + 1) % g_maxCount; 326d9f0492fSopenharmony_ci } 327d9f0492fSopenharmony_ci state.SetItemsProcessed(state.iterations()); 328d9f0492fSopenharmony_ci delete[] handle; 329d9f0492fSopenharmony_ci} 330d9f0492fSopenharmony_ci 331d9f0492fSopenharmony_cistatic void BMTestRandom(benchmark::State &state) 332d9f0492fSopenharmony_ci{ 333d9f0492fSopenharmony_ci if (g_localParamTester == nullptr || !g_localParamTester->valid) { 334d9f0492fSopenharmony_ci fprintf(stderr, "Invalid nprops %d \n", g_maxCount); 335d9f0492fSopenharmony_ci return; 336d9f0492fSopenharmony_ci } 337d9f0492fSopenharmony_ci 338d9f0492fSopenharmony_ci for (auto _ : state) { 339d9f0492fSopenharmony_ci benchmark::DoNotOptimize(TestRandom()); 340d9f0492fSopenharmony_ci } 341d9f0492fSopenharmony_ci state.SetItemsProcessed(state.iterations()); 342d9f0492fSopenharmony_ci} 343d9f0492fSopenharmony_ci 344d9f0492fSopenharmony_ciINIT_BENCHMARK(BMCachedParameterGet); 345d9f0492fSopenharmony_ciINIT_BENCHMARK(BMCachedParameterGetChangedStatic); 346d9f0492fSopenharmony_ciINIT_BENCHMARK(BMCachedParameterGetChangedGlobal); 347d9f0492fSopenharmony_ciINIT_BENCHMARK(BMCachedParameterGetChangedGlobal2); 348d9f0492fSopenharmony_ci 349d9f0492fSopenharmony_ciINIT_BENCHMARK(BMSystemReadParam); 350d9f0492fSopenharmony_ciINIT_BENCHMARK(BMSystemReadParam_none); 351d9f0492fSopenharmony_ciINIT_BENCHMARK(BMSystemFindParameter); 352d9f0492fSopenharmony_ciINIT_BENCHMARK(BMSystemGetParameterValue); 353d9f0492fSopenharmony_ciINIT_BENCHMARK(BMSystemGetParameterCommitId); 354d9f0492fSopenharmony_ciINIT_BENCHMARK(BMTestRandom); 355