1/* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include <benchmark/benchmark.h> 17#include <climits> 18#include <gtest/gtest.h> 19#include "hdf_base.h" 20#include "osal_mem.h" 21#include "v4_0/iaudio_manager.h" 22 23using namespace testing::ext; 24using namespace std; 25 26namespace { 27static const uint32_t g_audioAdapterNumMax = 5; 28const int32_t ITERATION_FREQUENCY = 100; 29const int32_t REPETITION_FREQUENCY = 3; 30 31class AudioManagerBenchmarkTest : public benchmark::Fixture { 32public: 33 struct IAudioManager *manager_ = nullptr; 34 struct AudioAdapterDescriptor *adapterDescs_ = nullptr; 35 void SetUp(const ::benchmark::State &state); 36 void TearDown(const ::benchmark::State &state); 37 void AudioAdapterDescriptorFree(struct AudioAdapterDescriptor *dataBlock, bool freeSelf); 38 void ReleaseAdapterDescs(struct AudioAdapterDescriptor *descs, uint32_t descsLen); 39}; 40 41void AudioManagerBenchmarkTest::AudioAdapterDescriptorFree(struct AudioAdapterDescriptor *dataBlock, bool freeSelf) 42{ 43 if (dataBlock == nullptr) { 44 return; 45 } 46 47 if (dataBlock->adapterName != nullptr) { 48 OsalMemFree(dataBlock->adapterName); 49 dataBlock->adapterName = nullptr; 50 } 51 52 if (dataBlock->ports != nullptr) { 53 OsalMemFree(dataBlock->ports); 54 } 55 56 if (freeSelf) { 57 OsalMemFree(dataBlock); 58 } 59} 60 61void AudioManagerBenchmarkTest::ReleaseAdapterDescs(struct AudioAdapterDescriptor *descs, uint32_t descsLen) 62{ 63 if ((descs == nullptr) || (descsLen == 0)) { 64 return; 65 } 66 67 for (uint32_t i = 0; i < descsLen; i++) { 68 AudioAdapterDescriptorFree(&descs[i], false); 69 } 70} 71 72void AudioManagerBenchmarkTest::SetUp(const ::benchmark::State &state) 73{ 74 manager_ = IAudioManagerGet(false); 75 ASSERT_NE(manager_, nullptr); 76} 77 78void AudioManagerBenchmarkTest::TearDown(const ::benchmark::State &state) 79{ 80 IAudioManagerRelease(manager_, false); 81} 82 83BENCHMARK_F(AudioManagerBenchmarkTest, GetAllAdapters)(benchmark::State &state) 84{ 85 ASSERT_NE(manager_, nullptr); 86 int32_t ret; 87 uint32_t size = g_audioAdapterNumMax; 88 adapterDescs_ = (struct AudioAdapterDescriptor *)OsalMemCalloc( 89 sizeof(struct AudioAdapterDescriptor) * (g_audioAdapterNumMax)); 90 ASSERT_NE(adapterDescs_, nullptr); 91 92 for (auto _ : state) { 93 ret = manager_->GetAllAdapters(manager_, adapterDescs_, &size); 94 EXPECT_EQ(HDF_SUCCESS, ret); 95 } 96 ReleaseAdapterDescs(adapterDescs_, g_audioAdapterNumMax); 97} 98 99BENCHMARK_REGISTER_F(AudioManagerBenchmarkTest, GetAllAdapters)-> 100 Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly(); 101 102BENCHMARK_F(AudioManagerBenchmarkTest, LoadAdapterAndUnloadAdapter)(benchmark::State &state) 103{ 104 ASSERT_NE(manager_, nullptr); 105 int32_t ret; 106 uint32_t size = g_audioAdapterNumMax; 107 struct IAudioAdapter *adapter = nullptr; 108 adapterDescs_ = (struct AudioAdapterDescriptor *)OsalMemCalloc( 109 sizeof(struct AudioAdapterDescriptor) * (g_audioAdapterNumMax)); 110 ASSERT_NE(adapterDescs_, nullptr); 111 ret = manager_->GetAllAdapters(manager_, adapterDescs_, &size); 112 EXPECT_EQ(HDF_SUCCESS, ret); 113 114 for (auto _ : state) { 115 ret = manager_->LoadAdapter(manager_, &adapterDescs_[0], &adapter); 116 EXPECT_EQ(HDF_SUCCESS, ret); 117 } 118 119 for (auto _ : state) { 120 ret = manager_->UnloadAdapter(manager_, adapterDescs_[0].adapterName); 121 EXPECT_EQ(HDF_SUCCESS, ret); 122 } 123 ReleaseAdapterDescs(adapterDescs_, g_audioAdapterNumMax); 124} 125 126BENCHMARK_REGISTER_F(AudioManagerBenchmarkTest, LoadAdapterAndUnloadAdapter)-> 127 Iterations(ITERATION_FREQUENCY)->Repetitions(REPETITION_FREQUENCY)->ReportAggregatesOnly(); 128} 129 130BENCHMARK_MAIN(); 131