From 4d130624b4603accbee2b70bd8e1d9d82932f475 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 16 Sep 2026 11:59:48 -0500 Subject: [PATCH] [image] Trim the draw benchmark Own the frame buffer so nothing leaks per trial, size the pixel data once for the widest format, and drop the manifest override the build does not need. --- tests/benchmarks/components/image/__init__.py | 5 --- .../components/image/bench_image_draw.cpp | 36 ++++++++----------- 2 files changed, 15 insertions(+), 26 deletions(-) delete mode 100644 tests/benchmarks/components/image/__init__.py diff --git a/tests/benchmarks/components/image/__init__.py b/tests/benchmarks/components/image/__init__.py deleted file mode 100644 index b08f67a0956..00000000000 --- a/tests/benchmarks/components/image/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from tests.testing_helpers import ComponentManifestOverride - - -def override_manifest(manifest: ComponentManifestOverride) -> None: - manifest.enable_codegen() diff --git a/tests/benchmarks/components/image/bench_image_draw.cpp b/tests/benchmarks/components/image/bench_image_draw.cpp index d16a890f64f..3cd143d780f 100644 --- a/tests/benchmarks/components/image/bench_image_draw.cpp +++ b/tests/benchmarks/components/image/bench_image_draw.cpp @@ -16,21 +16,22 @@ static constexpr int kHeight = 96; // buffered display shares. class BenchDisplay : public display::DisplayBuffer { public: - BenchDisplay() { this->init_internal_(kWidth * kHeight); } + BenchDisplay() : frame_(std::make_unique(kWidth * kHeight)) { this->buffer_ = this->frame_.get(); } void update() override {} display::DisplayType get_display_type() override { return display::DisplayType::DISPLAY_TYPE_COLOR; } int get_width_internal() override { return kWidth; } int get_height_internal() override { return kHeight; } protected: - void draw_absolute_pixel_internal(int x, int y, Color color) override { - this->buffer_[y * kWidth + x] = color.r ^ color.g ^ color.b; - } + void draw_absolute_pixel_internal(int x, int y, Color color) override { this->buffer_[y * kWidth + x] = color.r; } + + std::unique_ptr frame_; }; -// Deterministic pseudo random pixel bytes; the values only need to vary so -// the chroma key and alpha branches see a mix of pixels. -static std::unique_ptr make_pixels(size_t bytes) { +// Deterministic pseudo random pixel bytes so the alpha branch sees a mix of +// pixels. Sized for the widest format, the image reads only what it needs. +static std::unique_ptr make_pixels() { + constexpr size_t bytes = kWidth * kHeight * 4; auto data = std::make_unique(bytes); uint32_t seed = 11897; for (size_t i = 0; i < bytes; i++) { @@ -40,40 +41,33 @@ static std::unique_ptr make_pixels(size_t bytes) { return data; } -static void draw_image(benchmark::State &state, ImageType type, Transparency transparency, size_t bytes) { - auto data = make_pixels(bytes); +static void draw_image(benchmark::State &state, ImageType type, Transparency transparency) { + auto data = make_pixels(); Image image(data.get(), kWidth, kHeight, type, transparency); BenchDisplay display; for (auto _ : state) { image.draw(0, 0, &display, display::COLOR_ON, display::COLOR_OFF); - benchmark::DoNotOptimize(&display); } state.SetItemsProcessed(state.iterations() * kWidth * kHeight); } -static void ImageDraw_Binary(benchmark::State &state) { - draw_image(state, IMAGE_TYPE_BINARY, TRANSPARENCY_OPAQUE, (kWidth + 7) / 8 * kHeight); -} +static void ImageDraw_Binary(benchmark::State &state) { draw_image(state, IMAGE_TYPE_BINARY, TRANSPARENCY_OPAQUE); } BENCHMARK(ImageDraw_Binary); static void ImageDraw_Grayscale(benchmark::State &state) { - draw_image(state, IMAGE_TYPE_GRAYSCALE, TRANSPARENCY_OPAQUE, kWidth * kHeight); + draw_image(state, IMAGE_TYPE_GRAYSCALE, TRANSPARENCY_OPAQUE); } BENCHMARK(ImageDraw_Grayscale); -static void ImageDraw_RGB565(benchmark::State &state) { - draw_image(state, IMAGE_TYPE_RGB565, TRANSPARENCY_OPAQUE, kWidth * kHeight * 2); -} +static void ImageDraw_RGB565(benchmark::State &state) { draw_image(state, IMAGE_TYPE_RGB565, TRANSPARENCY_OPAQUE); } BENCHMARK(ImageDraw_RGB565); -static void ImageDraw_RGB(benchmark::State &state) { - draw_image(state, IMAGE_TYPE_RGB, TRANSPARENCY_OPAQUE, kWidth * kHeight * 3); -} +static void ImageDraw_RGB(benchmark::State &state) { draw_image(state, IMAGE_TYPE_RGB, TRANSPARENCY_OPAQUE); } BENCHMARK(ImageDraw_RGB); static void ImageDraw_RGB_Alpha(benchmark::State &state) { - draw_image(state, IMAGE_TYPE_RGB, TRANSPARENCY_ALPHA_CHANNEL, kWidth * kHeight * 4); + draw_image(state, IMAGE_TYPE_RGB, TRANSPARENCY_ALPHA_CHANNEL); } BENCHMARK(ImageDraw_RGB_Alpha);