1
0
mirror of https://github.com/wolfpld/tracy.git synced 2025-03-20 07:40:02 +08:00

Pack csAlloc in MemEvent (saves 3 bytes).

Memory usage change on selected traces:

android     2699 MB -> 2613 MB
chicken     2019 MB -> 2007 MB
mem         6308 MB -> 6068 MB
q3bsp-mt    5283 MB -> 5252 MB
q3bsp-st    1241 MB -> 1211 MB
This commit is contained in:
Bartosz Taudul
2019-10-30 22:01:13 +01:00
parent 94da3b8467
commit 99d198d0bf
3 changed files with 101 additions and 64 deletions
+60 -28
View File
@@ -1119,7 +1119,14 @@ Worker::Worker( FileRead& f, EventType::Type eventMask, bool bgTasks )
for( uint64_t i=0; i<sz; i++ )
{
s_loadProgress.subProgress.store( i, std::memory_order_relaxed );
f.Read( mem, sizeof( MemEvent::ptr ) + sizeof( MemEvent::size ) + sizeof( MemEvent::csAlloc ) + sizeof( MemEvent::csFree ) );
uint64_t ptr, size;
Int24 csAlloc;
f.Read2( ptr, size );
f.Read( &csAlloc, sizeof( csAlloc ) );
mem->SetPtr( ptr );
mem->SetSize( size );
mem->SetCsAlloc( csAlloc.Val() );
f.Read( &mem->csFree, sizeof( mem->csFree ) );
int64_t timeAlloc, timeFree;
uint16_t threadAlloc, threadFree;
f.Read2( timeAlloc, timeFree );
@@ -1134,7 +1141,7 @@ Worker::Worker( FileRead& f, EventType::Type eventMask, bool bgTasks )
else
{
mem->SetTimeFree( timeFree );
active.emplace( mem->ptr, i );
active.emplace( ptr, i );
}
mem->SetThreadAlloc( threadAlloc );
mem->SetThreadFree( threadFree );
@@ -1149,7 +1156,13 @@ Worker::Worker( FileRead& f, EventType::Type eventMask, bool bgTasks )
for( uint64_t i=0; i<sz; i++ )
{
s_loadProgress.subProgress.store( i, std::memory_order_relaxed );
f.Read( mem, sizeof( MemEvent::ptr ) + sizeof( MemEvent::size ) + sizeof( MemEvent::csAlloc ) );
uint64_t ptr, size;
Int24 csAlloc;
f.Read2( ptr, size );
f.Read( &csAlloc, sizeof( csAlloc ) );
mem->SetPtr( ptr );
mem->SetSize( size );
mem->SetCsAlloc( csAlloc.Val() );
f.Skip( 1 );
f.Read( &mem->csFree, sizeof( MemEvent::csFree ) );
f.Skip( 1 );
@@ -1167,7 +1180,7 @@ Worker::Worker( FileRead& f, EventType::Type eventMask, bool bgTasks )
else
{
mem->SetTimeFree( timeFree );
active.emplace( mem->ptr, i );
active.emplace( ptr, i );
}
mem->SetThreadAlloc( threadAlloc );
mem->SetThreadFree( threadFree );
@@ -1182,10 +1195,15 @@ Worker::Worker( FileRead& f, EventType::Type eventMask, bool bgTasks )
for( uint64_t i=0; i<sz; i++ )
{
s_loadProgress.subProgress.store( i, std::memory_order_relaxed );
f.Read( mem, sizeof( MemEvent::ptr ) + sizeof( MemEvent::size ) );
uint64_t ptr, size;
f.Read2( ptr, size );
mem->SetPtr( ptr );
mem->SetSize( size );
int64_t timeAlloc, timeFree;
f.Read2( timeAlloc, timeFree );
f.Read( mem->csAlloc );
Int24 csAlloc;
f.Read( &csAlloc, sizeof( csAlloc ) );
mem->SetCsAlloc( csAlloc.Val() );
f.Skip( 1 );
f.Read( mem->csFree );
f.Skip( 1 );
@@ -1201,7 +1219,7 @@ Worker::Worker( FileRead& f, EventType::Type eventMask, bool bgTasks )
else
{
mem->SetTimeFree( timeFree );
active.emplace( mem->ptr, i );
active.emplace( ptr, i );
}
mem->SetThreadAlloc( threadAlloc );
mem->SetThreadFree( threadFree );
@@ -1213,12 +1231,18 @@ Worker::Worker( FileRead& f, EventType::Type eventMask, bool bgTasks )
for( uint64_t i=0; i<sz; i++ )
{
s_loadProgress.subProgress.store( i, std::memory_order_relaxed );
uint64_t ptr;
if( fileVer > FileVersion( 0, 4, 1 ) )
{
f.Read( mem, sizeof( MemEvent::ptr ) + sizeof( MemEvent::size ) );
uint64_t size;
f.Read2( ptr, size );
mem->SetPtr( ptr );
mem->SetSize( size );
int64_t timeAlloc, timeFree;
f.Read2( timeAlloc, timeFree );
f.Read( mem->csAlloc );
Int24 csAlloc;
f.Read( &csAlloc, sizeof( csAlloc ) );
mem->SetCsAlloc( csAlloc.Val() );
f.Skip( 1 );
f.Read( mem->csFree );
f.Skip( 1 );
@@ -1235,10 +1259,15 @@ Worker::Worker( FileRead& f, EventType::Type eventMask, bool bgTasks )
}
else
{
f.Read( mem, sizeof( MemEvent::ptr ) + sizeof( MemEvent::size ) );
uint64_t ptr, size;
f.Read2( ptr, size );
mem->SetPtr( ptr );
mem->SetSize( size );
int64_t timeAlloc, timeFree;
f.Read2( timeAlloc, timeFree );
f.Read( mem->csAlloc );
Int24 csAlloc;
f.Read( &csAlloc, sizeof( csAlloc ) );
mem->SetCsAlloc( csAlloc.Val() );
f.Skip( 1 );
f.Read( mem->csFree );
f.Skip( 1 );
@@ -1267,7 +1296,7 @@ Worker::Worker( FileRead& f, EventType::Type eventMask, bool bgTasks )
if( mem->TimeFree() < 0 )
{
m_data.memory.active.emplace( mem->ptr, i );
m_data.memory.active.emplace( ptr, i );
}
else
{
@@ -1293,19 +1322,19 @@ Worker::Worker( FileRead& f, EventType::Type eventMask, bool bgTasks )
if( fileVer >= FileVersion( 0, 5, 9 ) )
{
f.Skip( sz * ( sizeof( MemEvent::ptr ) + sizeof( MemEvent::size ) + sizeof( MemEvent::csAlloc ) + sizeof( MemEvent::csFree ) + sizeof( int64_t ) * 2 + sizeof( uint16_t ) * 2 ) );
f.Skip( sz * ( sizeof( uint64_t ) + sizeof( uint64_t ) + sizeof( Int24 ) + sizeof( Int24 ) + sizeof( int64_t ) * 2 + sizeof( uint16_t ) * 2 ) );
}
else if( fileVer >= FileVersion( 0, 5, 2 ) )
{
f.Skip( sz * ( sizeof( MemEvent::ptr ) + sizeof( MemEvent::size ) + sizeof( uint32_t ) + sizeof( uint32_t ) + sizeof( int64_t ) * 2 + sizeof( uint16_t ) * 2 ) );
f.Skip( sz * ( sizeof( uint64_t ) + sizeof( uint64_t ) + sizeof( uint32_t ) + sizeof( uint32_t ) + sizeof( int64_t ) * 2 + sizeof( uint16_t ) * 2 ) );
}
else if( fileVer >= FileVersion( 0, 4, 4 ) )
{
f.Skip( sz * ( sizeof( MemEvent::ptr ) + sizeof( MemEvent::size ) + sizeof( int64_t ) + sizeof( int64_t ) + sizeof( uint32_t ) + sizeof( uint32_t ) + sizeof( uint16_t ) + sizeof( uint16_t ) ) );
f.Skip( sz * ( sizeof( uint64_t ) + sizeof( uint64_t ) + sizeof( int64_t ) + sizeof( int64_t ) + sizeof( uint32_t ) + sizeof( uint32_t ) + sizeof( uint16_t ) + sizeof( uint16_t ) ) );
}
else
{
f.Skip( sz * ( sizeof( MemEvent::ptr ) + sizeof( MemEvent::size ) + sizeof( int64_t ) + sizeof( int64_t ) + sizeof( uint32_t ) + sizeof( uint32_t ) + 2 * sizeof( uint64_t ) ) );
f.Skip( sz * ( sizeof( uint64_t ) + sizeof( uint64_t ) + sizeof( int64_t ) + sizeof( int64_t ) + sizeof( uint32_t ) + sizeof( uint32_t ) + 2 * sizeof( uint64_t ) ) );
}
f.Skip( sizeof( MemData::high ) + sizeof( MemData::low ) + sizeof( MemData::usage ) );
@@ -4326,13 +4355,13 @@ void Worker::ProcessMemAlloc( const QueueMemAlloc& ev )
const uint64_t size = lo | ( uint64_t( hi ) << 32 );
auto& mem = m_data.memory.data.push_next();
mem.ptr = ptr;
mem.size = size;
mem.SetPtr( ptr );
mem.SetSize( size );
mem.SetTimeAlloc( time );
mem.SetThreadAlloc( CompressThread( ev.thread ) );
mem.SetTimeFree( -1 );
mem.SetThreadFree( 0 );
mem.csAlloc.SetVal( 0 );
mem.SetCsAlloc( 0 );
mem.csFree.SetVal( 0 );
const auto low = m_data.memory.low;
@@ -4370,7 +4399,7 @@ bool Worker::ProcessMemFree( const QueueMemFree& ev )
auto& mem = m_data.memory.data[it->second];
mem.SetTimeFree( time );
mem.SetThreadFree( CompressThread( ev.thread ) );
m_data.memory.usage -= mem.size;
m_data.memory.usage -= mem.Size();
m_data.memory.active.erase( it );
MemAllocChanged( time );
@@ -4407,7 +4436,7 @@ void Worker::ProcessCallstackMemory( const QueueCallstackMemory& ev )
auto& mem = m_data.memory.data[m_lastMemActionCallstack];
if( m_lastMemActionWasAlloc )
{
mem.csAlloc.SetVal( m_pendingCallstackId );
mem.SetCsAlloc( m_pendingCallstackId );
}
else
{
@@ -4757,7 +4786,7 @@ void Worker::ReconstructMemAllocPlot()
{
if( atime < ftime )
{
usage += int64_t( aptr->size );
usage += int64_t( aptr->Size() );
assert( usage >= 0 );
if( max < usage ) max = usage;
ptr->time = atime;
@@ -4769,7 +4798,7 @@ void Worker::ReconstructMemAllocPlot()
}
else
{
usage -= int64_t( mem.data[*fptr].size );
usage -= int64_t( mem.data[*fptr].Size() );
assert( usage >= 0 );
if( max < usage ) max = usage;
ptr->time = ftime;
@@ -4786,7 +4815,7 @@ void Worker::ReconstructMemAllocPlot()
{
assert( aptr->TimeFree() < 0 );
int64_t time = aptr->TimeAlloc();
usage += int64_t( aptr->size );
usage += int64_t( aptr->Size() );
assert( usage >= 0 );
if( max < usage ) max = usage;
ptr->time = time;
@@ -4798,7 +4827,7 @@ void Worker::ReconstructMemAllocPlot()
{
const auto& memData = mem.data[*fptr];
int64_t time = memData.TimeFree();
usage -= int64_t( memData.size );
usage -= int64_t( memData.Size() );
assert( usage >= 0 );
assert( max >= usage );
ptr->time = time;
@@ -5532,9 +5561,12 @@ void Worker::Write( FileWrite& f )
f.Write( &sz, sizeof( sz ) );
for( auto& mem : m_data.memory.data )
{
f.Write( &mem.ptr, sizeof( mem.ptr ) );
f.Write( &mem.size, sizeof( mem.size ) );
f.Write( &mem.csAlloc, sizeof( mem.csAlloc ) );
const auto ptr = mem.Ptr();
const auto size = mem.Size();
const Int24 csAlloc = mem.CsAlloc();
f.Write( &ptr, sizeof( ptr ) );
f.Write( &size, sizeof( size ) );
f.Write( &csAlloc, sizeof( csAlloc ) );
f.Write( &mem.csFree, sizeof( mem.csFree ) );
int64_t timeAlloc = mem.TimeAlloc();