From 900895adad518529794609bc357234050e6e2658 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Radovan=20=C4=8Cerven=C3=BD?= <radovan.cerveny@gmail.com> Date: Mon, 1 Feb 2016 01:24:10 +0100 Subject: [PATCH] started from scratch, new usable design for now --- .../src/measurements/MeasurementEngine.cpp | 61 +++++++++++++++++++ .../src/measurements/MeasurementEngine.hpp | 21 +++++-- .../src/measurements/MeasurementFrame.hpp | 53 ++++++++++++++++ .../src/measurements/MeasurementTypes.hpp | 2 +- alib2algo/src/measurements/Measurements.cpp | 44 ------------- alib2algo/src/measurements/Measurements.hpp | 33 ---------- .../src/measurements/MemoryDataFrame.cpp | 29 +++++++++ .../measurements/MemoryMeasurementEngine.cpp | 58 ------------------ .../measurements/MemoryMeasurementEngine.hpp | 42 ------------- alib2algo/src/measurements/TimeDataFrame.cpp | 36 +++++++++++ .../measurements/TimeMeasurementEngine.cpp | 59 ------------------ .../measurements/TimeMeasurementEngine.hpp | 44 ------------- alib2algo/src/measurements/measurements.hpp | 26 ++++++++ .../measurements/MeasurementsTest.cpp | 33 +++++----- 14 files changed, 238 insertions(+), 303 deletions(-) create mode 100644 alib2algo/src/measurements/MeasurementEngine.cpp create mode 100644 alib2algo/src/measurements/MeasurementFrame.hpp delete mode 100644 alib2algo/src/measurements/Measurements.cpp delete mode 100644 alib2algo/src/measurements/Measurements.hpp create mode 100644 alib2algo/src/measurements/MemoryDataFrame.cpp delete mode 100644 alib2algo/src/measurements/MemoryMeasurementEngine.cpp delete mode 100644 alib2algo/src/measurements/MemoryMeasurementEngine.hpp create mode 100644 alib2algo/src/measurements/TimeDataFrame.cpp delete mode 100644 alib2algo/src/measurements/TimeMeasurementEngine.cpp delete mode 100644 alib2algo/src/measurements/TimeMeasurementEngine.hpp create mode 100644 alib2algo/src/measurements/measurements.hpp diff --git a/alib2algo/src/measurements/MeasurementEngine.cpp b/alib2algo/src/measurements/MeasurementEngine.cpp new file mode 100644 index 0000000000..8b837ab78c --- /dev/null +++ b/alib2algo/src/measurements/MeasurementEngine.cpp @@ -0,0 +1,61 @@ +/* + * Author: Radovan Cerveny + */ + +#include <iostream> +#include "MeasurementEngine.hpp" + +namespace measurements { + +MeasurementEngine MeasurementEngine::INSTANCE; + +MeasurementEngine::MeasurementEngine ( ) { + frames.emplace_back ( std::move ( "Root" ), measurements::Type::ROOT, 0 ); + frame_idx_stack.push_back ( 0 ); +} + +void MeasurementEngine::push_measurement_frame ( std::string frame_name, measurements::Type frame_type ) { + unsigned parent_idx = frame_idx_stack.back ( ); + + frames.emplace_back ( std::move ( frame_name ), frame_type, parent_idx ); + + unsigned current_idx = frames.size ( ) - 1; + + frames[parent_idx].sub_idxs.push_back ( current_idx ); + frame_idx_stack.push_back ( current_idx ); + + TimeDataFrame::init ( current_idx, frames ); + MemoryDataFrame::init ( current_idx, frames ); +} + +void MeasurementEngine::pop_measurement_frame ( ) { + unsigned current_idx = frame_idx_stack.back ( ); + + frame_idx_stack.pop_back ( ); + + TimeDataFrame::update ( current_idx, frames ); + MemoryDataFrame::update ( current_idx, frames ); +} + +void MeasurementEngine::print_as_list ( std::ostream & os, unsigned idx ) { + MeasurementFrame & frame = frames[idx]; + + if ( frame.type != measurements::Type::ROOT ) { + os << std::make_tuple ( frame.name, frame.type, frame.parent_idx, frame.sub_idxs, frame.time.to_string ( ), frame.memory.to_string ( ) ); + + if ( idx != frames.size ( ) - 1 ) + os << ", "; + } + + for ( unsigned sub_idx : frame.sub_idxs ) + print_as_list ( os, sub_idx ); +} + +void MeasurementEngine::print_as_list ( std::ostream & os ) { + print_as_list ( os, 0 ); +} + +void MeasurementEngine::print_as_tree ( std::ostream & ) { +} + +} diff --git a/alib2algo/src/measurements/MeasurementEngine.hpp b/alib2algo/src/measurements/MeasurementEngine.hpp index f9b9b815d2..3ba730e679 100644 --- a/alib2algo/src/measurements/MeasurementEngine.hpp +++ b/alib2algo/src/measurements/MeasurementEngine.hpp @@ -7,19 +7,28 @@ #include <ostream> #include "MeasurementTypes.hpp" +#include "MeasurementFrame.hpp" namespace measurements { class MeasurementEngine { + std::vector < unsigned > frame_idx_stack; + std::vector < MeasurementFrame > frames; + + MeasurementEngine ( ); + + void print_as_list ( std::ostream &, unsigned ); + public: - virtual void push_measurement_frame ( std::string, measurements::Type ) = 0; - virtual void pop_measurement_frame ( ) = 0; + void push_measurement_frame ( std::string, measurements::Type ); + void pop_measurement_frame ( ); + + void print_as_list ( std::ostream & ); + void print_as_tree ( std::ostream & ); - virtual void print_as_list ( std::ostream & ) = 0; - virtual void print_as_tree ( std::ostream & ) = 0; - virtual void print_as_xml ( std::ostream & ) = 0; + // void print_as_xml ( std::ostream & ); - virtual ~MeasurementEngine ( ) = default; + static MeasurementEngine INSTANCE; }; } diff --git a/alib2algo/src/measurements/MeasurementFrame.hpp b/alib2algo/src/measurements/MeasurementFrame.hpp new file mode 100644 index 0000000000..20b9e2c21f --- /dev/null +++ b/alib2algo/src/measurements/MeasurementFrame.hpp @@ -0,0 +1,53 @@ +/* + * Author: Radovan Cerveny + */ + +#ifndef MEASUREMENT_FRAME_HPP_ +#define MEASUREMENT_FRAME_HPP_ + +#include <chrono> +#include "MeasurementTypes.hpp" + +namespace measurements { + +struct MeasurementFrame; + +struct TimeDataFrame { + std::chrono::time_point < std::chrono::high_resolution_clock > start; + + std::chrono::microseconds duration; + std::chrono::microseconds real_duration; + + std::string to_string ( ); + // void to_xml ( ); + + static void init ( unsigned, std::vector < MeasurementFrame > & ); + static void update ( unsigned, std::vector < MeasurementFrame > & ); +}; + +struct MemoryDataFrame { + unsigned current_heap_usage; + unsigned high_watermark; + + std::string to_string ( ); + // void to_xml ( ); + + static void init ( unsigned, std::vector < MeasurementFrame > & ); + static void update ( unsigned, std::vector < MeasurementFrame > & ); +}; + +struct MeasurementFrame { + std::string name; + measurements::Type type; + unsigned parent_idx; + std::vector < unsigned > sub_idxs; + + TimeDataFrame time; + MemoryDataFrame memory; + + MeasurementFrame ( std::string && name, measurements::Type type, unsigned parent_idx ) : name ( name ), type ( type ), parent_idx ( parent_idx ) { } +}; + +} + +#endif /* MEASUREMENT_FRAME_HPP_ */ diff --git a/alib2algo/src/measurements/MeasurementTypes.hpp b/alib2algo/src/measurements/MeasurementTypes.hpp index 4b2890eb2b..d47a1d64bc 100644 --- a/alib2algo/src/measurements/MeasurementTypes.hpp +++ b/alib2algo/src/measurements/MeasurementTypes.hpp @@ -10,7 +10,7 @@ namespace measurements { enum Type { - OVERALL = 1, INIT = 2, FINALIZE = 4, MAIN = 8, AUXILIARY = 16 + ROOT = 0, OVERALL = 1, INIT = 2, FINALIZE = 4, MAIN = 8, AUXILIARY = 16 }; template < typename T, typename ... Args > diff --git a/alib2algo/src/measurements/Measurements.cpp b/alib2algo/src/measurements/Measurements.cpp deleted file mode 100644 index 29bb56e0d9..0000000000 --- a/alib2algo/src/measurements/Measurements.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Author: Radovan Cerveny - */ - -#include "MeasurementTypes.hpp" -#include "Measurements.hpp" -#include "TimeMeasurementEngine.hpp" -#include "MemoryMeasurementEngine.hpp" - -namespace measurements { - -Measurements Measurements::INSTANCE; - -/** - * constructs all available measurement engines - */ -Measurements::Measurements ( ) { - measurement_engines.emplace_back ( measurements::make_unique < TimeMeasurementEngine > ( ) ); - measurement_engines.emplace_back ( measurements::make_unique < MemoryMeasurementEngine > ( ) ); -} - -/** - * creates new block on top of the measurements stack - * @param block_name - */ -void Measurements::start ( std::string block_name, measurements::Type type ) { - for ( auto & me : INSTANCE.measurement_engines ) - me->push_measurement_frame ( block_name, type ); -} - -/** - * pops the block from the measurements stack - */ -void Measurements::end ( ) { - for ( auto & me : INSTANCE.measurement_engines ) - me->pop_measurement_frame ( ); -} - -void Measurements::print ( std::ostream & os ) { - for ( auto & me : INSTANCE.measurement_engines ) - me->print_as_list ( os ); -} - -} diff --git a/alib2algo/src/measurements/Measurements.hpp b/alib2algo/src/measurements/Measurements.hpp deleted file mode 100644 index 1542a8b920..0000000000 --- a/alib2algo/src/measurements/Measurements.hpp +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Author: Radovan Cerveny - */ - -#ifndef MEASUREMENTS_HPP_ -#define MEASUREMENTS_HPP_ - -#include <ostream> -#include <string> -#include <vector> -#include "MeasurementTypes.hpp" -#include "MeasurementEngine.hpp" - -namespace measurements { - -class Measurements { -private: - std::vector < std::unique_ptr < MeasurementEngine > > measurement_engines; - - Measurements ( ); - -private: - static Measurements INSTANCE; - -public: - static void start ( std::string, measurements::Type ); - static void end ( ); - static void print ( std::ostream & ); -}; - -} - -#endif /* MEASUREMENTS_HPP_ */ diff --git a/alib2algo/src/measurements/MemoryDataFrame.cpp b/alib2algo/src/measurements/MemoryDataFrame.cpp new file mode 100644 index 0000000000..3c5ba5d8cc --- /dev/null +++ b/alib2algo/src/measurements/MemoryDataFrame.cpp @@ -0,0 +1,29 @@ +/* + * Author: Radovan Cerveny + */ + +#include <sstream> +#include "MeasurementFrame.hpp" + +using namespace std::chrono; + +namespace measurements { + +void MemoryDataFrame::init ( unsigned frame_idx, std::vector < MeasurementFrame > & frames ) { + MeasurementFrame & current_frame = frames[frame_idx]; +} + +void MemoryDataFrame::update ( unsigned frame_idx, std::vector < MeasurementFrame > & frames ) { + MeasurementFrame & current_frame = frames[frame_idx]; + + MeasurementFrame & parent_frame = frames[current_frame.parent_idx]; +} + +std::string MemoryDataFrame::to_string ( ) { + std::stringstream ss; + + ss << "memory"; + return ss.str ( ); +} + +} diff --git a/alib2algo/src/measurements/MemoryMeasurementEngine.cpp b/alib2algo/src/measurements/MemoryMeasurementEngine.cpp deleted file mode 100644 index eca8859da8..0000000000 --- a/alib2algo/src/measurements/MemoryMeasurementEngine.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Author: Radovan Cerveny - */ - -#include <iostream> -#include "MemoryMeasurementEngine.hpp" - -namespace measurements { - -void MemoryMeasurementEngine::push_measurement_frame ( std::string frame_name, measurements::Type frame_type ) { - MemoryMeasurementFrame mmf = { std::move ( frame_name ), frame_type, std::vector < unsigned > ( ), 0, 0 }; - - frames.emplace_back ( std::move ( mmf ) ); -} - -void MemoryMeasurementEngine::pop_measurement_frame ( ) { - MemoryMeasurementFrame current_frame = std::move ( frames.back ( ) ); - - frames.pop_back ( ); - - // current_frame.duration = duration_cast < microseconds > ( high_resolution_clock::now ( ) - current_frame.start ); - // current_frame.real_duration += current_frame.duration; - - unsigned idx = results.size ( ); - - if ( !frames.empty ( ) ) { - MemoryMeasurementFrame & parent_frame = frames.back ( ); - parent_frame.sub_frames.push_back ( idx ); - - // parent_frame.real_duration -= current_frame.duration; - } - - results.emplace_back ( std::move ( current_frame ) ); -} - -void MemoryMeasurementEngine::print_as_list ( std::ostream & os ) { - print_as_list ( os, results.size ( ) - 1 ); - os << std::endl; -} - -void MemoryMeasurementEngine::print_as_list ( std::ostream & os, unsigned idx ) { - MemoryMeasurementFrame & mmf = results[idx]; - - if ( idx != results.size ( ) - 1 ) os << ", "; - - os << std::make_tuple ( idx, mmf.frame_name, ( unsigned ) mmf.frame_type, mmf.current_heap_usage, mmf.high_watermark, mmf.sub_frames ); - - for ( unsigned sub_idx : mmf.sub_frames ) - print_as_list ( os, sub_idx ); -} - -void MemoryMeasurementEngine::print_as_tree ( std::ostream & ) { -} - -void MemoryMeasurementEngine::print_as_xml ( std::ostream & ) { -} - -} diff --git a/alib2algo/src/measurements/MemoryMeasurementEngine.hpp b/alib2algo/src/measurements/MemoryMeasurementEngine.hpp deleted file mode 100644 index 7522db82aa..0000000000 --- a/alib2algo/src/measurements/MemoryMeasurementEngine.hpp +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Author: Radovan Cerveny - */ - -#ifndef MEMORY_MEASUREMENT_ENGINE_HPP_ -#define MEMORY_MEASUREMENT_ENGINE_HPP_ - -#include <string> -#include <vector> -#include <ostream> -#include "MeasurementEngine.hpp" - -namespace measurements { - -struct MemoryMeasurementFrame { - std::string frame_name; - measurements::Type frame_type; - std::vector < unsigned > sub_frames; - - unsigned current_heap_usage; - unsigned high_watermark; -}; - -class MemoryMeasurementEngine : public MeasurementEngine { -private: - std::vector < MemoryMeasurementFrame > frames; - std::vector < MemoryMeasurementFrame > results; - - void print_as_list ( std::ostream &, unsigned ); - -public: - void push_measurement_frame ( std::string, measurements::Type ); - void pop_measurement_frame ( ); - - void print_as_list ( std::ostream & ); - void print_as_tree ( std::ostream & ); - void print_as_xml ( std::ostream & ); -}; - -} - -#endif /* MEMORY_MEASUREMENT_ENGINE_HPP_ */ diff --git a/alib2algo/src/measurements/TimeDataFrame.cpp b/alib2algo/src/measurements/TimeDataFrame.cpp new file mode 100644 index 0000000000..a7e1c438df --- /dev/null +++ b/alib2algo/src/measurements/TimeDataFrame.cpp @@ -0,0 +1,36 @@ +/* + * Author: Radovan Cerveny + */ + +#include <sstream> +#include "MeasurementFrame.hpp" + +using namespace std::chrono; + +namespace measurements { + +void TimeDataFrame::init ( unsigned frame_idx, std::vector < MeasurementFrame > & frames ) { + MeasurementFrame & current_frame = frames[frame_idx]; + + current_frame.time.start = high_resolution_clock::now ( ); +} + +void TimeDataFrame::update ( unsigned frame_idx, std::vector < MeasurementFrame > & frames ) { + 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; + + MeasurementFrame & parent_frame = frames[current_frame.parent_idx]; + + parent_frame.time.real_duration -= current_frame.time.duration; +} + +std::string TimeDataFrame::to_string ( ) { + std::stringstream ss; + + ss << duration << ", " << real_duration; + return ss.str ( ); +} + +} diff --git a/alib2algo/src/measurements/TimeMeasurementEngine.cpp b/alib2algo/src/measurements/TimeMeasurementEngine.cpp deleted file mode 100644 index 126599dfaa..0000000000 --- a/alib2algo/src/measurements/TimeMeasurementEngine.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Author: Radovan Cerveny - */ - -#include <iostream> -#include "TimeMeasurementEngine.hpp" - -using namespace std::chrono; - -namespace measurements { - -void TimeMeasurementEngine::push_measurement_frame ( std::string frame_name, measurements::Type frame_type ) { - TimeMeasurementFrame tmf = { std::move ( frame_name ), frame_type, std::vector < unsigned > ( ), high_resolution_clock::now ( ), microseconds ( 0 ), microseconds ( 0 ) }; - - frames.emplace_back ( std::move ( tmf ) ); -} - -void TimeMeasurementEngine::pop_measurement_frame ( ) { - TimeMeasurementFrame current_frame = std::move ( frames.back ( ) ); - - frames.pop_back ( ); - - current_frame.duration = duration_cast < microseconds > ( high_resolution_clock::now ( ) - current_frame.start ); - current_frame.real_duration += current_frame.duration; - - unsigned idx = results.size ( ); - - if ( !frames.empty ( ) ) { - TimeMeasurementFrame & parent_frame = frames.back ( ); - parent_frame.sub_frames.push_back ( idx ); - parent_frame.real_duration -= current_frame.duration; - } - - results.emplace_back ( std::move ( current_frame ) ); -} - -void TimeMeasurementEngine::print_as_list ( std::ostream & os ) { - print_as_list ( os, results.size ( ) - 1 ); - os << std::endl; -} - -void TimeMeasurementEngine::print_as_list ( std::ostream & os, unsigned idx ) { - TimeMeasurementFrame & tmf = results[idx]; - - if ( idx != results.size ( ) - 1 ) os << ", "; - - os << std::make_tuple ( idx, tmf.frame_name, ( unsigned ) tmf.frame_type, tmf.duration, tmf.real_duration, tmf.sub_frames ); - - for ( unsigned sub_idx : tmf.sub_frames ) - print_as_list ( os, sub_idx ); -} - -void TimeMeasurementEngine::print_as_tree ( std::ostream & ) { -} - -void TimeMeasurementEngine::print_as_xml ( std::ostream & ) { -} - -} diff --git a/alib2algo/src/measurements/TimeMeasurementEngine.hpp b/alib2algo/src/measurements/TimeMeasurementEngine.hpp deleted file mode 100644 index 053568a1fe..0000000000 --- a/alib2algo/src/measurements/TimeMeasurementEngine.hpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Author: Radovan Cerveny - */ - -#ifndef TIME_MEASUREMENT_ENGINE_HPP_ -#define TIME_MEASUREMENT_ENGINE_HPP_ - -#include <string> -#include <chrono> -#include <vector> -#include <ostream> -#include "MeasurementEngine.hpp" - -namespace measurements { - -struct TimeMeasurementFrame { - std::string frame_name; - measurements::Type frame_type; - std::vector < unsigned > sub_frames; - - std::chrono::time_point < std::chrono::high_resolution_clock > start; - std::chrono::microseconds duration; - std::chrono::microseconds real_duration; -}; - -class TimeMeasurementEngine : public MeasurementEngine { -private: - std::vector < TimeMeasurementFrame > frames; - std::vector < TimeMeasurementFrame > results; - - void print_as_list ( std::ostream &, unsigned ); - -public: - void push_measurement_frame ( std::string, measurements::Type ); - void pop_measurement_frame ( ); - - void print_as_list ( std::ostream & ); - void print_as_tree ( std::ostream & ); - void print_as_xml ( std::ostream & ); -}; - -} - -#endif /* TIME_MEASUREMENT_ENGINE_HPP_ */ diff --git a/alib2algo/src/measurements/measurements.hpp b/alib2algo/src/measurements/measurements.hpp new file mode 100644 index 0000000000..f21cdef6cb --- /dev/null +++ b/alib2algo/src/measurements/measurements.hpp @@ -0,0 +1,26 @@ +/* + * Author: Radovan Cerveny + */ + +#ifndef MEASUREMENTS_HPP_ +#define MEASUREMENTS_HPP_ + +#include "MeasurementEngine.hpp" + +namespace measurements { + +void start ( std::string name, measurements::Type type ) { + MeasurementEngine::INSTANCE.push_measurement_frame ( std::move ( name ), type ); +} + +void end ( ) { + MeasurementEngine::INSTANCE.pop_measurement_frame ( ); +} + +void print_as_list ( std::ostream & os ) { + MeasurementEngine::INSTANCE.print_as_list ( os ); +} + +} + +#endif /* MEASUREMENTS_HPP_ */ diff --git a/alib2algo/test-src/measurements/MeasurementsTest.cpp b/alib2algo/test-src/measurements/MeasurementsTest.cpp index b42318da27..253c94cfb5 100644 --- a/alib2algo/test-src/measurements/MeasurementsTest.cpp +++ b/alib2algo/test-src/measurements/MeasurementsTest.cpp @@ -1,5 +1,5 @@ #include "MeasurementsTest.h" -#include "measurements/Measurements.hpp" +#include "measurements/measurements.hpp" #include <thread> #include <cmath> @@ -13,29 +13,30 @@ void MeasurementsTest::tearDown ( ) { } void MeasurementsTest::testMeasurements ( ) { - measurements::Measurements::start ( "global", measurements::Type::OVERALL ); - measurements::Measurements::start ( "init", measurements::Type::INIT ); + measurements::start ( "global", measurements::Type::OVERALL ); + measurements::start ( "init", measurements::Type::INIT ); std::this_thread::sleep_for ( std::chrono::milliseconds ( 100 ) ); - measurements::Measurements::end ( ); - measurements::Measurements::start ( "main", measurements::Type::MAIN ); + measurements::end ( ); + measurements::start ( "main", measurements::Type::MAIN ); std::this_thread::sleep_for ( std::chrono::milliseconds ( 20 ) ); - measurements::Measurements::start ( "aux", measurements::Type::AUXILIARY ); + measurements::start ( "aux", measurements::Type::AUXILIARY ); std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) ); - measurements::Measurements::end ( ); + measurements::end ( ); std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) ); - measurements::Measurements::start ( "aux", measurements::Type::AUXILIARY ); + measurements::start ( "aux", measurements::Type::AUXILIARY ); std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) ); - measurements::Measurements::end ( ); + measurements::end ( ); std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) ); - measurements::Measurements::end ( ); - measurements::Measurements::start ( "fin", measurements::Type::FINALIZE ); + measurements::end ( ); + measurements::start ( "fin", measurements::Type::FINALIZE ); std::this_thread::sleep_for ( std::chrono::milliseconds ( 30 ) ); - measurements::Measurements::start ( "aux", measurements::Type::AUXILIARY ); + measurements::start ( "aux", measurements::Type::AUXILIARY ); std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) ); - measurements::Measurements::end ( ); + measurements::end ( ); std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) ); - measurements::Measurements::end ( ); - measurements::Measurements::end ( ); + measurements::end ( ); + measurements::end ( ); - measurements::Measurements::print ( std::cout ); + measurements::print_as_list ( std::cout ); + std::cout << std::endl; } -- GitLab