diff --git a/alib2algo/src/measurements/Measurements.cpp b/alib2algo/src/measurements/Measurements.cpp index 43f776a541cfa6dc44b347d6481c2ae5d3635913..29bb56e0d98a9ccb08b45a90d2190d39815c23a0 100644 --- a/alib2algo/src/measurements/Measurements.cpp +++ b/alib2algo/src/measurements/Measurements.cpp @@ -5,6 +5,7 @@ #include "MeasurementTypes.hpp" #include "Measurements.hpp" #include "TimeMeasurementEngine.hpp" +#include "MemoryMeasurementEngine.hpp" namespace measurements { @@ -15,6 +16,7 @@ Measurements Measurements::INSTANCE; */ Measurements::Measurements ( ) { measurement_engines.emplace_back ( measurements::make_unique < TimeMeasurementEngine > ( ) ); + measurement_engines.emplace_back ( measurements::make_unique < MemoryMeasurementEngine > ( ) ); } /** diff --git a/alib2algo/src/measurements/MemoryMeasurementEngine.cpp b/alib2algo/src/measurements/MemoryMeasurementEngine.cpp new file mode 100644 index 0000000000000000000000000000000000000000..eca8859da8e1fe5774d653bc9c699e89c4f669db --- /dev/null +++ b/alib2algo/src/measurements/MemoryMeasurementEngine.cpp @@ -0,0 +1,58 @@ +/* + * 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 new file mode 100644 index 0000000000000000000000000000000000000000..7522db82aa8c6ec598df790084433e4342025e2d --- /dev/null +++ b/alib2algo/src/measurements/MemoryMeasurementEngine.hpp @@ -0,0 +1,42 @@ +/* + * 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_ */