diff --git a/base/Android.bp b/base/Android.bp index 7a2e66502..58b6fb526 100644 --- a/base/Android.bp +++ b/base/Android.bp @@ -182,3 +182,21 @@ cc_test { }, test_suites: ["device-tests"], } + +cc_benchmark { + name: "libbase_benchmark", + defaults: ["libbase_cflags_defaults"], + + srcs: ["format_benchmark.cpp"], + shared_libs: ["libbase"], + + compile_multilib: "both", + multilib: { + lib32: { + suffix: "32", + }, + lib64: { + suffix: "64", + }, + }, +} diff --git a/base/format_benchmark.cpp b/base/format_benchmark.cpp new file mode 100644 index 000000000..9590b2365 --- /dev/null +++ b/base/format_benchmark.cpp @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2019 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 "android-base/format.h" + +#include + +#include + +#include "android-base/stringprintf.h" + +using android::base::StringPrintf; + +static void BenchmarkFormatInt(benchmark::State& state) { + for (auto _ : state) { + benchmark::DoNotOptimize(fmt::format("{} {} {}", 42, std::numeric_limits::min(), + std::numeric_limits::max())); + } +} + +BENCHMARK(BenchmarkFormatInt); + +static void BenchmarkStringPrintfInt(benchmark::State& state) { + for (auto _ : state) { + benchmark::DoNotOptimize(StringPrintf("%d %d %d", 42, std::numeric_limits::min(), + std::numeric_limits::max())); + } +} + +BENCHMARK(BenchmarkStringPrintfInt); + +static void BenchmarkFormatFloat(benchmark::State& state) { + for (auto _ : state) { + benchmark::DoNotOptimize(fmt::format("{} {} {}", 42.42, std::numeric_limits::min(), + std::numeric_limits::max())); + } +} + +BENCHMARK(BenchmarkFormatFloat); + +static void BenchmarkStringPrintfFloat(benchmark::State& state) { + for (auto _ : state) { + benchmark::DoNotOptimize(StringPrintf("%f %f %f", 42.42, std::numeric_limits::min(), + std::numeric_limits::max())); + } +} + +BENCHMARK(BenchmarkStringPrintfFloat); + +static void BenchmarkFormatStrings(benchmark::State& state) { + for (auto _ : state) { + benchmark::DoNotOptimize(fmt::format("{} hello there {}", "hi,", "!!")); + } +} + +BENCHMARK(BenchmarkFormatStrings); + +static void BenchmarkStringPrintfStrings(benchmark::State& state) { + for (auto _ : state) { + benchmark::DoNotOptimize(StringPrintf("%s hello there %s", "hi,", "!!")); + } +} + +BENCHMARK(BenchmarkStringPrintfStrings); + +// Run the benchmark +BENCHMARK_MAIN(); diff --git a/base/include/android-base/format.h b/base/include/android-base/format.h new file mode 100644 index 000000000..6799c1fae --- /dev/null +++ b/base/include/android-base/format.h @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2019 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. + */ + +#pragma once + +// We include fmtlib here as an alias, since libbase will have fmtlib statically linked already. +// It is accessed through its normal fmt:: namespace. +#include +#include +#include +#include +#include diff --git a/base/include/android-base/result.h b/base/include/android-base/result.h index f0e449ab4..1b763af0b 100644 --- a/base/include/android-base/result.h +++ b/base/include/android-base/result.h @@ -79,9 +79,8 @@ #include #include -#include - #include "android-base/expected.h" +#include "android-base/format.h" namespace android { namespace base {