Cache sorted begin and end iterators.

This commit is contained in:
Bartosz Taudul 2019-06-16 01:28:36 +02:00
parent 26f223e4cd
commit 4186a71ee7

View File

@ -6267,17 +6267,20 @@ void View::DrawFindZone()
const auto& sorted = m_findZone.sorted; const auto& sorted = m_findZone.sorted;
auto sortedBegin = sorted.begin();
auto sortedEnd = sorted.end();
while( sortedBegin != sortedEnd && *sortedBegin == 0 ) ++sortedBegin;
if( m_findZone.logTime ) if( m_findZone.logTime )
{ {
const auto tMinLog = log10( tmin ); const auto tMinLog = log10( tmin );
const auto zmax = ( log10( tmax ) - tMinLog ) / numBins; const auto zmax = ( log10( tmax ) - tMinLog ) / numBins;
{ {
auto zit = sorted.begin(); auto zit = sortedBegin;
while( zit != sorted.end() && *zit == 0 ) ++zit;
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 = int64_t( pow( 10.0, tMinLog + ( i+1 ) * zmax ) );
auto nit = std::lower_bound( zit, sorted.end(), 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 ) );
bins[i] = distance; bins[i] = distance;
@ -6289,10 +6292,10 @@ void View::DrawFindZone()
} }
zit = nit; zit = nit;
} }
const auto timeSum = std::accumulate( zit, sorted.end(), int64_t( 0 ) ); const auto timeSum = std::accumulate( zit, sortedEnd, int64_t( 0 ) );
bins[numBins-1] += std::distance( zit, sorted.end() ); bins[numBins-1] += std::distance( zit, sortedEnd );
binTime[numBins-1] += timeSum; binTime[numBins-1] += timeSum;
if( m_findZone.highlight.active && *zit >= s && *(sorted.end()-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 )
@ -6318,12 +6321,11 @@ void View::DrawFindZone()
else else
{ {
const auto zmax = tmax - tmin; const auto zmax = tmax - tmin;
auto zit = sorted.begin(); auto zit = sortedBegin;
while( zit != sorted.end() && *zit == 0 ) ++zit;
for( int64_t i=0; i<numBins; i++ ) for( int64_t i=0; i<numBins; i++ )
{ {
const auto nextBinVal = tmin + ( i+1 ) * zmax / numBins; const auto nextBinVal = tmin + ( i+1 ) * zmax / numBins;
auto nit = std::lower_bound( zit, sorted.end(), 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 ) );
bins[i] = distance; bins[i] = distance;
@ -6335,10 +6337,10 @@ void View::DrawFindZone()
} }
zit = nit; zit = nit;
} }
const auto timeSum = std::accumulate( zit, sorted.end(), int64_t( 0 ) ); const auto timeSum = std::accumulate( zit, sortedEnd, int64_t( 0 ) );
bins[numBins-1] += std::distance( zit, sorted.end() ); bins[numBins-1] += std::distance( zit, sortedEnd );
binTime[numBins-1] += timeSum; binTime[numBins-1] += timeSum;
if( m_findZone.highlight.active && *zit >= s && *(sorted.end()-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 )
{ {