diff options
| author | Martin Hořeňovský | 2023-01-27 22:12:57 +0100 |
|---|---|---|
| committer | Martin Hořeňovský | 2023-01-29 10:14:20 +0100 |
| commit | 43f02027e47310e200f20f5c3a1de6fe281e2f81 (patch) | |
| tree | d0a0f722915ee180eaed42d6d4fac553f758cee1 /src/catch2/internal/catch_run_context.cpp | |
| parent | 906552f8c831d0dd1917484b53dd080537f19acd (diff) | |
| download | catch3-43f02027e47310e200f20f5c3a1de6fe281e2f81.tar.gz | |
Avoid allocations when looking for trackers
Now we delay allocating owning `NameAndLocation` instances until
we construct a new tracker (because a tracker's lifetime can be
significantly different from the underlying tracked-thing's name).
This saves 4239 allocations (436948 -> 432709) when running
`./tests/SelfTest -o /dev/null`, at some cost to code clarity
due to introducing a new ref type, `NameAndLocationRef`.
Diffstat (limited to 'src/catch2/internal/catch_run_context.cpp')
| -rw-r--r-- | src/catch2/internal/catch_run_context.cpp | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/src/catch2/internal/catch_run_context.cpp b/src/catch2/internal/catch_run_context.cpp index 506dc5c9..e0b5ccaa 100644 --- a/src/catch2/internal/catch_run_context.cpp +++ b/src/catch2/internal/catch_run_context.cpp @@ -29,12 +29,12 @@ namespace Catch { struct GeneratorTracker : TestCaseTracking::TrackerBase, IGeneratorTracker { GeneratorBasePtr m_generator; - GeneratorTracker( TestCaseTracking::NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) - : TrackerBase( nameAndLocation, ctx, parent ) + GeneratorTracker( TestCaseTracking::NameAndLocation&& nameAndLocation, TrackerContext& ctx, ITracker* parent ) + : TrackerBase( CATCH_MOVE(nameAndLocation), ctx, parent ) {} ~GeneratorTracker() override; - static GeneratorTracker* acquire( TrackerContext& ctx, TestCaseTracking::NameAndLocation const& nameAndLocation ) { + static GeneratorTracker* acquire( TrackerContext& ctx, TestCaseTracking::NameAndLocationRef nameAndLocation ) { GeneratorTracker* tracker; ITracker& currentTracker = ctx.currentTracker(); @@ -226,7 +226,7 @@ namespace Catch { uint64_t testRuns = 0; do { m_trackerContext.startCycle(); - m_testCaseTracker = &SectionTracker::acquire(m_trackerContext, TestCaseTracking::NameAndLocation(testInfo.name, testInfo.lineInfo)); + m_testCaseTracker = &SectionTracker::acquire(m_trackerContext, TestCaseTracking::NameAndLocationRef(testInfo.name, testInfo.lineInfo)); m_reporter->testCasePartialStarting(testInfo, testRuns); @@ -298,7 +298,8 @@ namespace Catch { } bool RunContext::sectionStarted(SectionInfo const & sectionInfo, Counts & assertions) { - ITracker& sectionTracker = SectionTracker::acquire(m_trackerContext, TestCaseTracking::NameAndLocation(sectionInfo.name, sectionInfo.lineInfo)); + ITracker& sectionTracker = SectionTracker::acquire(m_trackerContext, TestCaseTracking::NameAndLocationRef(sectionInfo.name, sectionInfo.lineInfo)); + if (!sectionTracker.isOpen()) return false; m_activeSections.push_back(§ionTracker); @@ -317,8 +318,8 @@ namespace Catch { using namespace Generators; GeneratorTracker* tracker = GeneratorTracker::acquire( m_trackerContext, - TestCaseTracking::NameAndLocation( - static_cast<std::string>( generatorName ), lineInfo ) ); + TestCaseTracking::NameAndLocationRef( + generatorName, lineInfo ) ); m_lastAssertionInfo.lineInfo = lineInfo; return tracker; } @@ -335,7 +336,7 @@ namespace Catch { "Trying to create tracker for a genreator that already has one" ); auto newTracker = Catch::Detail::make_unique<Generators::GeneratorTracker>( - nameAndLoc, m_trackerContext, ¤tTracker ); + CATCH_MOVE(nameAndLoc), m_trackerContext, ¤tTracker ); auto ret = newTracker.get(); currentTracker.addChild( CATCH_MOVE( newTracker ) ); |