Sort source location zones only when needed.

This commit is contained in:
Bartosz Taudul 2021-11-14 16:05:55 +01:00
parent befeffb61e
commit cb004e9cc0
No known key found for this signature in database
GPG Key ID: B7FE2008B7575DF3
3 changed files with 19 additions and 24 deletions

View File

@ -1980,6 +1980,7 @@ void View::DrawFrames()
if( m_worker.AreSourceLocationZonesReady() && m_findZone.show && m_findZone.showZoneInFrames && !m_findZone.match.empty() ) if( m_worker.AreSourceLocationZonesReady() && m_findZone.show && m_findZone.showZoneInFrames && !m_findZone.match.empty() )
{ {
auto& zoneData = m_worker.GetZonesForSourceLocation( m_findZone.match[m_findZone.selMatch] ); auto& zoneData = m_worker.GetZonesForSourceLocation( m_findZone.match[m_findZone.selMatch] );
zoneData.zones.ensure_sorted();
auto begin = zoneData.zones.begin(); auto begin = zoneData.zones.begin();
while( i < onScreen && m_vd.frameStart + idx < total ) while( i < onScreen && m_vd.frameStart + idx < total )
{ {
@ -9927,11 +9928,12 @@ void View::DrawFindZone()
ImGui::Separator(); ImGui::Separator();
auto& zoneData = m_worker.GetZonesForSourceLocation( m_findZone.match[m_findZone.selMatch] ); auto& zoneData = m_worker.GetZonesForSourceLocation( m_findZone.match[m_findZone.selMatch] );
auto& zones = zoneData.zones;
zones.ensure_sorted();
if( ImGui::TreeNodeEx( "Histogram", ImGuiTreeNodeFlags_DefaultOpen ) ) if( ImGui::TreeNodeEx( "Histogram", ImGuiTreeNodeFlags_DefaultOpen ) )
{ {
const auto ty = ImGui::GetFontSize(); const auto ty = ImGui::GetFontSize();
auto& zones = zoneData.zones;
int64_t tmin = m_findZone.tmin; int64_t tmin = m_findZone.tmin;
int64_t tmax = m_findZone.tmax; int64_t tmax = m_findZone.tmax;
int64_t total = m_findZone.total; int64_t total = m_findZone.total;
@ -10940,7 +10942,6 @@ void View::DrawFindZone()
ImGui::SameLine(); ImGui::SameLine();
DrawHelpMarker( "Mean time per call" ); DrawHelpMarker( "Mean time per call" );
auto& zones = zoneData.zones;
const auto hmin = std::min( m_findZone.highlight.start, m_findZone.highlight.end ); const auto hmin = std::min( m_findZone.highlight.start, m_findZone.highlight.end );
const auto hmax = std::max( m_findZone.highlight.start, m_findZone.highlight.end ); const auto hmax = std::max( m_findZone.highlight.start, m_findZone.highlight.end );
const auto groupBy = m_findZone.groupBy; const auto groupBy = m_findZone.groupBy;
@ -12061,6 +12062,8 @@ void View::DrawCompare()
auto& zoneData1 = m_compare.second->GetZonesForSourceLocation( m_compare.match[1][m_compare.selMatch[1]] ); auto& zoneData1 = m_compare.second->GetZonesForSourceLocation( m_compare.match[1][m_compare.selMatch[1]] );
auto& zones0 = zoneData0.zones; auto& zones0 = zoneData0.zones;
auto& zones1 = zoneData1.zones; auto& zones1 = zoneData1.zones;
zones0.ensure_sorted();
zones1.ensure_sorted();
tmin = std::min( zoneData0.min, zoneData1.min ); tmin = std::min( zoneData0.min, zoneData1.min );
tmax = std::max( zoneData0.max, zoneData1.max ); tmax = std::max( zoneData0.max, zoneData1.max );
@ -18374,7 +18377,7 @@ const ZoneEvent* View::GetZoneParent( const ZoneEvent& zone ) const
if( m_worker.AreSourceLocationZonesReady() ) if( m_worker.AreSourceLocationZonesReady() )
{ {
auto& slz = m_worker.GetZonesForSourceLocation( zone.SrcLoc() ); auto& slz = m_worker.GetZonesForSourceLocation( zone.SrcLoc() );
if( !slz.zones.empty() ) if( !slz.zones.empty() && slz.zones.is_sorted() )
{ {
auto it = std::lower_bound( slz.zones.begin(), slz.zones.end(), zone.Start(), [] ( const auto& lhs, const auto& rhs ) { return lhs.Zone()->Start() < rhs; } ); auto it = std::lower_bound( slz.zones.begin(), slz.zones.end(), zone.Start(), [] ( const auto& lhs, const auto& rhs ) { return lhs.Zone()->Start() < rhs; } );
if( it != slz.zones.end() && it->Zone() == &zone ) if( it != slz.zones.end() && it->Zone() == &zone )
@ -18457,7 +18460,7 @@ bool View::IsZoneReentry( const ZoneEvent& zone ) const
if( m_worker.AreSourceLocationZonesReady() ) if( m_worker.AreSourceLocationZonesReady() )
{ {
auto& slz = m_worker.GetZonesForSourceLocation( zone.SrcLoc() ); auto& slz = m_worker.GetZonesForSourceLocation( zone.SrcLoc() );
if( !slz.zones.empty() ) if( !slz.zones.empty() && slz.zones.is_sorted() )
{ {
auto it = std::lower_bound( slz.zones.begin(), slz.zones.end(), zone.Start(), [] ( const auto& lhs, const auto& rhs ) { return lhs.Zone()->Start() < rhs; } ); auto it = std::lower_bound( slz.zones.begin(), slz.zones.end(), zone.Start(), [] ( const auto& lhs, const auto& rhs ) { return lhs.Zone()->Start() < rhs; } );
if( it != slz.zones.end() && it->Zone() == &zone ) if( it != slz.zones.end() && it->Zone() == &zone )
@ -18582,7 +18585,7 @@ const ThreadData* View::GetZoneThreadData( const ZoneEvent& zone ) const
if( m_worker.AreSourceLocationZonesReady() ) if( m_worker.AreSourceLocationZonesReady() )
{ {
auto& slz = m_worker.GetZonesForSourceLocation( zone.SrcLoc() ); auto& slz = m_worker.GetZonesForSourceLocation( zone.SrcLoc() );
if( !slz.zones.empty() ) if( !slz.zones.empty() && slz.zones.is_sorted() )
{ {
auto it = std::lower_bound( slz.zones.begin(), slz.zones.end(), zone.Start(), [] ( const auto& lhs, const auto& rhs ) { return lhs.Zone()->Start() < rhs; } ); auto it = std::lower_bound( slz.zones.begin(), slz.zones.end(), zone.Start(), [] ( const auto& lhs, const auto& rhs ) { return lhs.Zone()->Start() < rhs; } );
if( it != slz.zones.end() && it->Zone() == &zone ) if( it != slz.zones.end() && it->Zone() == &zone )

View File

@ -1948,6 +1948,8 @@ Worker::Worker( FileRead& f, EventType::Type eventMask, bool bgTasks )
ProcessTimeline( countMap, t->timeline, m_data.localThreadCompress.DecompressMustRaw( t->id ) ); ProcessTimeline( countMap, t->timeline, m_data.localThreadCompress.DecompressMustRaw( t->id ) );
} }
} }
std::lock_guard<std::mutex> lock( m_data.lock );
m_data.sourceLocationZonesReady = true;
} ) ); } ) );
if( eventMask & EventType::Samples ) if( eventMask & EventType::Samples )
@ -2093,17 +2095,6 @@ Worker::Worker( FileRead& f, EventType::Type eventMask, bool bgTasks )
} }
for( auto& job : jobs ) job.join(); for( auto& job : jobs ) job.join();
for( auto& v : m_data.sourceLocationZones )
{
if( m_shutdown.load( std::memory_order_relaxed ) ) return;
if( !v.second.zones.is_sorted() ) v.second.zones.sort();
}
{
std::lock_guard<std::mutex> lock( m_data.lock );
m_data.sourceLocationZonesReady = true;
}
m_backgroundDone.store( true, std::memory_order_relaxed ); m_backgroundDone.store( true, std::memory_order_relaxed );
} ); } );
#else #else
@ -2904,6 +2895,14 @@ std::vector<int16_t> Worker::GetMatchingSourceLocation( const char* query, bool
} }
#ifndef TRACY_NO_STATISTICS #ifndef TRACY_NO_STATISTICS
Worker::SourceLocationZones& Worker::GetZonesForSourceLocation( int16_t srcloc )
{
assert( AreSourceLocationZonesReady() );
static SourceLocationZones empty;
auto it = m_data.sourceLocationZones.find( srcloc );
return it != m_data.sourceLocationZones.end() ? it->second : empty;
}
const Worker::SourceLocationZones& Worker::GetZonesForSourceLocation( int16_t srcloc ) const const Worker::SourceLocationZones& Worker::GetZonesForSourceLocation( int16_t srcloc ) const
{ {
assert( AreSourceLocationZonesReady() ); assert( AreSourceLocationZonesReady() );
@ -4349,14 +4348,6 @@ void Worker::DoPostponedWork()
m_data.newFramesWereReceived = false; m_data.newFramesWereReceived = false;
} }
if( m_data.sourceLocationZonesReady )
{
for( auto& slz : m_data.sourceLocationZones )
{
if( !slz.second.zones.is_sorted() ) slz.second.zones.sort();
}
}
if( m_data.newContextSwitchesReceived ) if( m_data.newContextSwitchesReceived )
{ {
for( auto& td : m_data.threads ) for( auto& td : m_data.threads )

View File

@ -566,6 +566,7 @@ public:
std::vector<int16_t> GetMatchingSourceLocation( const char* query, bool ignoreCase ) const; std::vector<int16_t> GetMatchingSourceLocation( const char* query, bool ignoreCase ) const;
#ifndef TRACY_NO_STATISTICS #ifndef TRACY_NO_STATISTICS
SourceLocationZones& GetZonesForSourceLocation( int16_t srcloc );
const SourceLocationZones& GetZonesForSourceLocation( int16_t srcloc ) const; const SourceLocationZones& GetZonesForSourceLocation( int16_t srcloc ) const;
const unordered_flat_map<int16_t, SourceLocationZones>& GetSourceLocationZones() const { return m_data.sourceLocationZones; } const unordered_flat_map<int16_t, SourceLocationZones>& GetSourceLocationZones() const { return m_data.sourceLocationZones; }
bool AreSourceLocationZonesReady() const { return m_data.sourceLocationZonesReady; } bool AreSourceLocationZonesReady() const { return m_data.sourceLocationZonesReady; }