diff --git a/alib2algo/src/measurements/MeasurementFrame.cpp b/alib2algo/src/measurements/MeasurementFrame.cpp index 974156ecd6939720694200a2c82543085865e459..248034122f81850f19d1e19f3df196768f1a8d12 100644 --- a/alib2algo/src/measurements/MeasurementFrame.cpp +++ b/alib2algo/src/measurements/MeasurementFrame.cpp @@ -10,6 +10,28 @@ namespace measurements { MeasurementFrame::MeasurementFrame ( measurements::stealth_string name, measurements::Type type, unsigned parent_idx ) : name ( std::move ( name ) ), type ( type ), parent_idx ( parent_idx ), time ( ), memory ( ) { } +void MeasurementFrame::to_xml_tokens ( std::deque < sax::Token > & tokens, const measurements::stealth_vector < MeasurementFrame > & frames ) const { + tokens.emplace_back ( "MeasurementFrame", sax::Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( "Name", sax::Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( measurements::to_string ( name ), sax::Token::TokenType::CHARACTER ); + tokens.emplace_back ( "Name", sax::Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( "Type", sax::Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( measurements::to_string ( type ), sax::Token::TokenType::CHARACTER ); + tokens.emplace_back ( "Type", sax::Token::TokenType::END_ELEMENT ); + + time.to_xml_tokens ( tokens ); + memory.to_xml_tokens ( tokens ); + + tokens.emplace_back ( "SubFrames", sax::Token::TokenType::START_ELEMENT ); + + for ( unsigned sub_idx : sub_idxs ) + frames[sub_idx].to_xml_tokens ( tokens, frames ); + + tokens.emplace_back ( "SubFrames", sax::Token::TokenType::END_ELEMENT ); + + tokens.emplace_back ( "MeasurementFrame", sax::Token::TokenType::END_ELEMENT ); +} + std::ostream & operator <<( std::ostream & os, const MeasurementFrame & frame ) { std::stringstream ss; diff --git a/alib2algo/src/measurements/MeasurementFrames.hpp b/alib2algo/src/measurements/MeasurementFrames.hpp index 67fda47f24f653ae1522d7b68f59350e74c718e2..9112432a894f9aff3ec999b0a4bcfde81f2cc108 100644 --- a/alib2algo/src/measurements/MeasurementFrames.hpp +++ b/alib2algo/src/measurements/MeasurementFrames.hpp @@ -7,6 +7,8 @@ #include <chrono> #include <sstream> +#include <deque> +#include "sax/Token.h" #include "MeasurementTypes.hpp" namespace measurements { @@ -29,6 +31,8 @@ struct MemoryDataFrame { size_t current_heap_usage; + void to_xml_tokens ( std::deque < sax::Token > & ) const; + static void init ( unsigned, measurements::stealth_vector < MeasurementFrame > & ); static void update ( unsigned, measurements::stealth_vector < MeasurementFrame > & ); static void hint ( unsigned, measurements::stealth_vector < MeasurementFrame > &, MemoryHint ); @@ -42,6 +46,8 @@ struct TimeDataFrame { std::chrono::microseconds duration; std::chrono::microseconds real_duration; + void to_xml_tokens ( std::deque < sax::Token > & ) const; + static void init ( unsigned, measurements::stealth_vector < MeasurementFrame > & ); static void update ( unsigned, measurements::stealth_vector < MeasurementFrame > & ); }; @@ -58,6 +64,8 @@ struct MeasurementFrame { TimeDataFrame time; MemoryDataFrame memory; + void to_xml_tokens ( std::deque < sax::Token > &, const measurements::stealth_vector < MeasurementFrame > & ) const; + MeasurementFrame ( measurements::stealth_string, measurements::Type, unsigned ); }; diff --git a/alib2algo/src/measurements/MeasurementResults.cpp b/alib2algo/src/measurements/MeasurementResults.cpp index 622c1991bb62ba9db434871f56fc42962d259894..347538dea7158485212978f94cdf6cc8e405d563 100644 --- a/alib2algo/src/measurements/MeasurementResults.cpp +++ b/alib2algo/src/measurements/MeasurementResults.cpp @@ -8,6 +8,18 @@ namespace measurements { MeasurementResults::MeasurementResults ( const measurements::stealth_vector < MeasurementFrame > & frames ) : frames ( frames ) { } +std::deque < sax::Token > MeasurementResults::to_xml_tokens ( ) const { + std::deque < sax::Token > tokens; + + tokens.emplace_back ( "MeasurementResults", sax::Token::TokenType::START_ELEMENT ); + + for(unsigned sub_idx : frames[0].sub_idxs) { + frames[sub_idx].to_xml_tokens ( tokens, frames ); + } + tokens.emplace_back ( "MeasurementResults", sax::Token::TokenType::END_ELEMENT ); + return tokens; +} + void MeasurementResults::print_as_list ( std::ostream & os ) const { print_as_list ( os, 0 ); } diff --git a/alib2algo/src/measurements/MeasurementResults.hpp b/alib2algo/src/measurements/MeasurementResults.hpp index b8ee8e4fa3d2c2c554555b399e36e63a4d2e6c14..ef38fcc1936d195149d612aa1bf328cc07fb3911 100644 --- a/alib2algo/src/measurements/MeasurementResults.hpp +++ b/alib2algo/src/measurements/MeasurementResults.hpp @@ -6,6 +6,7 @@ #define MEASUREMENT_RESULTS_HPP_ #include <ostream> +#include "sax/SaxComposeInterface.h" #include "MeasurementTypes.hpp" #include "MeasurementFrames.hpp" @@ -19,6 +20,8 @@ struct MeasurementResults { void print_as_list ( std::ostream & ) const; void print_as_tree ( std::ostream & ) const; + std::deque < sax::Token > to_xml_tokens ( ) const; + private: void print_as_list ( std::ostream &, unsigned ) const; void print_as_tree ( std::ostream &, unsigned, std::string &, bool ) const; diff --git a/alib2algo/src/measurements/MeasurementTypes.cpp b/alib2algo/src/measurements/MeasurementTypes.cpp index 152f5909316520d429b57455213951d80fdeaa3f..ed97f8ae78d6876137047e2cf7de892220c53d61 100644 --- a/alib2algo/src/measurements/MeasurementTypes.cpp +++ b/alib2algo/src/measurements/MeasurementTypes.cpp @@ -5,34 +5,41 @@ namespace measurements { -std::ostream & operator <<( std::ostream & os, Type t ) { +std::string to_string ( Type t ) { switch ( t ) { case Type::ROOT: - os << "ROOT"; - break; + return "ROOT"; case Type::OVERALL: - os << "OVERALL"; - break; + return "OVERALL"; case Type::INIT: - os << "INIT"; - break; + return "INIT"; case Type::FINALIZE: - os << "FINALIZE"; - break; + return "FINALIZE"; case Type::MAIN: - os << "MAIN"; - break; + return "MAIN"; case Type::AUXILIARY: - os << "AUXILIARY"; - break; + return "AUXILIARY"; } + return "ERR"; +} + +std::ostream & operator <<( std::ostream & os, Type t ) { + os << to_string ( t ); return os; } +std::string to_string ( const stealth_string & ss ) { + return ss.c_str ( ); +} + +std::string to_string ( stealth_string & ss ) { + return ss.c_str ( ); +} + } diff --git a/alib2algo/src/measurements/MeasurementTypes.hpp b/alib2algo/src/measurements/MeasurementTypes.hpp index 62d1982c6db7fe7917073889d89fc9e2efc11377..6e504d0b05d30a202634206883433600dfbc4a4c 100644 --- a/alib2algo/src/measurements/MeasurementTypes.hpp +++ b/alib2algo/src/measurements/MeasurementTypes.hpp @@ -15,7 +15,8 @@ enum class Type : unsigned { ROOT = 1, OVERALL = 2, INIT = 4, FINALIZE = 8, MAIN = 16, AUXILIARY = 32 }; -std::ostream & operator <<( std::ostream & os, Type t ); +std::string to_string ( Type ); +std::ostream & operator <<( std::ostream &, Type ); template < typename T, typename ... Args > std::unique_ptr < T > make_unique ( Args && ... args ) { @@ -43,6 +44,9 @@ public: using stealth_string = std::basic_string < char, std::char_traits < char >, stealth_allocator < char > >; +std::string to_string ( const stealth_string & ); +std::string to_string ( stealth_string &); + template < typename T > using stealth_vector = std::vector < T, stealth_allocator < T > >; diff --git a/alib2algo/src/measurements/MemoryDataFrame.cpp b/alib2algo/src/measurements/MemoryDataFrame.cpp index 61a0d9e6ad837d939216c1004b35ad43004815cb..5a0659dce2e9b865ccd3cdedac845bcba481f921 100644 --- a/alib2algo/src/measurements/MemoryDataFrame.cpp +++ b/alib2algo/src/measurements/MemoryDataFrame.cpp @@ -52,6 +52,20 @@ void MemoryDataFrame::hint ( unsigned frame_idx, measurements::stealth_vector < } } +void MemoryDataFrame::to_xml_tokens ( std::deque < sax::Token > & tokens ) const { + tokens.emplace_back ( "MemoryData", sax::Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( "StartHeapUsage", sax::Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( std::to_string ( start_heap_usage ), sax::Token::TokenType::CHARACTER ); + tokens.emplace_back ( "StartHeapUsage", sax::Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( "EndHeapUsage", sax::Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( std::to_string ( end_heap_usage ), sax::Token::TokenType::CHARACTER ); + tokens.emplace_back ( "EndHeapUsage", sax::Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( "HighWatermark", sax::Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( std::to_string ( high_watermark ), sax::Token::TokenType::CHARACTER ); + tokens.emplace_back ( "HighWatermark", sax::Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( "MemoryData", sax::Token::TokenType::END_ELEMENT ); +} + std::ostream & operator <<( std::ostream & os, const MemoryDataFrame & mdf ) { os << mdf.start_heap_usage << "shu, " << mdf.end_heap_usage << "ehu, " << mdf.high_watermark << "hw"; return os; diff --git a/alib2algo/src/measurements/TimeDataFrame.cpp b/alib2algo/src/measurements/TimeDataFrame.cpp index 47a0ee3f996a4cc4fbc8370c1e1555b857fab026..cc448d34ef335c1ef5d9d9c1585d8e26a14aaa52 100644 --- a/alib2algo/src/measurements/TimeDataFrame.cpp +++ b/alib2algo/src/measurements/TimeDataFrame.cpp @@ -26,6 +26,17 @@ void TimeDataFrame::update ( unsigned frame_idx, measurements::stealth_vector < parent_frame.time.real_duration -= current_frame.time.duration; } +void TimeDataFrame::to_xml_tokens ( std::deque < sax::Token > & tokens ) const { + tokens.emplace_back ( "TimeData", sax::Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( "Duration", sax::Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( std::to_string ( duration.count ( ) ), sax::Token::TokenType::CHARACTER ); + tokens.emplace_back ( "Duration", sax::Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( "RealDuration", sax::Token::TokenType::START_ELEMENT ); + tokens.emplace_back ( std::to_string ( real_duration.count ( ) ), sax::Token::TokenType::CHARACTER ); + tokens.emplace_back ( "RealDuration", sax::Token::TokenType::END_ELEMENT ); + tokens.emplace_back ( "TimeData", sax::Token::TokenType::END_ELEMENT ); +} + std::ostream & operator <<( std::ostream & os, const TimeDataFrame & tdf ) { os << tdf.duration << ", " << tdf.real_duration; return os; diff --git a/alib2algo/test-src/measurements/MeasurementsTest.cpp b/alib2algo/test-src/measurements/MeasurementsTest.cpp index ee76275e98969362183c1f079756bdcdd989fbd6..b9e805c9a061607d80e0c135b84da1709f929575 100644 --- a/alib2algo/test-src/measurements/MeasurementsTest.cpp +++ b/alib2algo/test-src/measurements/MeasurementsTest.cpp @@ -1,5 +1,6 @@ #include "MeasurementsTest.h" #include "measurements/measurements.hpp" +#include "sax/SaxComposeInterface.h" #include <thread> #include <cmath> @@ -15,67 +16,71 @@ void MeasurementsTest::tearDown ( ) { void MeasurementsTest::testTimeMeasurements ( ) { measurements::start ( "global", measurements::Type::OVERALL ); - measurements::start ( "init", measurements::Type::INIT ); - std::this_thread::sleep_for ( std::chrono::milliseconds ( 100 ) ); - measurements::end ( ); - measurements::start ( "main", measurements::Type::MAIN ); - std::this_thread::sleep_for ( std::chrono::milliseconds ( 20 ) ); - measurements::start ( "aux", measurements::Type::AUXILIARY ); - std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) ); - measurements::end ( ); - std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) ); - measurements::start ( "aux", measurements::Type::AUXILIARY ); - std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) ); - measurements::end ( ); - std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) ); - measurements::end ( ); - measurements::start ( "fin", measurements::Type::FINALIZE ); - std::this_thread::sleep_for ( std::chrono::milliseconds ( 30 ) ); - measurements::start ( "aux", measurements::Type::AUXILIARY ); - std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) ); - measurements::end ( ); - std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) ); - measurements::end ( ); + measurements::start ( "init", measurements::Type::INIT ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 100 ) ); + measurements::end ( ); + measurements::start ( "main", measurements::Type::MAIN ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 20 ) ); + measurements::start ( "aux", measurements::Type::AUXILIARY ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) ); + measurements::end ( ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) ); + measurements::start ( "aux", measurements::Type::AUXILIARY ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) ); + measurements::end ( ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) ); + measurements::end ( ); + measurements::start ( "fin", measurements::Type::FINALIZE ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 30 ) ); + measurements::start ( "aux", measurements::Type::AUXILIARY ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) ); + measurements::end ( ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) ); + measurements::end ( ); measurements::end ( ); measurements::start ( "global2", measurements::Type::OVERALL ); std::this_thread::sleep_for ( std::chrono::milliseconds ( 100 ) ); measurements::end ( ); measurements::start ( "global3", measurements::Type::OVERALL ); - measurements::start ( "init", measurements::Type::INIT ); - std::this_thread::sleep_for ( std::chrono::milliseconds ( 100 ) ); - measurements::end ( ); - measurements::start ( "main", measurements::Type::MAIN ); - std::this_thread::sleep_for ( std::chrono::milliseconds ( 20 ) ); - measurements::start ( "aux", measurements::Type::AUXILIARY ); - std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) ); - measurements::end ( ); - std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) ); - measurements::start ( "aux", measurements::Type::AUXILIARY ); - std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) ); - measurements::end ( ); - std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) ); - measurements::end ( ); + measurements::start ( "init", measurements::Type::INIT ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 100 ) ); + measurements::end ( ); + measurements::start ( "main", measurements::Type::MAIN ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 20 ) ); + measurements::start ( "aux", measurements::Type::AUXILIARY ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) ); measurements::end ( ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) ); + measurements::start ( "aux", measurements::Type::AUXILIARY ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) ); + measurements::end ( ); + std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) ); + measurements::end ( ); + measurements::end ( ); + + std::cout << measurements::results ( ) << std::endl; - std::cout << measurements::results() << std::endl; + sax::SaxComposeInterface::printStdout ( measurements::results ( ).to_xml_tokens ( ) ); } void MeasurementsTest::testMemoryMeasurements ( ) { measurements::start ( "chunk1", measurements::Type::MAIN ); int * baz = new int[500]; + delete[] baz; measurements::end ( ); measurements::start ( "chunk2", measurements::Type::MAIN ); - int * foo = new int[1000]; - measurements::start ( "chunk21", measurements::Type::MAIN ); - int * bar = new int[2000]; - measurements::end ( ); - delete[] foo; - delete[] bar; + int * foo = new int[1000]; + measurements::start ( "chunk21", measurements::Type::MAIN ); + int * bar = new int[2000]; + measurements::end ( ); + delete[] foo; + delete[] bar; measurements::end ( ); - std::cout << measurements::results() << std::endl; -} + std::cout << measurements::results ( ) << std::endl; + sax::SaxComposeInterface::printStdout ( measurements::results ( ).to_xml_tokens ( ) ); +}