From b26e316d9f1dc1917ff4b2bc347828071c52746a Mon Sep 17 00:00:00 2001 From: Christian Parpart Date: Sun, 17 Mar 2024 14:46:24 +0100 Subject: [PATCH] Fixes an infinite loop in termbnech.cpp and add some overall improvements Signed-off-by: Christian Parpart --- libtermbench/termbench.cpp | 37 +++++++++++++++++++------------------ libtermbench/termbench.h | 4 ++++ scripts/Xvfb-bench-run.sh | 29 ++++++++++++++++++++--------- tb/CMakeLists.txt | 6 ++++++ tb/main.cpp | 5 +---- 5 files changed, 50 insertions(+), 31 deletions(-) diff --git a/libtermbench/termbench.cpp b/libtermbench/termbench.cpp index 16b5f67..65b48ee 100644 --- a/libtermbench/termbench.cpp +++ b/libtermbench/termbench.cpp @@ -66,6 +66,18 @@ void Benchmark::add(unique_ptr _test) tests_.emplace_back(std::move(_test)); } +void Benchmark::writeOutput(Buffer const& testBuffer) +{ + auto const output = testBuffer.output(); + auto remainingBytes = totalSizeBytes(); + while (remainingBytes > 0) + { + auto const n = std::min(output.size(), remainingBytes); + writer_(output.data(), n); + remainingBytes -= n; + } +} + void Benchmark::runAll() { auto buffer = make_unique(min(static_cast(64u), testSizeMB_)); @@ -78,30 +90,19 @@ void Benchmark::runAll() test->setup(width_, height_); test->run(*buffer); - auto const output = buffer->output(); - auto const totalSizeBytes = testSizeMB_ * 1024 * 1024; auto const beginTime = steady_clock::now(); - auto remainingBytes = totalSizeBytes; + writeOutput(*buffer); auto const diff = duration_cast(steady_clock::now() - beginTime); - while (diff < 1s) - { - while (remainingBytes > 0) - { - auto const n = std::min(output.size(), remainingBytes); - writer_(output.data(), n); - remainingBytes -= n; - } - } - results_.emplace_back(Result { *test, diff, totalSizeBytes }); + results_.emplace_back(*test, diff, totalSizeBytes()); buffer->clear(); test->teardown(*buffer); - if (buffer->empty()) - continue; - - writer_(buffer->output().data(), buffer->output().size()); - buffer->clear(); + if (!buffer->empty()) + { + writer_(buffer->output().data(), buffer->output().size()); + buffer->clear(); + } } } // diff --git a/libtermbench/termbench.h b/libtermbench/termbench.h index b613480..fdf6048 100644 --- a/libtermbench/termbench.h +++ b/libtermbench/termbench.h @@ -97,7 +97,11 @@ class Benchmark std::vector const& results() const noexcept { return results_; } + [[constexpr]] size_t totalSizeBytes() const noexcept { return testSizeMB_ * 1024 * 1024; } + private: + void writeOutput(Buffer const& testBuffer); + std::function writer_; std::function beforeTest_; size_t testSizeMB_; diff --git a/scripts/Xvfb-bench-run.sh b/scripts/Xvfb-bench-run.sh index a90d637..9b4d4a0 100755 --- a/scripts/Xvfb-bench-run.sh +++ b/scripts/Xvfb-bench-run.sh @@ -3,27 +3,38 @@ # # Usage: Xvfb-contour-run.sh -set -x - - LIBGL_ALWAYS_SOFTWARE="${LIBGL_ALWAYS_SOFTWARE:-true}" DISPLAY=:99 + +TB_BIN="${1:-${TB_BIN}}" +CONTOUR_BIN="${CONTOUR_BIN:-contour}" +KITTY_BIN="${KITTY_BIN:-kitty}" +XTERM_BIN="${XTERM_BIN:-xterm}" +ALACRITTY_BIN="${ALACRITTY_BIN:-alacritty}" + +if [[ "$TB_BIN" == "" ]]; then + echo "Usage: Xvfb-contour-run.sh " + exit 1 +fi + +TB_BIN=$(realpath $TB_BIN) + export LIBGL_ALWAYS_SOFTWARE export DISPLAY +set -x + Xvfb $DISPLAY -screen 0 1280x1024x24 & XVFB_PID=$! trap "kill $XVFB_PID" EXIT sleep 3 -TB_BIN=$PWD/build/tb/tb - -contour display ${DISPLAY} $TB_BIN --output contour_results +"${CONTOUR_BIN}" display ${DISPLAY} $TB_BIN --output contour_results mv $HOME/contour_results . -kitty -e $TB_BIN --output kitty_results -xterm -display ${DISPLAY} -e $TB_BIN --output xterm_results -alacritty -e $TB_BIN --output alacritty_results +"${KITTY_BIN}" -e $TB_BIN --output kitty_results +"${XTERM_BIN}" -display ${DISPLAY} -e $TB_BIN --output xterm_results +"${ALACRITTY_BIN}" -e $TB_BIN --output alacritty_results if [[ "$GITHUB_OUTPUT" != "" ]]; then echo "exitCode=$?" >> "$GITHUB_OUTPUT" diff --git a/tb/CMakeLists.txt b/tb/CMakeLists.txt index 62a5ffa..cd310d1 100644 --- a/tb/CMakeLists.txt +++ b/tb/CMakeLists.txt @@ -12,3 +12,9 @@ set_target_properties(tb PROPERTIES install(TARGETS tb RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) +add_custom_target(Xvfb-bench-run + COMMAND ${CMAKE_SOURCE_DIR}/scripts/Xvfb-bench-run.sh $ + VERBATIM + DEPENDS tb + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} +) diff --git a/tb/main.cpp b/tb/main.cpp index b65e6c5..4fbdea5 100644 --- a/tb/main.cpp +++ b/tb/main.cpp @@ -23,8 +23,6 @@ using std::cerr; using std::cout; -using std::stoul; -using std::tuple; using namespace std::string_view_literals; using namespace std::placeholders; @@ -116,7 +114,7 @@ int main(int argc, char const* argv[]) else if (argv[i] == "--size"sv && i + 1 < argc) { ++i; - testSizeMB = static_cast(stoul(argv[i])); + testSizeMB = static_cast(std::stoul(argv[i])); } else if (argv[i] == "--help"sv || argv[i] == "-h"sv) { @@ -146,7 +144,6 @@ int main(int argc, char const* argv[]) tb.add(contour::termbench::tests::sgr_fg_lines()); tb.add(contour::termbench::tests::sgr_fgbg_lines()); tb.add(contour::termbench::tests::binary()); - // tb.add(contour::termbench::tests::binary()); constexpr size_t Max_lines { 200 }; for (size_t i = 0; i < Max_lines; ++i) tb.add(contour::termbench::tests::ascii_line(i));