From 75ae14cd04033e855e01ce8fce31c52df5beb2c1 Mon Sep 17 00:00:00 2001 From: Bartosz Taudul Date: Mon, 7 Sep 2020 01:47:11 +0200 Subject: [PATCH] Use in-place merge to sort symbol data. --- server/TracyWorker.cpp | 24 ++++++++++++++---------- server/TracyWorker.hpp | 4 ++-- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/server/TracyWorker.cpp b/server/TracyWorker.cpp index 1b0dcfef..8ae4a83b 100644 --- a/server/TracyWorker.cpp +++ b/server/TracyWorker.cpp @@ -2686,23 +2686,27 @@ void Worker::Exec() m_data.newFramesWereReceived = false; } #endif - if( m_data.newSymbolsWereAdded ) + if( m_data.newSymbolsIndex >= 0 ) { - m_data.newSymbolsWereAdded = false; #ifdef NO_PARALLEL_SORT - pdqsort_branchless( m_data.symbolLoc.begin(), m_data.symbolLoc.end(), [] ( const auto& l, const auto& r ) { return l.addr < r.addr; } ); + pdqsort_branchless( m_data.symbolLoc.begin() + m_data.newSymbolsIndex, m_data.symbolLoc.end(), [] ( const auto& l, const auto& r ) { return l.addr < r.addr; } ); #else - std::sort( std::execution::par_unseq, m_data.symbolLoc.begin(), m_data.symbolLoc.end(), [] ( const auto& l, const auto& r ) { return l.addr < r.addr; } ); + std::sort( std::execution::par_unseq, m_data.symbolLoc.begin() + m_data.newSymbolsIndex, m_data.symbolLoc.end(), [] ( const auto& l, const auto& r ) { return l.addr < r.addr; } ); #endif + const auto ms = std::lower_bound( m_data.symbolLoc.begin(), m_data.symbolLoc.begin() + m_data.newSymbolsIndex, m_data.symbolLoc[m_data.newSymbolsIndex], [] ( const auto& l, const auto& r ) { return l.addr < r.addr; } ); + std::inplace_merge( ms, m_data.symbolLoc.begin() + m_data.newSymbolsIndex, m_data.symbolLoc.end(), [] ( const auto& l, const auto& r ) { return l.addr < r.addr; } ); + m_data.newSymbolsIndex = -1; } - if( m_data.newInlineSymbolsWereAdded ) + if( m_data.newInlineSymbolsIndex >= 0 ) { - m_data.newInlineSymbolsWereAdded = false; #ifdef NO_PARALLEL_SORT - pdqsort_branchless( m_data.symbolLocInline.begin(), m_data.symbolLocInline.end() ); + pdqsort_branchless( m_data.symbolLocInline.begin() + m_data.newInlineSymbolsIndex, m_data.symbolLocInline.end() ); #else - std::sort( std::execution::par_unseq, m_data.symbolLocInline.begin(), m_data.symbolLocInline.end() ); + std::sort( std::execution::par_unseq, m_data.symbolLocInline.begin() + m_data.newInlineSymbolsIndex, m_data.symbolLocInline.end() ); #endif + const auto ms = std::lower_bound( m_data.symbolLocInline.begin(), m_data.symbolLocInline.begin() + m_data.newInlineSymbolsIndex, m_data.symbolLocInline[m_data.newInlineSymbolsIndex] ); + std::inplace_merge( ms, m_data.symbolLocInline.begin() + m_data.newInlineSymbolsIndex, m_data.symbolLocInline.end() ); + m_data.newInlineSymbolsIndex = -1; } if( !m_serverQueryQueue.empty() && m_serverQuerySpaceLeft > 0 ) @@ -5602,12 +5606,12 @@ void Worker::ProcessSymbolInformation( const QueueSymbolInformation& ev ) if( !it->second.isInline ) { - if( !m_data.newSymbolsWereAdded ) m_data.newSymbolsWereAdded = true; + if( m_data.newSymbolsIndex < 0 ) m_data.newSymbolsIndex = int64_t( m_data.symbolLoc.size() ); m_data.symbolLoc.push_back( SymbolLocation { ev.symAddr, it->second.size } ); } else { - if( !m_data.newInlineSymbolsWereAdded ) m_data.newInlineSymbolsWereAdded = true; + if( m_data.newInlineSymbolsIndex < 0 ) m_data.newInlineSymbolsIndex = int64_t( m_data.symbolLocInline.size() ); m_data.symbolLocInline.push_back( ev.symAddr ); } diff --git a/server/TracyWorker.hpp b/server/TracyWorker.hpp index fbe21e8f..47a076be 100644 --- a/server/TracyWorker.hpp +++ b/server/TracyWorker.hpp @@ -277,8 +277,8 @@ private: unordered_flat_map symbolStats; Vector symbolLoc; Vector symbolLocInline; - bool newSymbolsWereAdded = false; - bool newInlineSymbolsWereAdded = false; + int64_t newSymbolsIndex = -1; + int64_t newInlineSymbolsIndex = -1; #ifndef TRACY_NO_STATISTICS unordered_flat_map*, uint32_t, VarArrayHasher, VarArrayComparator> parentCallstackMap;