diff --git a/alib2measure/src/measurements/CounterDataFrame.cpp b/alib2measure/src/measurements/CounterDataFrame.cpp new file mode 100644 index 0000000000000000000000000000000000000000..4a07c9f85ac5309190ffb9de63831731cd9bb47e --- /dev/null +++ b/alib2measure/src/measurements/CounterDataFrame.cpp @@ -0,0 +1,112 @@ +/* + * Author: Radovan Cerveny + */ + +#include "MeasurementFrames.hpp" + +namespace measurements { + +void CounterDataFrame::init ( unsigned frame_idx, measurements::stealth_vector < MeasurementFrame > & frames ) { + MeasurementFrame & current_frame = frames[frame_idx]; + MeasurementFrame & parent_frame = frames[current_frame.parent_idx]; + + if ( parent_frame.type != measurements::Type::ROOT ) + current_frame.counter.counters = parent_frame.counter.counters; +} + +void CounterDataFrame::update ( unsigned frame_idx, measurements::stealth_vector < MeasurementFrame > & frames ) { + MeasurementFrame & current_frame = frames[frame_idx]; + MeasurementFrame & parent_frame = frames[current_frame.parent_idx]; +} + +void CounterDataFrame::hint ( unsigned frame_idx, measurements::stealth_vector < MeasurementFrame > & frames, CounterHint hint ) { + + CounterHint::value_type delta; + + switch ( hint.type ) { + case CounterHint::Type::ADD: + delta = hint.value; + break; + + case CounterHint::Type::INC: + delta = 1; + break; + + case CounterHint::Type::SUB: + delta = -hint.value; + break; + + case CounterHint::Type::DEC: + delta = -1; + break; + } + + frames[frame_idx].counter.real_counters[hint.name] += delta; + + unsigned cur_idx = frame_idx; + + for ( ; ; ) { + MeasurementFrame & current_frame = frames[cur_idx]; + + if ( current_frame.type == measurements::Type::ROOT ) break; + + current_frame.counter.counters[hint.name] += delta; + + cur_idx = current_frame.parent_idx; + } +} + +void CounterDataFrame::xml_tokens ( std::deque < sax::Token > & tokens, unsigned idx, const measurements::stealth_vector < MeasurementFrame > & frames ) { + const CounterDataFrame & cdf = frames[idx].counter; + + tokens.emplace_back ( "CounterData", sax::Token::TokenType::START_ELEMENT ); + + tokens.emplace_back ( "Counters", sax::Token::TokenType::START_ELEMENT ); + for ( const auto & elem : cdf.counters) { + tokens.emplace_back ( "Counter", sax::Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( "Name", sax::Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( measurements::to_string ( elem.first ), sax::Token::TokenType::CHARACTER ); + tokens.emplace_back ( "Name", sax::Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( "Value", sax::Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( std::to_string ( elem.second ), sax::Token::TokenType::CHARACTER ); + tokens.emplace_back ( "Value", sax::Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( "Counter", sax::Token::TokenType::END_ELEMENT ); + } + tokens.emplace_back ( "Counters", sax::Token::TokenType::END_ELEMENT ); + + tokens.emplace_back ( "RealCounters", sax::Token::TokenType::START_ELEMENT ); + for ( const auto & elem : cdf.real_counters) { + tokens.emplace_back ( "Counter", sax::Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( "Name", sax::Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( measurements::to_string ( elem.first ), sax::Token::TokenType::CHARACTER ); + tokens.emplace_back ( "Name", sax::Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( "Value", sax::Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( std::to_string ( elem.second ), sax::Token::TokenType::CHARACTER ); + tokens.emplace_back ( "Value", sax::Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( "Counter", sax::Token::TokenType::END_ELEMENT ); + } + tokens.emplace_back ( "RealCounters", sax::Token::TokenType::END_ELEMENT ); + + tokens.emplace_back ( "CounterData", sax::Token::TokenType::END_ELEMENT ); +} + +std::ostream & operator <<( std::ostream & os, const CounterDataFrame & cdf ) { + + os << "("; + for ( auto it = cdf.counters.begin ( ); it != cdf.counters.end ( ); ++it ) { + os << it->first << " : " << it->second; + + if ( it != cdf.counters.end ( ) ) os << ", "; + } + os << "), ("; + for ( auto it = cdf.real_counters.begin ( ); it != cdf.real_counters.end ( ); ++it ) { + os << it->first << " : " << it->second; + + if ( it != cdf.real_counters.end ( ) ) os << ", "; + } + os << ")"; + + return os; +} + +} diff --git a/alib2measure/src/measurements/MeasurementEngine.cpp b/alib2measure/src/measurements/MeasurementEngine.cpp index 91ad5d18fbc0f8a5d224c772051a653f98f8d960..c340917d551bd64e6a193a6f07aa47e2119d9373 100644 --- a/alib2measure/src/measurements/MeasurementEngine.cpp +++ b/alib2measure/src/measurements/MeasurementEngine.cpp @@ -25,6 +25,7 @@ void MeasurementEngine::push_measurement_frame ( measurements::stealth_string fr TimeDataFrame::init ( current_idx, frames ); MemoryDataFrame::init ( current_idx, frames ); + CounterDataFrame::init ( current_idx, frames ); } void MeasurementEngine::pop_measurement_frame ( ) { @@ -34,6 +35,7 @@ void MeasurementEngine::pop_measurement_frame ( ) { TimeDataFrame::update ( current_idx, frames ); MemoryDataFrame::update ( current_idx, frames ); + CounterDataFrame::update ( current_idx, frames ); } void MeasurementEngine::reset_measurements ( ) { @@ -55,4 +57,11 @@ void MeasurementEngine::hint ( MemoryHint mh ) { MemoryDataFrame::hint ( frame_idx_stack.back ( ), frames, std::move ( mh ) ); } +template < > +void MeasurementEngine::hint ( CounterHint ch ) { + if ( ( frame_idx_stack.size ( ) == 0 ) || ( frames[frame_idx_stack.back ( )].type == measurements::Type::ROOT ) ) return; + + CounterDataFrame::hint ( frame_idx_stack.back ( ), frames, std::move ( ch ) ); +} + } diff --git a/alib2measure/src/measurements/MeasurementFrame.cpp b/alib2measure/src/measurements/MeasurementFrame.cpp index 042ed6b06ee58a7a3aea3010165ed20d143f5535..31198ad79b76c16bd25546c602337fc007cf7ead 100644 --- a/alib2measure/src/measurements/MeasurementFrame.cpp +++ b/alib2measure/src/measurements/MeasurementFrame.cpp @@ -24,6 +24,7 @@ void MeasurementFrame::xml_tokens ( std::deque < sax::Token > & tokens, unsigned if ( frame.type != measurements::Type::ROOT ) { TimeDataFrame::xml_tokens ( tokens, idx, frames ); MemoryDataFrame::xml_tokens ( tokens, idx, frames ); + CounterDataFrame::xml_tokens ( tokens, idx, frames ); } tokens.emplace_back ( "SubFrames", sax::Token::TokenType::START_ELEMENT ); @@ -40,7 +41,7 @@ std::ostream & operator <<( std::ostream & os, const MeasurementFrame & frame ) std::stringstream ss; - ss << "(TIME: " << frame.time << "), (MEM: " << frame.memory << ")"; + ss << "(TIME: " << frame.time << "), (MEM: " << frame.memory << "), (COUNTER: " << frame.counter << ")"; os << std::make_tuple ( frame.name, frame.type, frame.parent_idx, frame.sub_idxs, ss.str ( ) ); return os; diff --git a/alib2measure/src/measurements/MeasurementFrames.hpp b/alib2measure/src/measurements/MeasurementFrames.hpp index 025121becf3eaa31a36eaabcc3f754e019cd4514..ac1d1a7bec17d7ca5b3238d9b0084dc830938506 100644 --- a/alib2measure/src/measurements/MeasurementFrames.hpp +++ b/alib2measure/src/measurements/MeasurementFrames.hpp @@ -15,6 +15,29 @@ namespace measurements { struct MeasurementFrame; +struct CounterHint { + using value_type = long long int; + enum class Type { + ADD, SUB, INC, DEC + }; + + measurements::stealth_string name; + Type type; + value_type value; +}; + +struct CounterDataFrame { + measurements::stealth_map < measurements::stealth_string, CounterHint::value_type > counters; + measurements::stealth_map < measurements::stealth_string, CounterHint::value_type > real_counters; + + static void init ( unsigned, measurements::stealth_vector < MeasurementFrame > & ); + static void update ( unsigned, measurements::stealth_vector < MeasurementFrame > & ); + static void hint ( unsigned, measurements::stealth_vector < MeasurementFrame > &, CounterHint ); + static void xml_tokens ( std::deque < sax::Token > &, unsigned, const measurements::stealth_vector < MeasurementFrame > & ); +}; + +std::ostream & operator <<( std::ostream &, const CounterDataFrame & ); + struct MemoryHint { enum class Type { NEW, DELETE @@ -60,8 +83,9 @@ struct MeasurementFrame { measurements::stealth_vector < unsigned > sub_idxs; - TimeDataFrame time; - MemoryDataFrame memory; + TimeDataFrame time; + MemoryDataFrame memory; + CounterDataFrame counter; MeasurementFrame ( measurements::stealth_string, measurements::Type, unsigned ); static void xml_tokens ( std::deque < sax::Token > &, unsigned, const measurements::stealth_vector < MeasurementFrame > & ); diff --git a/alib2measure/src/measurements/MeasurementTypes.hpp b/alib2measure/src/measurements/MeasurementTypes.hpp index 86e8b00ce3607b630957df68df10ed88f36384e0..c68ef51c7e2f0e845f9015b412b8856a6f62b8f1 100644 --- a/alib2measure/src/measurements/MeasurementTypes.hpp +++ b/alib2measure/src/measurements/MeasurementTypes.hpp @@ -7,6 +7,7 @@ #include <memory> #include <vector> +#include <map> #include "MeasurementNew.hpp" namespace measurements { @@ -66,6 +67,8 @@ std::ostream & operator <<( std::ostream & os, const stealth_vector < T > & vec return os << "]"; } +template < class Key, class T, class Compare = std::less < Key > > +using stealth_map = std::map < Key, T, Compare, stealth_allocator < std::pair < const Key, T > > >; } #endif /* MEASUREMENT_TYPES_HPP_ */ diff --git a/alib2measure/src/measurements/MemoryDataFrame.cpp b/alib2measure/src/measurements/MemoryDataFrame.cpp index b15685a496995421dc8b198710a1b74542529d00..a30185a0e468b1d973326536c2ef23d98a5b7572 100644 --- a/alib2measure/src/measurements/MemoryDataFrame.cpp +++ b/alib2measure/src/measurements/MemoryDataFrame.cpp @@ -4,8 +4,6 @@ #include "MeasurementFrames.hpp" -using namespace std::chrono; - namespace measurements { void MemoryDataFrame::init ( unsigned frame_idx, measurements::stealth_vector < MeasurementFrame > & frames ) { diff --git a/alib2measure/src/measurements/measurements.cpp b/alib2measure/src/measurements/measurements.cpp index 1f41abdfe7dad43fd2f6b7141e5b5c109554eeb6..51f72f96d370db8e98715c935d23678ce8be6fde 100644 --- a/alib2measure/src/measurements/measurements.cpp +++ b/alib2measure/src/measurements/measurements.cpp @@ -32,4 +32,9 @@ void hint ( MemoryHint hint ) { MeasurementEngine::INSTANCE.hint ( std::move ( hint ) ); } +template < > +void hint ( CounterHint hint ) { + MeasurementEngine::INSTANCE.hint ( std::move ( hint ) ); +} + } diff --git a/alib2measure/test-src/measurements/MeasurementsTest.cpp b/alib2measure/test-src/measurements/MeasurementsTest.cpp index e34b30961bfea2c36df7c018cf3ee36acfabc403..56d4a5a5a2479b7df003b13f34640aca51a7d46b 100644 --- a/alib2measure/test-src/measurements/MeasurementsTest.cpp +++ b/alib2measure/test-src/measurements/MeasurementsTest.cpp @@ -84,3 +84,30 @@ void MeasurementsTest::testMemoryMeasurements ( ) { std::cout << measurements::MeasurementFormat::TREE << measurements::results ( ) << std::endl; std::cout << measurements::MeasurementFormat::XML << measurements::results ( ) << std::endl; } + +void MeasurementsTest::testCounterMeasurements ( ) { + + measurements::start ( "chunk1", measurements::Type::MAIN ); + measurements::hint( measurements::CounterHint { "test1", measurements::CounterHint::Type::ADD, 5 } ); + measurements::hint( measurements::CounterHint { "test2", measurements::CounterHint::Type::INC, 0 } ); + measurements::start ( "chunk11", measurements::Type::MAIN ); + measurements::hint( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0} ); + measurements::start ( "chunk111", measurements::Type::MAIN ); + measurements::hint( measurements::CounterHint { "test1", measurements::CounterHint::Type::DEC, 0 } ); + measurements::hint( measurements::CounterHint { "test2", measurements::CounterHint::Type::SUB, 10 } ); + measurements::hint( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0} ); + measurements::hint( measurements::CounterHint { "test4", measurements::CounterHint::Type::DEC, 0} ); + measurements::end ( ); + measurements::start ( "chunk112", measurements::Type::MAIN ); + measurements::hint( measurements::CounterHint { "test1", measurements::CounterHint::Type::DEC, 0 } ); + measurements::hint( measurements::CounterHint { "test2", measurements::CounterHint::Type::SUB, 10 } ); + measurements::hint( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0} ); + measurements::hint( measurements::CounterHint { "test4", measurements::CounterHint::Type::DEC, 0} ); + measurements::end ( ); + 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; +} \ No newline at end of file diff --git a/alib2measure/test-src/measurements/MeasurementsTest.h b/alib2measure/test-src/measurements/MeasurementsTest.h index a5782b151834c659baea255f5bfe2b0e43d38e04..1e53cd854e6f8509cfcd48bca709c39fa29d7896 100644 --- a/alib2measure/test-src/measurements/MeasurementsTest.h +++ b/alib2measure/test-src/measurements/MeasurementsTest.h @@ -7,6 +7,7 @@ class MeasurementsTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE ( MeasurementsTest ); CPPUNIT_TEST ( testTimeMeasurements ); CPPUNIT_TEST ( testMemoryMeasurements ); + CPPUNIT_TEST ( testCounterMeasurements ); CPPUNIT_TEST_SUITE_END ( ); public: @@ -15,6 +16,7 @@ public: void testTimeMeasurements ( ); void testMemoryMeasurements ( ); + void testCounterMeasurements ( ); }; #endif // MEASUREMENTS_TEST_H_