1
0
mirror of https://github.com/wolfpld/tracy synced 2025-05-02 05:33:53 +00:00

Construct queue items directly in queue memory.

This commit is contained in:
Bartosz Taudul 2017-10-01 17:49:45 +02:00
parent 99b8c4c77e
commit f46781808c
3 changed files with 73 additions and 62 deletions

View File

@ -32,37 +32,12 @@ static thread_local moodycamel::ProducerToken s_token( s_queue );
static std::atomic<uint64_t> s_id( 0 ); static std::atomic<uint64_t> s_id( 0 );
static inline uint64_t GetNewId()
{
return s_id.fetch_add( 1, std::memory_order_relaxed );
}
#ifndef TRACY_DISABLE #ifndef TRACY_DISABLE
static Profiler s_profiler; static Profiler s_profiler;
#endif #endif
static Profiler* s_instance = nullptr; static Profiler* s_instance = nullptr;
static inline uint64_t ZoneBeginImpl( moodycamel::ProducerToken& token, QueueZoneBegin&& data )
{
auto id = GetNewId();
QueueItem item;
item.hdr.type = QueueType::ZoneBegin;
item.hdr.id = id;
item.zoneBegin = std::move( data );
s_queue.enqueue( token, std::move( item ) );
return id;
}
static inline void ZoneEndImpl( moodycamel::ProducerToken& token, uint64_t id, QueueZoneEnd&& data )
{
QueueItem item;
item.hdr.type = QueueType::ZoneEnd;
item.hdr.id = id;
item.zoneEnd = std::move( data );
s_queue.enqueue( token, std::move( item ) );
}
Profiler::Profiler() Profiler::Profiler()
: m_mainThread( GetThreadHandle() ) : m_mainThread( GetThreadHandle() )
, m_shutdown( false ) , m_shutdown( false )
@ -93,40 +68,27 @@ Profiler::~Profiler()
s_instance = nullptr; s_instance = nullptr;
} }
uint64_t Profiler::ZoneBegin( QueueZoneBegin&& data ) QueueItem* Profiler::StartItem()
{ {
return ZoneBeginImpl( s_token, std::move( data ) ); return s_queue.enqueue_begin( s_token );
} }
void Profiler::ZoneEnd( uint64_t id, QueueZoneEnd&& data ) void Profiler::FinishItem()
{ {
ZoneEndImpl( s_token, id, std::move( data ) ); s_queue.enqueue_finish( s_token );
} }
void Profiler::ZoneText( uint64_t id, QueueZoneText&& data ) uint64_t Profiler::GetNewId()
{ {
QueueItem item; return s_id.fetch_add( 1, std::memory_order_relaxed );
item.hdr.type = QueueType::ZoneText;
item.hdr.id = id;
item.zoneText = std::move( data );
s_queue.enqueue( s_token, std::move( item ) );
}
void Profiler::ZoneName( uint64_t id, QueueZoneName&& data )
{
QueueItem item;
item.hdr.type = QueueType::ZoneName;
item.hdr.id = id;
item.zoneName = std::move( data );
s_queue.enqueue( s_token, std::move( item ) );
} }
void Profiler::FrameMark() void Profiler::FrameMark()
{ {
QueueItem item; auto item = s_queue.enqueue_begin( s_token );
item.hdr.type = QueueType::FrameMarkMsg; item->hdr.type = QueueType::FrameMarkMsg;
item.hdr.id = (uint64_t)GetTime(); item->hdr.id = (uint64_t)GetTime();
s_queue.enqueue( s_token, std::move( item ) ); s_queue.enqueue_finish( s_token );
} }
bool Profiler::ShouldExit() bool Profiler::ShouldExit()
@ -337,9 +299,24 @@ void Profiler::CalibrateDelay()
moodycamel::ProducerToken ptoken( s_queue ); moodycamel::ProducerToken ptoken( s_queue );
for( int i=0; i<Iterations; i++ ) for( int i=0; i<Iterations; i++ )
{ {
static const tracy::SourceLocation __tracy_source_location { __FUNCTION__, __FILE__, __LINE__, 0 }; static const tracy::SourceLocation __tracy_source_location { __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 };
const auto id = ZoneBeginImpl( ptoken, QueueZoneBegin { Profiler::GetTime(), (uint64_t)&__tracy_source_location, GetThreadHandle() } ); const auto id = GetNewId();
ZoneEndImpl( ptoken, id, QueueZoneEnd { Profiler::GetTime() } ); {
auto item = s_queue.enqueue_begin( ptoken );
item->hdr.type = QueueType::ZoneBegin;
item->hdr.id = id;
item->zoneBegin.time = GetTime();
item->zoneBegin.srcloc = (uint64_t)&__tracy_source_location;
item->zoneBegin.thread = GetThreadHandle();
s_queue.enqueue_finish( ptoken );
}
{
auto item = s_queue.enqueue_begin( ptoken );
item->hdr.type = QueueType::ZoneEnd;
item->hdr.id = id;
item->zoneEnd.time = GetTime();
s_queue.enqueue_finish( ptoken );
}
} }
const auto f0 = GetTime(); const auto f0 = GetTime();
for( int i=0; i<Iterations; i++ ) for( int i=0; i<Iterations; i++ )
@ -350,9 +327,24 @@ void Profiler::CalibrateDelay()
const auto t0 = GetTime(); const auto t0 = GetTime();
for( int i=0; i<Iterations; i++ ) for( int i=0; i<Iterations; i++ )
{ {
static const tracy::SourceLocation __tracy_source_location { __FUNCTION__, __FILE__, __LINE__, 0 }; static const tracy::SourceLocation __tracy_source_location { __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 };
const auto id = ZoneBeginImpl( ptoken, QueueZoneBegin { Profiler::GetTime(), (uint64_t)&__tracy_source_location, GetThreadHandle() } ); const auto id = GetNewId();
ZoneEndImpl( ptoken, id, QueueZoneEnd { Profiler::GetTime() } ); {
auto item = s_queue.enqueue_begin( ptoken );
item->hdr.type = QueueType::ZoneBegin;
item->hdr.id = id;
item->zoneBegin.time = GetTime();
item->zoneBegin.srcloc = (uint64_t)&__tracy_source_location;
item->zoneBegin.thread = GetThreadHandle();
s_queue.enqueue_finish( ptoken );
}
{
auto item = s_queue.enqueue_begin( ptoken );
item->hdr.type = QueueType::ZoneEnd;
item->hdr.id = id;
item->zoneEnd.time = GetTime();
s_queue.enqueue_finish( ptoken );
}
} }
const auto t1 = GetTime(); const auto t1 = GetTime();
const auto dt = t1 - t0; const auto dt = t1 - t0;

View File

@ -42,10 +42,10 @@ public:
#endif #endif
} }
static uint64_t ZoneBegin( QueueZoneBegin&& data ); static QueueItem* StartItem();
static void ZoneEnd( uint64_t id, QueueZoneEnd&& data ); static void FinishItem();
static void ZoneText( uint64_t id, QueueZoneText&& data ); static uint64_t GetNewId();
static void ZoneName( uint64_t id, QueueZoneName&& data );
static void FrameMark(); static void FrameMark();
static bool ShouldExit(); static bool ShouldExit();

View File

@ -14,13 +14,24 @@ class ScopedZone
{ {
public: public:
ScopedZone( const SourceLocation* srcloc ) ScopedZone( const SourceLocation* srcloc )
: m_id( Profiler::ZoneBegin( QueueZoneBegin { Profiler::GetTime(), (uint64_t)srcloc, GetThreadHandle() } ) ) : m_id( Profiler::GetNewId() )
{ {
auto item = Profiler::StartItem();
item->hdr.type = QueueType::ZoneBegin;
item->hdr.id = m_id;
item->zoneBegin.time = Profiler::GetTime();
item->zoneBegin.srcloc = (uint64_t)srcloc;
item->zoneBegin.thread = GetThreadHandle();
Profiler::FinishItem();
} }
~ScopedZone() ~ScopedZone()
{ {
Profiler::ZoneEnd( m_id, QueueZoneEnd { Profiler::GetTime() } ); auto item = Profiler::StartItem();
item->hdr.type = QueueType::ZoneEnd;
item->hdr.id = m_id;
item->zoneEnd.time = Profiler::GetTime();
Profiler::FinishItem();
} }
void Text( const char* txt, size_t size ) void Text( const char* txt, size_t size )
@ -28,12 +39,20 @@ public:
auto ptr = new char[size+1]; auto ptr = new char[size+1];
memcpy( ptr, txt, size ); memcpy( ptr, txt, size );
ptr[size] = '\0'; ptr[size] = '\0';
Profiler::ZoneText( m_id, QueueZoneText { (uint64_t)ptr } ); auto item = Profiler::StartItem();
item->hdr.type = QueueType::ZoneText;
item->hdr.id = m_id;
item->zoneText.text = (uint64_t)ptr;
Profiler::FinishItem();
} }
void Name( const char* name ) void Name( const char* name )
{ {
Profiler::ZoneName( m_id, QueueZoneName { (uint64_t)name } ); auto item = Profiler::StartItem();
item->hdr.type = QueueType::ZoneName;
item->hdr.id = m_id;
item->zoneName.name = (uint64_t)name;
Profiler::FinishItem();
} }
private: private: