Skip to content
Snippets Groups Projects
Commit f4910b9d authored by Radovan Červený's avatar Radovan Červený
Browse files

fixed memory frame memory propagation, introduced in_frame_high_watermark to...

fixed memory frame memory propagation, introduced in_frame_high_watermark to memory frame, renamed some frame fields, fixed some text output issues
parent 753908c5
No related branches found
No related tags found
1 merge request!15BP_cervera3 - automatic measurements, processing
Showing with 78 additions and 41 deletions
......@@ -54,6 +54,10 @@ void MeasurementEngine::reset_measurements ( ) {
 
frames.emplace_back ( "Root", measurements::Type::ROOT, 0 );
frame_idx_stack.push_back ( 0 );
TimeDataFrame::init ( 0, frames );
MemoryDataFrame::init ( 0, frames );
CounterDataFrame::init ( 0, frames );
}
 
MeasurementResults MeasurementEngine::get_results ( ) const {
......@@ -62,7 +66,7 @@ MeasurementResults MeasurementEngine::get_results ( ) const {
 
template < typename Hint >
void MeasurementEngine::hint ( Hint hint ) {
if ( ( frame_idx_stack.size ( ) == 0 ) || ( frames[frame_idx_stack.back ( )].type == measurements::Type::ROOT ) ) return;
if ( ( frame_idx_stack.size ( ) == 0 ) ) return;
 
Hint::frame_type::hint ( frame_idx_stack.back ( ), frames, std::move ( hint ) );
}
......
......@@ -57,9 +57,9 @@ void MeasurementXmlFactory::composeTimeDataFrame ( deque < Token > & tokens, uns
tokens.emplace_back ( TIME_DATA_FRAME_DURATION_TAG, Token::TokenType::START_ELEMENT );
tokens.emplace_back ( std::to_string ( frame.duration.count ( ) ), Token::TokenType::CHARACTER );
tokens.emplace_back ( TIME_DATA_FRAME_DURATION_TAG, Token::TokenType::END_ELEMENT );
tokens.emplace_back ( TIME_DATA_FRAME_REAL_DURATION_TAG, Token::TokenType::START_ELEMENT );
tokens.emplace_back ( std::to_string ( frame.real_duration.count ( ) ), Token::TokenType::CHARACTER );
tokens.emplace_back ( TIME_DATA_FRAME_REAL_DURATION_TAG, Token::TokenType::END_ELEMENT );
tokens.emplace_back ( TIME_DATA_FRAME_IN_FRAME_DURATION_TAG, Token::TokenType::START_ELEMENT );
tokens.emplace_back ( std::to_string ( frame.in_frame_duration.count ( ) ), Token::TokenType::CHARACTER );
tokens.emplace_back ( TIME_DATA_FRAME_IN_FRAME_DURATION_TAG, Token::TokenType::END_ELEMENT );
tokens.emplace_back ( TIME_DATA_FRAME_TAG, Token::TokenType::END_ELEMENT );
}
 
......@@ -76,6 +76,9 @@ void MeasurementXmlFactory::composeMemoryDataFrame ( deque < Token > & tokens, u
tokens.emplace_back ( MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG, Token::TokenType::START_ELEMENT );
tokens.emplace_back ( std::to_string ( frame.high_watermark ), Token::TokenType::CHARACTER );
tokens.emplace_back ( MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG, Token::TokenType::END_ELEMENT );
tokens.emplace_back ( MEMORY_DATA_FRAME_IN_FRAME_HIGH_WATERMARK_TAG, Token::TokenType::START_ELEMENT );
tokens.emplace_back ( std::to_string ( frame.in_frame_high_watermark ), Token::TokenType::CHARACTER );
tokens.emplace_back ( MEMORY_DATA_FRAME_IN_FRAME_HIGH_WATERMARK_TAG, Token::TokenType::END_ELEMENT );
tokens.emplace_back ( MEMORY_DATA_FRAME_TAG, Token::TokenType::END_ELEMENT );
}
 
......@@ -99,9 +102,9 @@ void MeasurementXmlFactory::composeCounterDataFrame ( deque < Token > & tokens,
 
tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTERS_TAG, Token::TokenType::END_ELEMENT );
 
tokens.emplace_back ( COUNTER_DATA_FRAME_REAL_COUNTERS_TAG, Token::TokenType::START_ELEMENT );
tokens.emplace_back ( COUNTER_DATA_FRAME_IN_FRAME_COUNTERS_TAG, Token::TokenType::START_ELEMENT );
 
for ( const auto & elem : cdf.real_counters ) {
for ( const auto & elem : cdf.in_frame_counters ) {
tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_TAG, Token::TokenType::START_ELEMENT );
tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_NAME_TAG, Token::TokenType::START_ELEMENT );
tokens.emplace_back ( measurements::to_string ( elem.first ), Token::TokenType::CHARACTER );
......@@ -112,7 +115,7 @@ void MeasurementXmlFactory::composeCounterDataFrame ( deque < Token > & tokens,
tokens.emplace_back ( COUNTER_DATA_FRAME_COUNTER_TAG, Token::TokenType::END_ELEMENT );
}
 
tokens.emplace_back ( COUNTER_DATA_FRAME_REAL_COUNTERS_TAG, Token::TokenType::END_ELEMENT );
tokens.emplace_back ( COUNTER_DATA_FRAME_IN_FRAME_COUNTERS_TAG, Token::TokenType::END_ELEMENT );
 
tokens.emplace_back ( COUNTER_DATA_FRAME_TAG, Token::TokenType::END_ELEMENT );
}
......@@ -232,10 +235,10 @@ void MeasurementXmlFactory::parseTimeDataFrame ( MeasurementFrame & mf, deque <
FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, TIME_DATA_FRAME_DURATION_TAG );
mf.time.duration = TimeDataFrame::value_type ( valueTypeFromString < TimeDataFrame::value_type::rep > ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) ) );
FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, TIME_DATA_FRAME_DURATION_TAG );
} else if ( data == TIME_DATA_FRAME_REAL_DURATION_TAG ) {
FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, TIME_DATA_FRAME_REAL_DURATION_TAG );
mf.time.real_duration = TimeDataFrame::value_type ( valueTypeFromString < TimeDataFrame::value_type::rep > ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) ) );
FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, TIME_DATA_FRAME_REAL_DURATION_TAG );
} else if ( data == TIME_DATA_FRAME_IN_FRAME_DURATION_TAG ) {
FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, TIME_DATA_FRAME_IN_FRAME_DURATION_TAG );
mf.time.in_frame_duration = TimeDataFrame::value_type ( valueTypeFromString < TimeDataFrame::value_type::rep > ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) ) );
FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, TIME_DATA_FRAME_IN_FRAME_DURATION_TAG );
} else {
break;
}
......@@ -264,6 +267,10 @@ void MeasurementXmlFactory::parseMemoryDataFrame ( MeasurementFrame & mf, deque
FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG );
mf.memory.high_watermark = valueTypeFromString < MemoryDataFrame::value_type > ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) );
FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG );
} else if ( data == MEMORY_DATA_FRAME_IN_FRAME_HIGH_WATERMARK_TAG ) {
FromXMLParserHelper::popToken ( iter, Token::TokenType::START_ELEMENT, MEMORY_DATA_FRAME_IN_FRAME_HIGH_WATERMARK_TAG );
mf.memory.in_frame_high_watermark = valueTypeFromString < MemoryDataFrame::value_type > ( FromXMLParserHelper::popTokenData ( iter, Token::TokenType::CHARACTER ) );
FromXMLParserHelper::popToken ( iter, Token::TokenType::END_ELEMENT, MEMORY_DATA_FRAME_IN_FRAME_HIGH_WATERMARK_TAG );
} else {
break;
}
......@@ -282,8 +289,8 @@ void MeasurementXmlFactory::parseCounterDataFrame ( MeasurementFrame & mf, deque
 
if ( data == COUNTER_DATA_FRAME_COUNTERS_TAG )
parseCounterDataFrameCounters ( COUNTER_DATA_FRAME_COUNTERS_TAG, mf.counter.counters, iter );
else if ( data == COUNTER_DATA_FRAME_REAL_COUNTERS_TAG )
parseCounterDataFrameCounters ( COUNTER_DATA_FRAME_REAL_COUNTERS_TAG, mf.counter.real_counters, iter );
else if ( data == COUNTER_DATA_FRAME_IN_FRAME_COUNTERS_TAG )
parseCounterDataFrameCounters ( COUNTER_DATA_FRAME_IN_FRAME_COUNTERS_TAG, mf.counter.in_frame_counters, iter );
else
break;
}
......@@ -354,16 +361,17 @@ std::string MeasurementXmlFactory::MEASUREMENT_SUBFRAMES_TAG = "SubFrames";
 
std::string MeasurementXmlFactory::TIME_DATA_FRAME_TAG = "TimeData";
std::string MeasurementXmlFactory::TIME_DATA_FRAME_DURATION_TAG = "Duration";
std::string MeasurementXmlFactory::TIME_DATA_FRAME_REAL_DURATION_TAG = "RealDuration";
std::string MeasurementXmlFactory::TIME_DATA_FRAME_IN_FRAME_DURATION_TAG = "InFrameDuration";
 
std::string MeasurementXmlFactory::MEMORY_DATA_FRAME_TAG = "MemoryData";
std::string MeasurementXmlFactory::MEMORY_DATA_FRAME_START_HEAP_USAGE_TAG = "StartHeapUsage";
std::string MeasurementXmlFactory::MEMORY_DATA_FRAME_END_HEAP_USAGE_TAG = "EndHeapUsage";
std::string MeasurementXmlFactory::MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG = "HighWatermark";
std::string MeasurementXmlFactory::MEMORY_DATA_FRAME_IN_FRAME_HIGH_WATERMARK_TAG = "InFrameHighWatermark";
 
std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_TAG = "CounterData";
std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_COUNTERS_TAG = "Counters";
std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_REAL_COUNTERS_TAG = "RealCounters";
std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_IN_FRAME_COUNTERS_TAG = "InFrameCounters";
std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_COUNTER_TAG = "Counter";
std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_COUNTER_NAME_TAG = "Name";
std::string MeasurementXmlFactory::COUNTER_DATA_FRAME_COUNTER_VALUE_TAG = "Value";
......
......@@ -24,18 +24,19 @@ class MeasurementXmlFactory {
// TimeDataFrame
static std::string TIME_DATA_FRAME_TAG;
static std::string TIME_DATA_FRAME_DURATION_TAG;
static std::string TIME_DATA_FRAME_REAL_DURATION_TAG;
static std::string TIME_DATA_FRAME_IN_FRAME_DURATION_TAG;
 
// MemoryDataFrame
static std::string MEMORY_DATA_FRAME_TAG;
static std::string MEMORY_DATA_FRAME_START_HEAP_USAGE_TAG;
static std::string MEMORY_DATA_FRAME_END_HEAP_USAGE_TAG;
static std::string MEMORY_DATA_FRAME_HIGH_WATERMARK_TAG;
static std::string MEMORY_DATA_FRAME_IN_FRAME_HIGH_WATERMARK_TAG;
 
// CounterDataFrame
static std::string COUNTER_DATA_FRAME_TAG;
static std::string COUNTER_DATA_FRAME_COUNTERS_TAG;
static std::string COUNTER_DATA_FRAME_REAL_COUNTERS_TAG;
static std::string COUNTER_DATA_FRAME_IN_FRAME_COUNTERS_TAG;
static std::string COUNTER_DATA_FRAME_COUNTER_TAG;
static std::string COUNTER_DATA_FRAME_COUNTER_NAME_TAG;
static std::string COUNTER_DATA_FRAME_COUNTER_VALUE_TAG;
......
......@@ -18,6 +18,7 @@ void CounterDataFrame::update ( unsigned, measurements::stealth_vector < Measure
}
 
void CounterDataFrame::hint ( unsigned frame_idx, measurements::stealth_vector < MeasurementFrame > & frames, CounterHint hint ) {
if ( frames[frame_idx].type == measurements::Type::ROOT ) return;
 
CounterHint::value_type delta = 0;
 
......@@ -31,7 +32,7 @@ void CounterDataFrame::hint ( unsigned frame_idx, measurements::stealth_vector <
break;
}
 
frames[frame_idx].counter.real_counters[hint.name] += delta;
frames[frame_idx].counter.in_frame_counters[hint.name] += delta;
 
unsigned cur_idx = frame_idx;
 
......@@ -48,20 +49,20 @@ void CounterDataFrame::hint ( unsigned frame_idx, measurements::stealth_vector <
 
std::ostream & operator <<( std::ostream & os, const CounterDataFrame & cdf ) {
 
os << "(";
os << "cnts: (";
 
for ( auto it = cdf.counters.begin ( ); it != cdf.counters.end ( ); ++it ) {
os << it->first << " : " << it->second;
if ( it != cdf.counters.begin ( ) ) os << ", ";
 
if ( it != cdf.counters.end ( ) ) os << ", ";
os << it->first << " : " << it->second;
}
 
os << "), (";
os << "), if_cnts: (";
 
for ( auto it = cdf.real_counters.begin ( ); it != cdf.real_counters.end ( ); ++it ) {
os << it->first << " : " << it->second;
for ( auto it = cdf.in_frame_counters.begin ( ); it != cdf.in_frame_counters.end ( ); ++it ) {
if ( it != cdf.in_frame_counters.begin ( ) ) os << ", ";
 
if ( it != cdf.real_counters.end ( ) ) os << ", ";
os << it->first << " : " << it->second;
}
 
os << ")";
......
......@@ -28,7 +28,7 @@ struct CounterHint {
 
struct CounterDataFrame {
measurements::stealth_map < measurements::stealth_string, CounterHint::value_type > counters;
measurements::stealth_map < measurements::stealth_string, CounterHint::value_type > real_counters;
measurements::stealth_map < measurements::stealth_string, CounterHint::value_type > in_frame_counters;
 
static void init ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
static void update ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
......
......@@ -10,11 +10,20 @@ void MemoryDataFrame::init ( unsigned frame_idx, measurements::stealth_vector <
MeasurementFrame & current_frame = frames[frame_idx];
MeasurementFrame & parent_frame = frames[current_frame.parent_idx];
 
if ( parent_frame.type != measurements::Type::ROOT ) {
current_frame.memory.start_heap_usage = parent_frame.memory.current_heap_usage;
current_frame.memory.current_heap_usage = parent_frame.memory.current_heap_usage;
current_frame.memory.high_watermark = parent_frame.memory.current_heap_usage;
// "hacky" adjustment, if this is the first user inserted frame, we reset ROOTs values to 0
// beacause we want the heap usage to start at 0 and also we want to be able to propagate ROOTs values between separate
// user OVERALL frames
if ( ( parent_frame.type == measurements::Type::ROOT ) && ( frames.size ( ) == 2 ) ) {
parent_frame.memory.start_heap_usage = 0;
parent_frame.memory.current_heap_usage = 0;
parent_frame.memory.high_watermark = 0;
parent_frame.memory.in_frame_high_watermark = 0;
}
current_frame.memory.start_heap_usage = parent_frame.memory.current_heap_usage;
current_frame.memory.current_heap_usage = parent_frame.memory.current_heap_usage;
current_frame.memory.high_watermark = parent_frame.memory.current_heap_usage;
current_frame.memory.in_frame_high_watermark = parent_frame.memory.current_heap_usage;
}
 
void MemoryDataFrame::update ( unsigned frame_idx, measurements::stealth_vector < MeasurementFrame > & frames ) {
......@@ -24,11 +33,16 @@ void MemoryDataFrame::update ( unsigned frame_idx, measurements::stealth_vector
current_frame.memory.end_heap_usage = current_frame.memory.current_heap_usage;
 
// if we end up with more memory from children, adjust watermark
if ( current_frame.memory.current_heap_usage > current_frame.memory.high_watermark )
current_frame.memory.high_watermark = current_frame.memory.current_heap_usage;
if ( current_frame.memory.current_heap_usage > current_frame.memory.in_frame_high_watermark )
current_frame.memory.in_frame_high_watermark = current_frame.memory.current_heap_usage;
if ( parent_frame.memory.high_watermark < current_frame.memory.in_frame_high_watermark )
parent_frame.memory.high_watermark = current_frame.memory.in_frame_high_watermark;
if ( current_frame.memory.high_watermark < current_frame.memory.in_frame_high_watermark )
current_frame.memory.high_watermark = current_frame.memory.in_frame_high_watermark;
 
if ( parent_frame.type != measurements::Type::ROOT )
parent_frame.memory.current_heap_usage = current_frame.memory.current_heap_usage;
parent_frame.memory.current_heap_usage = current_frame.memory.current_heap_usage;
}
 
void MemoryDataFrame::hint ( unsigned frame_idx, measurements::stealth_vector < MeasurementFrame > & frames, MemoryHint hint ) {
......@@ -39,8 +53,8 @@ void MemoryDataFrame::hint ( unsigned frame_idx, measurements::stealth_vector <
case MemoryHint::Type::NEW:
current_frame.memory.current_heap_usage += hint.size;
 
if ( current_frame.memory.current_heap_usage > current_frame.memory.high_watermark )
current_frame.memory.high_watermark = current_frame.memory.current_heap_usage;
if ( current_frame.memory.current_heap_usage > current_frame.memory.in_frame_high_watermark )
current_frame.memory.in_frame_high_watermark = current_frame.memory.current_heap_usage;
 
break;
 
......@@ -51,7 +65,7 @@ void MemoryDataFrame::hint ( unsigned frame_idx, measurements::stealth_vector <
}
 
std::ostream & operator <<( std::ostream & os, const MemoryDataFrame & mdf ) {
os << mdf.start_heap_usage << "shu, " << mdf.end_heap_usage << "ehu, " << mdf.high_watermark << "hw";
os << mdf.start_heap_usage << "B shu, " << mdf.end_heap_usage << "B ehu, " << mdf.high_watermark << "B hw, " << mdf.in_frame_high_watermark << "B if_hw";
return os;
}
 
......
......@@ -30,7 +30,9 @@ struct MemoryDataFrame {
 
value_type start_heap_usage;
value_type end_heap_usage;
value_type high_watermark;
value_type in_frame_high_watermark;
 
value_type current_heap_usage;
 
......
......@@ -19,15 +19,15 @@ void TimeDataFrame::update ( unsigned frame_idx, measurements::stealth_vector <
MeasurementFrame & current_frame = frames[frame_idx];
 
current_frame.time.duration = duration_cast < microseconds > ( high_resolution_clock::now ( ) - current_frame.time.start );
current_frame.time.real_duration += current_frame.time.duration;
current_frame.time.in_frame_duration += current_frame.time.duration;
 
MeasurementFrame & parent_frame = frames[current_frame.parent_idx];
 
parent_frame.time.real_duration -= current_frame.time.duration;
parent_frame.time.in_frame_duration -= current_frame.time.duration;
}
 
std::ostream & operator <<( std::ostream & os, const TimeDataFrame & tdf ) {
os << tdf.duration << ", " << tdf.real_duration;
os << tdf.duration << " dur, " << tdf.in_frame_duration << " if_dur";
return os;
}
 
......
......@@ -20,7 +20,7 @@ struct TimeDataFrame {
std::chrono::time_point < std::chrono::high_resolution_clock > start;
 
value_type duration;
value_type real_duration;
value_type in_frame_duration;
 
static void init ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
static void update ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
......
......@@ -85,6 +85,13 @@ void MeasurementsTest::testMemoryMeasurements ( ) {
delete[] bar;
measurements::end ( );
 
measurements::start ( "chunk3", measurements::Type::MAIN );
measurements::start ( "chunk31", measurements::Type::MAIN );
bar = new int[1000];
delete[] bar;
measurements::end ( );
measurements::end ( );
std::cout << measurements::MeasurementFormat::LIST << measurements::results ( ) << std::endl;
std::cout << measurements::MeasurementFormat::TREE << measurements::results ( ) << std::endl;
std::cout << measurements::MeasurementFormat::XML << measurements::results ( ) << std::endl;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment