mirror of
https://github.com/wolfpld/tracy.git
synced 2024-11-10 02:31:48 +00:00
Sampling mode flame graph.
This commit is contained in:
parent
ce39032bc5
commit
504b9d215e
@ -274,7 +274,7 @@ private:
|
|||||||
void DrawSourceTooltip( const char* filename, uint32_t line, int before = 3, int after = 3, bool separateTooltip = true );
|
void DrawSourceTooltip( const char* filename, uint32_t line, int before = 3, int after = 3, bool separateTooltip = true );
|
||||||
void DrawWaitStacks();
|
void DrawWaitStacks();
|
||||||
void DrawFlameGraph();
|
void DrawFlameGraph();
|
||||||
void DrawFlameGraphItem( const FlameGraphItem& item, FlameGraphContext& ctx, uint64_t ts, int depth );
|
void DrawFlameGraphItem( const FlameGraphItem& item, FlameGraphContext& ctx, uint64_t ts, int depth, bool samples );
|
||||||
|
|
||||||
void ListMemData( std::vector<const MemEvent*>& vec, const std::function<void(const MemEvent*)>& DrawAddress, int64_t startTime = -1, uint64_t pool = 0 );
|
void ListMemData( std::vector<const MemEvent*>& vec, const std::function<void(const MemEvent*)>& DrawAddress, int64_t startTime = -1, uint64_t pool = 0 );
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ namespace tracy
|
|||||||
|
|
||||||
struct FlameGraphItem
|
struct FlameGraphItem
|
||||||
{
|
{
|
||||||
int16_t srcloc;
|
int64_t srcloc;
|
||||||
int64_t time;
|
int64_t time;
|
||||||
Vector<FlameGraphItem> children;
|
Vector<FlameGraphItem> children;
|
||||||
};
|
};
|
||||||
@ -107,6 +107,44 @@ static void BuildFlameGraph( const Worker& worker, Vector<FlameGraphItem>& data,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void BuildFlameGraph( const Worker& worker, Vector<FlameGraphItem>& data, const Vector<SampleData>& samples )
|
||||||
|
{
|
||||||
|
for( auto& v : samples )
|
||||||
|
{
|
||||||
|
const auto cs = v.callstack.Val();
|
||||||
|
const auto& callstack = worker.GetCallstack( cs );
|
||||||
|
|
||||||
|
auto vec = &data;
|
||||||
|
const auto csz = callstack.size();
|
||||||
|
for( size_t i=csz; i>0; i--)
|
||||||
|
{
|
||||||
|
auto frame = worker.GetCallstackFrame( callstack[i-1] );
|
||||||
|
if( frame )
|
||||||
|
{
|
||||||
|
for( uint8_t j=frame->size; j>0; j-- )
|
||||||
|
{
|
||||||
|
const auto ip = frame->data[j-1].symAddr;
|
||||||
|
const auto symaddr = worker.GetInlineSymbolForAddress( ip );
|
||||||
|
if( symaddr != 0 )
|
||||||
|
{
|
||||||
|
auto it = std::find_if( vec->begin(), vec->end(), [symaddr]( const auto& v ) { return v.srcloc == symaddr; } );
|
||||||
|
if( it == vec->end() )
|
||||||
|
{
|
||||||
|
vec->push_back( FlameGraphItem { (int64_t)symaddr, 1 } );
|
||||||
|
vec = &vec->back().children;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
it->time++;
|
||||||
|
vec = &it->children;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void SortFlameGraph( Vector<FlameGraphItem>& data )
|
static void SortFlameGraph( Vector<FlameGraphItem>& data )
|
||||||
{
|
{
|
||||||
std::sort( data.begin(), data.end(), []( const FlameGraphItem& lhs, const FlameGraphItem& rhs ) { return lhs.time > rhs.time; } );
|
std::sort( data.begin(), data.end(), []( const FlameGraphItem& lhs, const FlameGraphItem& rhs ) { return lhs.time > rhs.time; } );
|
||||||
@ -133,21 +171,37 @@ struct FlameGraphContext
|
|||||||
double nxps;
|
double nxps;
|
||||||
};
|
};
|
||||||
|
|
||||||
void View::DrawFlameGraphItem( const FlameGraphItem& item, FlameGraphContext& ctx, uint64_t ts, int depth )
|
void View::DrawFlameGraphItem( const FlameGraphItem& item, FlameGraphContext& ctx, uint64_t ts, int depth, bool samples )
|
||||||
{
|
{
|
||||||
const auto x0 = ctx.dpos.x + ts * ctx.pxns;
|
const auto x0 = ctx.dpos.x + ts * ctx.pxns;
|
||||||
const auto x1 = x0 + item.time * ctx.pxns;
|
const auto x1 = x0 + item.time * ctx.pxns;
|
||||||
const auto y0 = ctx.dpos.y + depth * ctx.ostep;
|
const auto y0 = ctx.dpos.y + depth * ctx.ostep;
|
||||||
const auto y1 = y0 + ctx.ty;
|
const auto y1 = y0 + ctx.ty;
|
||||||
|
|
||||||
const auto& srcloc = m_worker.GetSourceLocation( item.srcloc );
|
const SourceLocation* srcloc;
|
||||||
const auto color = GetSrcLocColor( srcloc, depth );
|
uint32_t color;
|
||||||
|
const char* name;
|
||||||
|
const char* slName;
|
||||||
|
|
||||||
|
if( !samples )
|
||||||
|
{
|
||||||
|
srcloc = &m_worker.GetSourceLocation( item.srcloc );
|
||||||
|
color = GetSrcLocColor( *srcloc, depth );
|
||||||
|
name = slName = m_worker.GetString( srcloc->name.active ? srcloc->name : srcloc->function );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto sym = m_worker.GetSymbolData( (uint64_t)item.srcloc );
|
||||||
|
name = m_worker.GetString( sym->name );
|
||||||
|
auto namehash = charutil::hash( name );
|
||||||
|
if( namehash == 0 ) namehash++;
|
||||||
|
color = GetHsvColor( namehash, depth );
|
||||||
|
}
|
||||||
|
|
||||||
const auto hiColor = HighlightColor( color );
|
const auto hiColor = HighlightColor( color );
|
||||||
const auto darkColor = DarkenColor( color );
|
const auto darkColor = DarkenColor( color );
|
||||||
|
|
||||||
const auto zsz = x1 - x0;
|
const auto zsz = x1 - x0;
|
||||||
const char* slName = m_worker.GetString( srcloc.name.active ? srcloc.name : srcloc.function );
|
|
||||||
const char* name = slName;
|
|
||||||
|
|
||||||
auto tsz = ImGui::CalcTextSize( name );
|
auto tsz = ImGui::CalcTextSize( name );
|
||||||
if( m_vd.shortenName == ShortenName::Always || ( ( m_vd.shortenName == ShortenName::NoSpace || m_vd.shortenName == ShortenName::NoSpaceAndNormalize ) && tsz.x > zsz ) )
|
if( m_vd.shortenName == ShortenName::Always || ( ( m_vd.shortenName == ShortenName::NoSpace || m_vd.shortenName == ShortenName::NoSpaceAndNormalize ) && tsz.x > zsz ) )
|
||||||
@ -180,21 +234,21 @@ void View::DrawFlameGraphItem( const FlameGraphItem& item, FlameGraphContext& ct
|
|||||||
ImGui::PopClipRect();
|
ImGui::PopClipRect();
|
||||||
}
|
}
|
||||||
|
|
||||||
if( hover )
|
if( hover && !samples )
|
||||||
{
|
{
|
||||||
uint64_t self = item.time;
|
uint64_t self = item.time;
|
||||||
for( auto& v : item.children ) self -= v.time;
|
for( auto& v : item.children ) self -= v.time;
|
||||||
|
|
||||||
ImGui::BeginTooltip();
|
ImGui::BeginTooltip();
|
||||||
if( srcloc.name.active )
|
if( srcloc->name.active )
|
||||||
{
|
{
|
||||||
ImGui::TextUnformatted( m_worker.GetString( srcloc.name ) );
|
ImGui::TextUnformatted( m_worker.GetString( srcloc->name ) );
|
||||||
}
|
}
|
||||||
ImGui::TextUnformatted( m_worker.GetString( srcloc.function ) );
|
ImGui::TextUnformatted( m_worker.GetString( srcloc->function ) );
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
SmallColorBox( GetSrcLocColor( srcloc, 0 ) );
|
SmallColorBox( GetSrcLocColor( *srcloc, 0 ) );
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::TextUnformatted( LocationToString( m_worker.GetString( srcloc.file ), srcloc.line ) );
|
ImGui::TextUnformatted( LocationToString( m_worker.GetString( srcloc->file ), srcloc->line ) );
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
TextFocused( "Execution time:", TimeToString( item.time ) );
|
TextFocused( "Execution time:", TimeToString( item.time ) );
|
||||||
if( !item.children.empty() )
|
if( !item.children.empty() )
|
||||||
@ -216,7 +270,7 @@ void View::DrawFlameGraphItem( const FlameGraphItem& item, FlameGraphContext& ct
|
|||||||
uint64_t cts = ts;
|
uint64_t cts = ts;
|
||||||
for( auto& v : item.children )
|
for( auto& v : item.children )
|
||||||
{
|
{
|
||||||
DrawFlameGraphItem( v, ctx, cts, depth+1 );
|
DrawFlameGraphItem( v, ctx, cts, depth+1, samples );
|
||||||
cts += v.time;
|
cts += v.time;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -242,7 +296,14 @@ void View::DrawFlameGraph()
|
|||||||
|
|
||||||
Vector<FlameGraphItem> data;
|
Vector<FlameGraphItem> data;
|
||||||
|
|
||||||
|
if( m_flameMode == 0 )
|
||||||
|
{
|
||||||
for( auto& thread : m_worker.GetThreadData() ) BuildFlameGraph( m_worker, data, thread->timeline );
|
for( auto& thread : m_worker.GetThreadData() ) BuildFlameGraph( m_worker, data, thread->timeline );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for( auto& thread : m_worker.GetThreadData() ) BuildFlameGraph( m_worker, data, thread->samples );
|
||||||
|
}
|
||||||
SortFlameGraph( data );
|
SortFlameGraph( data );
|
||||||
|
|
||||||
int64_t zsz = 0;
|
int64_t zsz = 0;
|
||||||
@ -264,7 +325,7 @@ void View::DrawFlameGraph()
|
|||||||
uint64_t ts = 0;
|
uint64_t ts = 0;
|
||||||
for( auto& v : data )
|
for( auto& v : data )
|
||||||
{
|
{
|
||||||
DrawFlameGraphItem( v, ctx, ts, 0 );
|
DrawFlameGraphItem( v, ctx, ts, 0, m_flameMode == 1 );
|
||||||
ts += v.time;
|
ts += v.time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user