From ae4794ab4cad82d8f9a9ecf67eb1d495a04d4850 Mon Sep 17 00:00:00 2001 From: Bartosz Taudul Date: Wed, 30 Oct 2019 22:25:46 +0100 Subject: [PATCH] Save 2 bytes in ContextSwitchData and ContextSwitchCpu. --- server/TracyEvent.hpp | 36 ++++++++++++++++++++++++++++++++---- server/TracyView.cpp | 16 ++++++++-------- server/TracyWorker.cpp | 8 ++++---- 3 files changed, 44 insertions(+), 16 deletions(-) diff --git a/server/TracyEvent.hpp b/server/TracyEvent.hpp index e373611a..06d03193 100644 --- a/server/TracyEvent.hpp +++ b/server/TracyEvent.hpp @@ -108,6 +108,32 @@ private: uint8_t m_val[3]; }; +class Int48 +{ +public: + tracy_force_inline Int48() { memset( m_val, 0, sizeof( m_val ) ); } + tracy_force_inline Int48( int64_t val ) + { + SetVal( val ); + } + + tracy_force_inline void SetVal( int64_t val ) + { + memcpy( m_val, &val, 6 ); + } + + tracy_force_inline int64_t Val() const + { + int64_t val = 0; + memcpy( ((char*)&val)+2, m_val, 6 ); + val >>= 16; + return val; + } + +private: + uint8_t m_val[6]; +}; + struct SourceLocation { @@ -312,10 +338,12 @@ struct ContextSwitchData tracy_force_inline void SetReason( int8_t reason ) { memcpy( ((char*)&_end_reason_state)+1, &reason, 1 ); } tracy_force_inline int8_t State() const { return int8_t( _end_reason_state & 0xFF ); } tracy_force_inline void SetState( int8_t state ) { memcpy( &_end_reason_state, &state, 1 ); } + tracy_force_inline int64_t WakeupVal() const { return _wakeup.Val(); } + tracy_force_inline void SetWakeup( int64_t wakeup ) { assert( wakeup < (int64_t)( 1ull << 47 ) ); _wakeup.SetVal( wakeup ); } uint64_t _start_cpu; uint64_t _end_reason_state; - int64_t wakeup; + Int48 _wakeup; }; enum { ContextSwitchDataSize = sizeof( ContextSwitchData ) }; @@ -325,13 +353,13 @@ struct ContextSwitchCpu { tracy_force_inline int64_t Start() const { return int64_t( _start_thread ) >> 16; } tracy_force_inline void SetStart( int64_t start ) { assert( start < (int64_t)( 1ull << 47 ) ); memcpy( ((char*)&_start_thread)+2, &start, 4 ); memcpy( ((char*)&_start_thread)+6, ((char*)&start)+4, 2 ); } - tracy_force_inline int64_t End() const { return _end; } - tracy_force_inline void SetEnd( int64_t end ) { assert( end < (int64_t)( 1ull << 47 ) ); _end = end; } + tracy_force_inline int64_t End() const { return _end.Val(); } + tracy_force_inline void SetEnd( int64_t end ) { assert( end < (int64_t)( 1ull << 47 ) ); _end.SetVal( end ); } tracy_force_inline uint16_t Thread() const { return uint16_t( _start_thread ); } tracy_force_inline void SetThread( uint16_t thread ) { memcpy( &_start_thread, &thread, 2 ); } uint64_t _start_thread; - uint64_t _end; + Int48 _end; }; enum { ContextSwitchCpuSize = sizeof( ContextSwitchCpu ) }; diff --git a/server/TracyView.cpp b/server/TracyView.cpp index bd4b139b..fad735dd 100644 --- a/server/TracyView.cpp +++ b/server/TracyView.cpp @@ -2855,7 +2855,7 @@ void View::DrawContextSwitches( const ContextSwitch* ctx, bool hover, double pxn { const bool migration = pit->Cpu() != ev.Cpu(); const auto px0 = std::max( { ( pit->End() - m_vd.zvStart ) * pxns, -10.0, minpx } ); - const auto pxw = ( ev.wakeup - m_vd.zvStart ) * pxns; + const auto pxw = ( ev.WakeupVal() - m_vd.zvStart ) * pxns; const auto px1 = std::min( ( ev.Start() - m_vd.zvStart ) * pxns, w + 10.0 ); const auto color = migration ? 0xFFEE7711 : 0xFF2222AA; if( m_vd.darkenContextSwitches ) @@ -2863,7 +2863,7 @@ void View::DrawContextSwitches( const ContextSwitch* ctx, bool hover, double pxn draw->AddRectFilled( wpos + ImVec2( px0, round( offset + ty * 0.5 ) ), wpos + ImVec2( px1, endOffset ), 0x661C2321 ); } draw->AddLine( wpos + ImVec2( px0, round( offset + ty * 0.5 ) - 0.5 ), wpos + ImVec2( std::min( pxw, w+10.0 ), round( offset + ty * 0.5 ) - 0.5 ), color, 2 ); - if( ev.wakeup != ev.Start() ) + if( ev.WakeupVal() != ev.Start() ) { draw->AddLine( wpos + ImVec2( std::max( pxw, 10.0 ), round( offset + ty * 0.5 ) - 0.5 ), wpos + ImVec2( px1, round( offset + ty * 0.5 ) - 0.5 ), 0xFF2280A0, 2 ); } @@ -2874,7 +2874,7 @@ void View::DrawContextSwitches( const ContextSwitch* ctx, bool hover, double pxn { ImGui::BeginTooltip(); TextFocused( "Thread is", migration ? "migrating CPUs" : "waiting" ); - TextFocused( "Waiting time:", TimeToString( ev.wakeup - pit->End() ) ); + TextFocused( "Waiting time:", TimeToString( ev.WakeupVal() - pit->End() ) ); if( migration ) { TextFocused( "CPU:", RealToString( pit->Cpu(), true ) ); @@ -2902,18 +2902,18 @@ void View::DrawContextSwitches( const ContextSwitch* ctx, bool hover, double pxn if( ImGui::IsMouseClicked( 2 ) ) { - ZoomToRange( pit->End(), ev.wakeup ); + ZoomToRange( pit->End(), ev.WakeupVal() ); } } - else if( ev.wakeup != ev.Start() && ImGui::IsMouseHoveringRect( wpos + ImVec2( pxw, offset ), wpos + ImVec2( px1, offset + ty ) ) ) + else if( ev.WakeupVal() != ev.Start() && ImGui::IsMouseHoveringRect( wpos + ImVec2( pxw, offset ), wpos + ImVec2( px1, offset + ty ) ) ) { ImGui::BeginTooltip(); TextFocused( "Thread is", "waking up" ); - TextFocused( "Scheduling delay:", TimeToString( ev.Start() - ev.wakeup ) ); + TextFocused( "Scheduling delay:", TimeToString( ev.Start() - ev.WakeupVal() ) ); TextFocused( "CPU:", RealToString( ev.Cpu(), true ) ); if( ImGui::IsMouseClicked( 2 ) ) { - ZoomToRange( pit->End(), ev.wakeup ); + ZoomToRange( pit->End(), ev.WakeupVal() ); } ImGui::EndTooltip(); } @@ -5751,7 +5751,7 @@ void View::DrawZoneInfoWindow() const auto cpu0 = bit->Cpu(); ++bit; const auto cstart = bit->Start(); - const auto cwakeup = bit->wakeup; + const auto cwakeup = bit->WakeupVal(); const auto cpu1 = bit->Cpu(); if( ImGui::Selectable( TimeToString( cend - adjust ) ) ) diff --git a/server/TracyWorker.cpp b/server/TracyWorker.cpp index a7d7aebb..6411104a 100644 --- a/server/TracyWorker.cpp +++ b/server/TracyWorker.cpp @@ -1631,7 +1631,7 @@ Worker::Worker( FileRead& f, EventType::Type eventMask, bool bgTasks ) auto ptr = data->v.data(); for( uint64_t j=0; jwakeup = ReadTimeOffset( f, refTime ); + ptr->SetWakeup( ReadTimeOffset( f, refTime ) ); ptr->SetStart( ReadTimeOffset( f, refTime ) ); int64_t diff; f.Read( diff ); @@ -4656,7 +4656,7 @@ void Worker::ProcessContextSwitch( const QueueContextSwitch& ev ) migration = data.back().Cpu() != ev.cpu; } item = &data.push_next(); - item->wakeup = time; + item->SetWakeup( time ); } item->SetStart( time ); item->SetEnd( -1 ); @@ -4699,7 +4699,7 @@ void Worker::ProcessThreadWakeup( const QueueThreadWakeup& ev ) auto& data = it->second->v; if( !data.empty() && data.back().End() < 0 ) return; // wakeup of a running thread auto& item = data.push_next(); - item.wakeup = time; + item.SetWakeup( time ); item.SetStart( time ); item.SetEnd( -1 ); item.SetCpu( 0 ); @@ -5638,7 +5638,7 @@ void Worker::Write( FileWrite& f ) int64_t refTime = 0; for( auto& cs : ctx->second->v ) { - WriteTimeOffset( f, refTime, cs.wakeup ); + WriteTimeOffset( f, refTime, cs.WakeupVal() ); WriteTimeOffset( f, refTime, cs.Start() ); WriteTimeOffset( f, refTime, cs.End() ); uint8_t cpu = cs.Cpu();