mirror of
https://github.com/wolfpld/tracy.git
synced 2024-11-12 19:31:47 +00:00
Don't recalculate histogram bins every frame.
This remedies slowdown that was only visible when a histogram of a large number of zones (~100 million) was displayed. The slowdown was caused by std::accumulate() calls over whole set of zones.
This commit is contained in:
parent
14398dd4e8
commit
d683699ba9
@ -6313,25 +6313,81 @@ void View::DrawFindZone()
|
|||||||
m_findZone.bins = std::make_unique<int64_t[]>( numBins );
|
m_findZone.bins = std::make_unique<int64_t[]>( numBins );
|
||||||
m_findZone.binTime = std::make_unique<int64_t[]>( numBins );
|
m_findZone.binTime = std::make_unique<int64_t[]>( numBins );
|
||||||
m_findZone.selBin = std::make_unique<int64_t[]>( numBins );
|
m_findZone.selBin = std::make_unique<int64_t[]>( numBins );
|
||||||
|
m_findZone.binCache.numBins = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto& bins = m_findZone.bins;
|
const auto& bins = m_findZone.bins;
|
||||||
const auto& binTime = m_findZone.binTime;
|
const auto& binTime = m_findZone.binTime;
|
||||||
const auto& selBin = m_findZone.selBin;
|
const auto& selBin = m_findZone.selBin;
|
||||||
|
|
||||||
memset( bins.get(), 0, sizeof( int64_t ) * numBins );
|
const auto distBegin = std::distance( sorted.begin(), sortedBegin );
|
||||||
memset( binTime.get(), 0, sizeof( int64_t ) * numBins );
|
const auto distEnd = std::distance( sorted.begin(), sortedEnd );
|
||||||
memset( selBin.get(), 0, sizeof( int64_t ) * numBins );
|
if( m_findZone.binCache.numBins != numBins ||
|
||||||
|
m_findZone.binCache.distBegin != distBegin ||
|
||||||
if( m_findZone.logTime )
|
m_findZone.binCache.distEnd != distEnd )
|
||||||
{
|
{
|
||||||
const auto tMinLog = log10( tmin );
|
m_findZone.binCache.numBins = numBins;
|
||||||
const auto zmax = ( log10( tmax ) - tMinLog ) / numBins;
|
m_findZone.binCache.distBegin = distBegin;
|
||||||
|
m_findZone.binCache.distEnd = distEnd;
|
||||||
|
|
||||||
|
memset( bins.get(), 0, sizeof( int64_t ) * numBins );
|
||||||
|
memset( binTime.get(), 0, sizeof( int64_t ) * numBins );
|
||||||
|
memset( selBin.get(), 0, sizeof( int64_t ) * numBins );
|
||||||
|
|
||||||
|
if( m_findZone.logTime )
|
||||||
{
|
{
|
||||||
|
const auto tMinLog = log10( tmin );
|
||||||
|
const auto zmax = ( log10( tmax ) - tMinLog ) / numBins;
|
||||||
|
{
|
||||||
|
auto zit = sortedBegin;
|
||||||
|
for( int64_t i=0; i<numBins; i++ )
|
||||||
|
{
|
||||||
|
const auto nextBinVal = int64_t( pow( 10.0, tMinLog + ( i+1 ) * zmax ) );
|
||||||
|
auto nit = std::lower_bound( zit, sortedEnd, nextBinVal );
|
||||||
|
const auto distance = std::distance( zit, nit );
|
||||||
|
const auto timeSum = std::accumulate( zit, nit, int64_t( 0 ) );
|
||||||
|
bins[i] = distance;
|
||||||
|
binTime[i] = timeSum;
|
||||||
|
if( m_findZone.highlight.active )
|
||||||
|
{
|
||||||
|
auto end = nit == zit ? zit : nit-1;
|
||||||
|
if( *zit >= s && *end <= e ) selectionTime += timeSum;
|
||||||
|
}
|
||||||
|
zit = nit;
|
||||||
|
}
|
||||||
|
const auto timeSum = std::accumulate( zit, sortedEnd, int64_t( 0 ) );
|
||||||
|
bins[numBins-1] += std::distance( zit, sortedEnd );
|
||||||
|
binTime[numBins-1] += timeSum;
|
||||||
|
if( m_findZone.highlight.active && *zit >= s && *(sortedEnd-1) <= e ) selectionTime += timeSum;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( m_findZone.selGroup != m_findZone.Unselected )
|
||||||
|
{
|
||||||
|
auto zit = m_findZone.selSort.begin();
|
||||||
|
while( zit != m_findZone.selSort.end() && *zit == 0 ) ++zit;
|
||||||
|
for( int64_t i=0; i<numBins; i++ )
|
||||||
|
{
|
||||||
|
const auto nextBinVal = int64_t( pow( 10.0, tMinLog + ( i+1 ) * zmax ) );
|
||||||
|
auto nit = std::lower_bound( zit, m_findZone.selSort.end(), nextBinVal );
|
||||||
|
if( cumulateTime )
|
||||||
|
{
|
||||||
|
selBin[i] = std::accumulate( zit, nit, int64_t( 0 ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selBin[i] = std::distance( zit, nit );
|
||||||
|
}
|
||||||
|
zit = nit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const auto zmax = tmax - tmin;
|
||||||
auto zit = sortedBegin;
|
auto zit = sortedBegin;
|
||||||
for( int64_t i=0; i<numBins; i++ )
|
for( int64_t i=0; i<numBins; i++ )
|
||||||
{
|
{
|
||||||
const auto nextBinVal = int64_t( pow( 10.0, tMinLog + ( i+1 ) * zmax ) );
|
const auto nextBinVal = tmin + ( i+1 ) * zmax / numBins;
|
||||||
auto nit = std::lower_bound( zit, sortedEnd, nextBinVal );
|
auto nit = std::lower_bound( zit, sortedEnd, nextBinVal );
|
||||||
const auto distance = std::distance( zit, nit );
|
const auto distance = std::distance( zit, nit );
|
||||||
const auto timeSum = std::accumulate( zit, nit, int64_t( 0 ) );
|
const auto timeSum = std::accumulate( zit, nit, int64_t( 0 ) );
|
||||||
@ -6348,69 +6404,25 @@ void View::DrawFindZone()
|
|||||||
bins[numBins-1] += std::distance( zit, sortedEnd );
|
bins[numBins-1] += std::distance( zit, sortedEnd );
|
||||||
binTime[numBins-1] += timeSum;
|
binTime[numBins-1] += timeSum;
|
||||||
if( m_findZone.highlight.active && *zit >= s && *(sortedEnd-1) <= e ) selectionTime += timeSum;
|
if( m_findZone.highlight.active && *zit >= s && *(sortedEnd-1) <= e ) selectionTime += timeSum;
|
||||||
}
|
|
||||||
|
|
||||||
if( m_findZone.selGroup != m_findZone.Unselected )
|
if( m_findZone.selGroup != m_findZone.Unselected )
|
||||||
{
|
|
||||||
auto zit = m_findZone.selSort.begin();
|
|
||||||
while( zit != m_findZone.selSort.end() && *zit == 0 ) ++zit;
|
|
||||||
for( int64_t i=0; i<numBins; i++ )
|
|
||||||
{
|
{
|
||||||
const auto nextBinVal = int64_t( pow( 10.0, tMinLog + ( i+1 ) * zmax ) );
|
auto zit = m_findZone.selSort.begin();
|
||||||
auto nit = std::lower_bound( zit, m_findZone.selSort.end(), nextBinVal );
|
while( zit != m_findZone.selSort.end() && *zit == 0 ) ++zit;
|
||||||
if( cumulateTime )
|
for( int64_t i=0; i<numBins; i++ )
|
||||||
{
|
{
|
||||||
selBin[i] = std::accumulate( zit, nit, int64_t( 0 ) );
|
const auto nextBinVal = tmin + ( i+1 ) * zmax / numBins;
|
||||||
|
auto nit = std::lower_bound( zit, m_findZone.selSort.end(), nextBinVal );
|
||||||
|
if( cumulateTime )
|
||||||
|
{
|
||||||
|
selBin[i] = std::accumulate( zit, nit, int64_t( 0 ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selBin[i] = std::distance( zit, nit );
|
||||||
|
}
|
||||||
|
zit = nit;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
selBin[i] = std::distance( zit, nit );
|
|
||||||
}
|
|
||||||
zit = nit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
const auto zmax = tmax - tmin;
|
|
||||||
auto zit = sortedBegin;
|
|
||||||
for( int64_t i=0; i<numBins; i++ )
|
|
||||||
{
|
|
||||||
const auto nextBinVal = tmin + ( i+1 ) * zmax / numBins;
|
|
||||||
auto nit = std::lower_bound( zit, sortedEnd, nextBinVal );
|
|
||||||
const auto distance = std::distance( zit, nit );
|
|
||||||
const auto timeSum = std::accumulate( zit, nit, int64_t( 0 ) );
|
|
||||||
bins[i] = distance;
|
|
||||||
binTime[i] = timeSum;
|
|
||||||
if( m_findZone.highlight.active )
|
|
||||||
{
|
|
||||||
auto end = nit == zit ? zit : nit-1;
|
|
||||||
if( *zit >= s && *end <= e ) selectionTime += timeSum;
|
|
||||||
}
|
|
||||||
zit = nit;
|
|
||||||
}
|
|
||||||
const auto timeSum = std::accumulate( zit, sortedEnd, int64_t( 0 ) );
|
|
||||||
bins[numBins-1] += std::distance( zit, sortedEnd );
|
|
||||||
binTime[numBins-1] += timeSum;
|
|
||||||
if( m_findZone.highlight.active && *zit >= s && *(sortedEnd-1) <= e ) selectionTime += timeSum;
|
|
||||||
|
|
||||||
if( m_findZone.selGroup != m_findZone.Unselected )
|
|
||||||
{
|
|
||||||
auto zit = m_findZone.selSort.begin();
|
|
||||||
while( zit != m_findZone.selSort.end() && *zit == 0 ) ++zit;
|
|
||||||
for( int64_t i=0; i<numBins; i++ )
|
|
||||||
{
|
|
||||||
const auto nextBinVal = tmin + ( i+1 ) * zmax / numBins;
|
|
||||||
auto nit = std::lower_bound( zit, m_findZone.selSort.end(), nextBinVal );
|
|
||||||
if( cumulateTime )
|
|
||||||
{
|
|
||||||
selBin[i] = std::accumulate( zit, nit, int64_t( 0 ) );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
selBin[i] = std::distance( zit, nit );
|
|
||||||
}
|
|
||||||
zit = nit;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -376,6 +376,13 @@ private:
|
|||||||
int selCs = 0;
|
int selCs = 0;
|
||||||
int minBinVal = 1;
|
int minBinVal = 1;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
int numBins = -1;
|
||||||
|
ptrdiff_t distBegin;
|
||||||
|
ptrdiff_t distEnd;
|
||||||
|
} binCache;
|
||||||
|
|
||||||
void Reset()
|
void Reset()
|
||||||
{
|
{
|
||||||
ResetMatch();
|
ResetMatch();
|
||||||
@ -411,6 +418,7 @@ private:
|
|||||||
selAverage = 0;
|
selAverage = 0;
|
||||||
selMedian = 0;
|
selMedian = 0;
|
||||||
selTotal = 0;
|
selTotal = 0;
|
||||||
|
binCache.numBins = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowZone( int32_t srcloc, const char* name )
|
void ShowZone( int32_t srcloc, const char* name )
|
||||||
|
Loading…
Reference in New Issue
Block a user