summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jim Shargo <jshargo@google.com> 2023-08-09 20:20:17 +0000
committer Jim Shargo <jshargo@google.com> 2023-08-09 20:30:46 +0000
commit2dbcb1fe112ee5a73b5aac77650ef2d51c4df4bd (patch)
tree6f4f61c93b9f6bf5b8d0cac8cefbaac166a5ee4c
parent452c84ef3d0b658109b11336dbc38dcfbe7de933 (diff)
nativewindow: Add more benchmarks to evaluate FFI costs
This CL adds two new benchmarks, one for getting an AHardwareBuffer's ID and another for getting its description. These should (and do) ultimately take the same amount of time. Test: just adding new tests Change-Id: I5e09a2736ab829ca465aaa4073b439a605d49b5a
-rw-r--r--libs/nativewindow/tests/benchmark/buffer_benchmarks.cc52
-rw-r--r--libs/nativewindow/tests/benchmark/buffer_benchmarks.rs30
2 files changed, 69 insertions, 13 deletions
diff --git a/libs/nativewindow/tests/benchmark/buffer_benchmarks.cc b/libs/nativewindow/tests/benchmark/buffer_benchmarks.cc
index 0ead1a2926..9b31993809 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 @@ static void BM_BufferAllocationDeallocation(benchmark::State& state) {
}
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 3ef0f5e8c7..fbd49c0b50 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);