From 715558fd97a48533fd41cb7dddf23b05d333cec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ho=C5=99e=C5=88ovsk=C3=BD?= Date: Sun, 20 Jul 2025 18:40:05 +0200 Subject: [PATCH] Use the fast path for passing assertions in RunContext::handleNonExpr `handleNonExpr` is responsible for handling assertions that do not result in a decomposable expression, e.g. `REQUIRE_THROWS`, or `REQUIRE_NOTHROW`. Running benchmark on these two macros specifically, with `REQUIRE_THROWS([](){ throw 1; }())`, and `REQUIRE_NOTHROW([](){}())`, we get these speedups: | | Debug | Release | |---------|--------|---------| | THROWS | 3.69x | 2.10x | | NOTHROW | 1.18x | 1.05x | Obviously the actual performance improvement is dependent on how expensive the expression under test is. --- src/catch2/internal/catch_run_context.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/catch2/internal/catch_run_context.cpp b/src/catch2/internal/catch_run_context.cpp index 02fa3eb8..ae170d1f 100644 --- a/src/catch2/internal/catch_run_context.cpp +++ b/src/catch2/internal/catch_run_context.cpp @@ -720,6 +720,11 @@ namespace Catch { AssertionResult assertionResult{ info, CATCH_MOVE( data ) }; const auto isOk = assertionResult.isOk(); + if ( isOk && !m_includeSuccessfulResults ) { + assertionPassedFastPath( info.lineInfo ); + return; + } + assertionEnded( CATCH_MOVE(assertionResult) ); if ( !isOk ) { populateReaction(