From fbebf671c9e32716fddaa29adcd5ac5ac989f66a Mon Sep 17 00:00:00 2001 From: Larry Gritz Date: Sun, 8 Oct 2023 08:56:35 -0700 Subject: [PATCH] testing: imagebuf_test add benchmarks for iterator traversal To help with some other investigation I'm doing, amend imagebuf_test with benchmarks to compare the relative speeds of traversing a big ImageBuf with Iterator, ConstIterator, or just using pointers on an equivalently large array. Signed-off-by: Larry Gritz --- src/libOpenImageIO/imagebuf_test.cpp | 57 ++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/src/libOpenImageIO/imagebuf_test.cpp b/src/libOpenImageIO/imagebuf_test.cpp index 6a9de04506..11e1c14e7b 100644 --- a/src/libOpenImageIO/imagebuf_test.cpp +++ b/src/libOpenImageIO/imagebuf_test.cpp @@ -540,6 +540,62 @@ test_mutable_iterator_with_imagecache() +void +time_iterators() +{ + print("Timing iterator operations:\n"); + const int rez = 4096, nchans = 4; + ImageSpec spec(rez, rez, nchans, TypeFloat); + ImageBuf img(spec); + ImageBufAlgo::fill(img, { 0.25f, 0.5f, 0.75f, 1.0f }); + + Benchmarker bench; + double sum = 0.0f; + bench("Read traversal with ConstIterator", [&]() { + sum = 0.0f; + for (ImageBuf::ConstIterator it(img); !it.done(); ++it) { + for (int c = 0; c < nchans; ++c) + sum += it[c]; + } + }); + OIIO_CHECK_EQUAL(sum, 2.5 * rez * rez); + bench("Read traversal with Iterator", [&]() { + sum = 0.0f; + for (ImageBuf::Iterator it(img); !it.done(); ++it) { + for (int c = 0; c < nchans; ++c) + sum += it[c]; + } + }); + OIIO_CHECK_EQUAL(sum, 2.5 * rez * rez); + bench("Read traversal with pointer", [&]() { + sum = 0.0f; + const float* it = (const float*)img.localpixels(); + for (int y = 0; y < rez; ++y) + for (int x = 0; x < rez; ++x, it += 4) { + for (int c = 0; c < nchans; ++c) + sum += it[c]; + } + }); + OIIO_CHECK_EQUAL(sum, 2.5 * rez * rez); + bench("Write traversal with Iterator", [&]() { + ImageBuf::Iterator it(img); + for (ImageBuf::Iterator it(img); !it.done(); ++it) { + for (int c = 0; c < nchans; ++c) + it[c] = 0.5f; + } + }); + bench("Write traversal with pointer", [&]() { + float* it = (float*)img.localpixels(); + for (int y = 0; y < rez; ++y) + for (int x = 0; x < rez; ++x, it += 4) { + for (int c = 0; c < nchans; ++c) + it[c] = 0.5f; + } + }); +} + + + int main(int /*argc*/, char* /*argv*/[]) { @@ -563,6 +619,7 @@ main(int /*argc*/, char* /*argv*/[]) iterator_wrap_test>(ImageBuf::WrapMirror, "mirror"); test_mutable_iterator_with_imagecache(); + time_iterators(); ImageBuf_test_appbuffer(); ImageBuf_test_appbuffer_strided();