diff options
author | 2020-06-24 15:11:05 +0000 | |
---|---|---|
committer | 2020-06-30 16:12:38 +0000 | |
commit | 159eb6ab25bfb753911279ae2f0736e19f996f74 (patch) | |
tree | f5ba1b2ef084fdc4fbae7af0edfb925c594c5417 | |
parent | 22bbb231231551ad1cbe3df72a07d53e0b73957a (diff) |
Create benchmark tests for libpowermanager
This includes benchmarks around power HAL functions (both AIDL and HIDL
versions) and ones around the controller class.
Bug: 159799891
Test: atest libpowermanager_benchmarks
Change-Id: I8b151a661986dd3a1c7f232bd84fcc63e478fc4d
-rw-r--r-- | services/powermanager/PowerHalWrapper.cpp | 6 | ||||
-rw-r--r-- | services/powermanager/benchmarks/Android.bp | 39 | ||||
-rw-r--r-- | services/powermanager/benchmarks/AndroidTest.xml | 28 | ||||
-rw-r--r-- | services/powermanager/benchmarks/PowerHalAidlBenchmarks.cpp | 68 | ||||
-rw-r--r-- | services/powermanager/benchmarks/PowerHalControllerBenchmarks.cpp | 88 | ||||
-rw-r--r-- | services/powermanager/benchmarks/PowerHalHidlBenchmarks.cpp | 71 | ||||
-rw-r--r-- | services/powermanager/benchmarks/main.cpp | 19 |
7 files changed, 315 insertions, 4 deletions
diff --git a/services/powermanager/PowerHalWrapper.cpp b/services/powermanager/PowerHalWrapper.cpp index 5f4bfed595..95f862370b 100644 --- a/services/powermanager/PowerHalWrapper.cpp +++ b/services/powermanager/PowerHalWrapper.cpp @@ -117,8 +117,7 @@ HalResult AidlHalWrapper::setBoost(Boost boost, int32_t durationMs) { bool isSupported = false; auto isSupportedRet = mHandle->isBoostSupported(boost, &isSupported); if (!isSupportedRet.isOk()) { - ALOGV("Skipped setBoost %s because Power HAL is not available to check " - "support", + ALOGV("Skipped setBoost %s because Power HAL is not available to check support", toString(boost).c_str()); return HalResult::FAILED; } @@ -149,8 +148,7 @@ HalResult AidlHalWrapper::setMode(Mode mode, bool enabled) { bool isSupported = false; auto isSupportedRet = mHandle->isModeSupported(mode, &isSupported); if (!isSupportedRet.isOk()) { - ALOGV("Skipped setMode %s because Power HAL is not available to check " - "support", + ALOGV("Skipped setMode %s because Power HAL is not available to check support", toString(mode).c_str()); return HalResult::FAILED; } diff --git a/services/powermanager/benchmarks/Android.bp b/services/powermanager/benchmarks/Android.bp new file mode 100644 index 0000000000..59752693c9 --- /dev/null +++ b/services/powermanager/benchmarks/Android.bp @@ -0,0 +1,39 @@ +// Copyright (C) 2020 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +cc_benchmark { + name: "libpowermanager_benchmarks", + srcs: [ + "main.cpp", + "PowerHalAidlBenchmarks.cpp", + "PowerHalControllerBenchmarks.cpp", + "PowerHalHidlBenchmarks.cpp", + ], + shared_libs: [ + "libbase", + "libbinder", + "libhidlbase", + "liblog", + "libpowermanager", + "libutils", + "android.hardware.power@1.0", + "android.hardware.power@1.1", + "android.hardware.power-cpp", + ], + cflags: [ + "-Wall", + "-Werror", + "-Wextra", + ], +} diff --git a/services/powermanager/benchmarks/AndroidTest.xml b/services/powermanager/benchmarks/AndroidTest.xml new file mode 100644 index 0000000000..40f4872c96 --- /dev/null +++ b/services/powermanager/benchmarks/AndroidTest.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<configuration description="Config for libpowermanager benchmarks"> + <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer"> + <option name="cleanup" value="true" /> + <option name="push" value="libpowermanager_benchmarks->/data/benchmarktest/benchmark" /> + </target_preparer> + <option name="test-suite-tag" value="apct" /> + <option name="test-suite-tag" value="apct-metric-instrumentation" /> + <test class="com.android.tradefed.testtype.GoogleBenchmarkTest" > + <option name="native-benchmark-device-path" value="/data/benchmarktest" /> + <option name="benchmark-module-name" value="benchmark" /> + </test> +</configuration> diff --git a/services/powermanager/benchmarks/PowerHalAidlBenchmarks.cpp b/services/powermanager/benchmarks/PowerHalAidlBenchmarks.cpp new file mode 100644 index 0000000000..a6dad51045 --- /dev/null +++ b/services/powermanager/benchmarks/PowerHalAidlBenchmarks.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "PowerHalAidlBenchmarks" + +#include <android/hardware/power/Boost.h> +#include <android/hardware/power/IPower.h> +#include <android/hardware/power/Mode.h> + +#include <benchmark/benchmark.h> + +#include <binder/IServiceManager.h> + +using android::hardware::power::Boost; +using android::hardware::power::IPower; +using android::hardware::power::Mode; + +using namespace android; + +template <class R, class... Args0, class... Args1> +static void runBenchmark(benchmark::State& state, R (IPower::*fn)(Args0...), Args1&&... args1) { + sp<IPower> hal = waitForVintfService<IPower>(); + + if (hal == nullptr) { + ALOGI("Power HAL AIDL not available, skipping test..."); + return; + } + + while (state.KeepRunning()) { + (*hal.*fn)(std::forward<Args1>(args1)...); + } +} + +static void BM_PowerHalAidlBenchmarks_isBoostSupported(benchmark::State& state) { + bool isSupported; + runBenchmark(state, &IPower::isBoostSupported, Boost::INTERACTION, &isSupported); +} + +static void BM_PowerHalAidlBenchmarks_isModeSupported(benchmark::State& state) { + bool isSupported; + runBenchmark(state, &IPower::isModeSupported, Mode::INTERACTIVE, &isSupported); +} + +static void BM_PowerHalAidlBenchmarks_setBoost(benchmark::State& state) { + runBenchmark(state, &IPower::setBoost, Boost::INTERACTION, 0); +} + +static void BM_PowerHalAidlBenchmarks_setMode(benchmark::State& state) { + runBenchmark(state, &IPower::setMode, Mode::INTERACTIVE, false); +} + +BENCHMARK(BM_PowerHalAidlBenchmarks_isBoostSupported); +BENCHMARK(BM_PowerHalAidlBenchmarks_isModeSupported); +BENCHMARK(BM_PowerHalAidlBenchmarks_setBoost); +BENCHMARK(BM_PowerHalAidlBenchmarks_setMode); diff --git a/services/powermanager/benchmarks/PowerHalControllerBenchmarks.cpp b/services/powermanager/benchmarks/PowerHalControllerBenchmarks.cpp new file mode 100644 index 0000000000..a3a1f4e171 --- /dev/null +++ b/services/powermanager/benchmarks/PowerHalControllerBenchmarks.cpp @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "PowerHalControllerBenchmarks" + +#include <android/hardware/power/Boost.h> +#include <android/hardware/power/Mode.h> + +#include <benchmark/benchmark.h> + +#include <powermanager/PowerHalController.h> + +using android::hardware::power::Boost; +using android::hardware::power::Mode; +using android::power::PowerHalController; + +using namespace android; + +static void BM_PowerHalControllerBenchmarks_init(benchmark::State& state) { + while (state.KeepRunning()) { + PowerHalController controller; + controller.init(); + } +} + +static void BM_PowerHalControllerBenchmarks_initCached(benchmark::State& state) { + PowerHalController controller; + // First connection out of test. + controller.init(); + + while (state.KeepRunning()) { + controller.init(); + } +} + +static void BM_PowerHalControllerBenchmarks_setBoost(benchmark::State& state) { + while (state.KeepRunning()) { + PowerHalController controller; + controller.setBoost(Boost::INTERACTION, 0); + } +} + +static void BM_PowerHalControllerBenchmarks_setBoostCached(benchmark::State& state) { + PowerHalController controller; + // First call out of test, to cache supported boost. + controller.setBoost(Boost::INTERACTION, 0); + + while (state.KeepRunning()) { + controller.setBoost(Boost::INTERACTION, 0); + } +} + +static void BM_PowerHalControllerBenchmarks_setMode(benchmark::State& state) { + while (state.KeepRunning()) { + PowerHalController controller; + controller.setMode(Mode::INTERACTIVE, false); + } +} + +static void BM_PowerHalControllerBenchmarks_setModeCached(benchmark::State& state) { + PowerHalController controller; + // First call out of test, to cache supported mode. + controller.setMode(Mode::INTERACTIVE, false); + + while (state.KeepRunning()) { + controller.setMode(Mode::INTERACTIVE, false); + } +} + +BENCHMARK(BM_PowerHalControllerBenchmarks_init); +BENCHMARK(BM_PowerHalControllerBenchmarks_initCached); +BENCHMARK(BM_PowerHalControllerBenchmarks_setBoost); +BENCHMARK(BM_PowerHalControllerBenchmarks_setBoostCached); +BENCHMARK(BM_PowerHalControllerBenchmarks_setMode); +BENCHMARK(BM_PowerHalControllerBenchmarks_setModeCached); diff --git a/services/powermanager/benchmarks/PowerHalHidlBenchmarks.cpp b/services/powermanager/benchmarks/PowerHalHidlBenchmarks.cpp new file mode 100644 index 0000000000..5542ac4326 --- /dev/null +++ b/services/powermanager/benchmarks/PowerHalHidlBenchmarks.cpp @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "PowerHalHidlBenchmarks" + +#include <android/hardware/power/1.1/IPower.h> +#include <android/hardware/power/Boost.h> +#include <android/hardware/power/IPower.h> +#include <android/hardware/power/Mode.h> + +#include <benchmark/benchmark.h> + +#include <hardware/power.h> +#include <hardware_legacy/power.h> + +using android::hardware::power::Boost; +using android::hardware::power::Mode; +using android::hardware::power::V1_0::Feature; +using android::hardware::power::V1_0::PowerHint; +using IPower1_0 = android::hardware::power::V1_0::IPower; +using IPower1_1 = android::hardware::power::V1_1::IPower; + +using namespace android; + +template <class R, class I, class... Args0, class... Args1> +static void runBenchmark(benchmark::State& state, R (I::*fn)(Args0...), Args1&&... args1) { + sp<I> hal = I::getService(); + + if (hal == nullptr) { + ALOGI("Power HAL HIDL not available, skipping test..."); + return; + } + + while (state.KeepRunning()) { + (*hal.*fn)(std::forward<Args1>(args1)...); + } +} + +static void BM_PowerHalHidlBenchmarks_setFeature(benchmark::State& state) { + runBenchmark(state, &IPower1_0::setFeature, Feature::POWER_FEATURE_DOUBLE_TAP_TO_WAKE, false); +} + +static void BM_PowerHalHidlBenchmarks_setInteractive(benchmark::State& state) { + runBenchmark(state, &IPower1_0::setInteractive, false); +} + +static void BM_PowerHalHidlBenchmarks_powerHint(benchmark::State& state) { + runBenchmark(state, &IPower1_0::powerHint, PowerHint::INTERACTION, 0); +} + +static void BM_PowerHalHidlBenchmarks_powerHintAsync(benchmark::State& state) { + runBenchmark(state, &IPower1_1::powerHintAsync, PowerHint::INTERACTION, 0); +} + +BENCHMARK(BM_PowerHalHidlBenchmarks_setFeature); +BENCHMARK(BM_PowerHalHidlBenchmarks_setInteractive); +BENCHMARK(BM_PowerHalHidlBenchmarks_powerHint); +BENCHMARK(BM_PowerHalHidlBenchmarks_powerHintAsync); diff --git a/services/powermanager/benchmarks/main.cpp b/services/powermanager/benchmarks/main.cpp new file mode 100644 index 0000000000..15c57bf1be --- /dev/null +++ b/services/powermanager/benchmarks/main.cpp @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <benchmark/benchmark.h> + +BENCHMARK_MAIN(); |