nativewindow: Add more benchmarks to evaluate FFI costs am: ba294d7d80 am: cbcbb11376
Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/2776853
Change-Id: I2d39b30e7ac759301501855924c6741da284ea12
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/libs/nativewindow/tests/benchmark/buffer_benchmarks.cc b/libs/nativewindow/tests/benchmark/buffer_benchmarks.cc
index 0ead1a2..9b31993 100644
--- a/libs/nativewindow/tests/benchmark/buffer_benchmarks.cc
+++ b/libs/nativewindow/tests/benchmark/buffer_benchmarks.cc
@@ -16,16 +16,17 @@
#include <android/hardware_buffer.h>
#include <benchmark/benchmark.h>
+constexpr AHardwareBuffer_Desc k720pDesc = {.width = 1280,
+ .height = 720,
+ .layers = 1,
+ .format = AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
+ .usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN,
+ .stride = 0};
+
static void BM_BufferAllocationDeallocation(benchmark::State& state) {
- AHardwareBuffer_Desc buffer_desc = {.width = 1280,
- .height = 720,
- .layers = 1,
- .format = AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
- .usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN,
- .stride = 0};
AHardwareBuffer* buffer = nullptr;
for (auto _ : state) {
- int status = AHardwareBuffer_allocate(&buffer_desc, &buffer);
+ int status = AHardwareBuffer_allocate(&k720pDesc, &buffer);
if (UNLIKELY(status != 0)) {
state.SkipWithError("Unable to allocate buffer.");
}
@@ -35,4 +36,39 @@
}
BENCHMARK(BM_BufferAllocationDeallocation);
-BENCHMARK_MAIN();
\ No newline at end of file
+static void BM_AHardwareBuffer_Id(benchmark::State& state) {
+ AHardwareBuffer* buffer = nullptr;
+ int status = AHardwareBuffer_allocate(&k720pDesc, &buffer);
+ if (UNLIKELY(status != 0)) {
+ state.SkipWithError("Unable to allocate buffer.");
+ }
+
+ for (auto _ : state) {
+ uint64_t id = 0;
+ int status = AHardwareBuffer_getId(buffer, &id);
+ if (UNLIKELY(status != 0)) {
+ state.SkipWithError("Unable to get ID.");
+ }
+ }
+
+ AHardwareBuffer_release(buffer);
+}
+BENCHMARK(BM_AHardwareBuffer_Id);
+
+static void BM_AHardwareBuffer_Desc(benchmark::State& state) {
+ AHardwareBuffer* buffer = nullptr;
+ int status = AHardwareBuffer_allocate(&k720pDesc, &buffer);
+ if (UNLIKELY(status != 0)) {
+ state.SkipWithError("Unable to allocate buffer.");
+ }
+
+ for (auto _ : state) {
+ AHardwareBuffer_Desc desc = {};
+ AHardwareBuffer_describe(buffer, &desc);
+ }
+
+ AHardwareBuffer_release(buffer);
+}
+BENCHMARK(BM_AHardwareBuffer_Desc);
+
+BENCHMARK_MAIN();
diff --git a/libs/nativewindow/tests/benchmark/buffer_benchmarks.rs b/libs/nativewindow/tests/benchmark/buffer_benchmarks.rs
index 3ef0f5e..fbd49c0 100644
--- a/libs/nativewindow/tests/benchmark/buffer_benchmarks.rs
+++ b/libs/nativewindow/tests/benchmark/buffer_benchmarks.rs
@@ -20,20 +20,40 @@
use criterion::*;
use nativewindow::*;
-fn allocate_deallocate() {
- let buffer = AHardwareBuffer::new(
+#[inline]
+fn create_720p_buffer() -> AHardwareBuffer {
+ AHardwareBuffer::new(
1280,
720,
1,
AHardwareBuffer_Format::AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM,
AHardwareBuffer_UsageFlags::AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN,
)
- .unwrap();
- drop(buffer);
+ .unwrap()
}
fn criterion_benchmark(c: &mut Criterion) {
- c.bench_function("allocate_deallocate", |b| b.iter(allocate_deallocate));
+ c.bench_function("allocate_deallocate", |b| {
+ b.iter(|| {
+ let buffer = create_720p_buffer();
+ drop(buffer);
+ })
+ });
+
+ let buffer = create_720p_buffer();
+ c.bench_with_input(BenchmarkId::new("id", "buffer"), &buffer, |b, buffer| {
+ b.iter(|| {
+ buffer.id();
+ })
+ });
+
+ // This benchmark exercises getters that need to fetch data via an
+ // underlying call to AHardwareBuffer_describe.
+ c.bench_with_input(BenchmarkId::new("desc", "buffer"), &buffer, |b, buffer| {
+ b.iter(|| {
+ buffer.width();
+ })
+ });
}
criterion_group!(benches, criterion_benchmark);