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

MeasurementResults can now be parsed from xml

parent df3a0ffe
No related branches found
No related tags found
1 merge request!15BP_cervera3 - automatic measurements, processing
Showing
with 434 additions and 89 deletions
...@@ -13,4 +13,8 @@ std::string to_string ( stealth_string & ss ) { ...@@ -13,4 +13,8 @@ std::string to_string ( stealth_string & ss ) {
return ss.c_str ( ); return ss.c_str ( );
} }
   
stealth_string stealth_string_from_string ( const std::string & str ) {
return stealth_string ( str.c_str ( ) );
}
} }
...@@ -17,12 +17,13 @@ using stealth_string = std::basic_string < char, std::char_traits < char >, stea ...@@ -17,12 +17,13 @@ using stealth_string = std::basic_string < char, std::char_traits < char >, stea
std::string to_string ( const stealth_string & ); std::string to_string ( const stealth_string & );
std::string to_string ( stealth_string & ); std::string to_string ( stealth_string & );
   
stealth_string stealth_string_from_string ( const std::string & );
template < typename T > template < typename T >
using stealth_vector = std::vector < T, stealth_allocator < T > >; using stealth_vector = std::vector < T, stealth_allocator < T > >;
   
template < class Key, class T, class Compare = std::less < Key > > 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 > > >; using stealth_map = std::map < Key, T, Compare, stealth_allocator < std::pair < const Key, T > > >;
} }
   
#endif /* STEALTH_TYPES_HPP_ */ #endif /* STEALTH_TYPES_HPP_ */
...@@ -29,6 +29,16 @@ std::string to_string ( Type t ) { ...@@ -29,6 +29,16 @@ std::string to_string ( Type t ) {
return "ERR"; return "ERR";
} }
   
Type measurement_type_from_string ( const std::string & ts ) {
if ( ts == "ROOT" ) return Type::ROOT;
if ( ts == "OVERALL" ) return Type::OVERALL;
if ( ts == "INIT" ) return Type::INIT;
if ( ts == "FINALIZE" ) return Type::FINALIZE;
if ( ts == "MAIN" ) return Type::MAIN;
if ( ts == "AUXILIARY" ) return Type::AUXILIARY;
return Type::ROOT;
}
std::ostream & operator <<( std::ostream & os, Type t ) { std::ostream & operator <<( std::ostream & os, Type t ) {
os << to_string ( t ); os << to_string ( t );
return os; return os;
......
...@@ -18,6 +18,7 @@ enum class Type : unsigned { ...@@ -18,6 +18,7 @@ enum class Type : unsigned {
}; };
   
std::string to_string ( Type ); std::string to_string ( Type );
Type measurement_type_from_string ( const std::string & );
std::ostream & operator <<( std::ostream &, Type ); std::ostream & operator <<( std::ostream &, Type );
   
} }
......
This diff is collapsed.
...@@ -40,10 +40,21 @@ class MeasurementXmlFactory { ...@@ -40,10 +40,21 @@ class MeasurementXmlFactory {
static std::string COUNTER_DATA_FRAME_COUNTER_NAME_TAG; static std::string COUNTER_DATA_FRAME_COUNTER_NAME_TAG;
static std::string COUNTER_DATA_FRAME_COUNTER_VALUE_TAG; static std::string COUNTER_DATA_FRAME_COUNTER_VALUE_TAG;
   
static void composeMeasurementFrames ( std::deque < sax::Token > &, unsigned, const measurements::stealth_vector < MeasurementFrame > & ); static void composeMeasurementFrames ( std::deque < sax::Token > &, unsigned, const stealth_vector < MeasurementFrame > & );
static void composeTimeDataFrame ( std::deque < sax::Token > &, unsigned, const measurements::stealth_vector < MeasurementFrame > & ); static void composeTimeDataFrame ( std::deque < sax::Token > &, unsigned, const stealth_vector < MeasurementFrame > & );
static void composeMemoryDataFrame ( std::deque < sax::Token > &, unsigned, const measurements::stealth_vector < MeasurementFrame > & ); static void composeMemoryDataFrame ( std::deque < sax::Token > &, unsigned, const stealth_vector < MeasurementFrame > & );
static void composeCounterDataFrame ( std::deque < sax::Token > &, unsigned, const measurements::stealth_vector < MeasurementFrame > & ); static void composeCounterDataFrame ( std::deque < sax::Token > &, unsigned, const stealth_vector < MeasurementFrame > & );
static void parseRootMeasurementFrame ( MeasurementResults &, std::deque < sax::Token >::iterator & );
static void parseSubframes ( unsigned, MeasurementResults &, std::deque < sax::Token >::iterator & );
static void parseMeasurementFrame ( unsigned, MeasurementResults &, std::deque < sax::Token >::iterator & );
static void parseTimeDataFrame ( MeasurementFrame &, std::deque < sax::Token >::iterator & );
static void parseMemoryDataFrame ( MeasurementFrame &, std::deque < sax::Token >::iterator & );
static void parseCounterDataFrame ( MeasurementFrame &, std::deque < sax::Token >::iterator & );
static void parseCounterDataFrameCounters ( const std::string &, stealth_map < stealth_string, CounterHint::value_type > &, std::deque < sax::Token >::iterator & );
template < typename T >
static T valueTypeFromString ( const std::string & );
   
public: public:
static std::deque < sax::Token > composeMeasurementResults ( const MeasurementResults & ); static std::deque < sax::Token > composeMeasurementResults ( const MeasurementResults & );
......
...@@ -16,20 +16,23 @@ struct MemoryDataFrame; ...@@ -16,20 +16,23 @@ struct MemoryDataFrame;
   
struct MemoryHint { struct MemoryHint {
using frame_type = MemoryDataFrame; using frame_type = MemoryDataFrame;
using value_type = size_t;
enum class Type { enum class Type {
NEW, DELETE NEW, DELETE
}; };
   
Type type; Type type;
size_t size; value_type size;
}; };
   
struct MemoryDataFrame { struct MemoryDataFrame {
size_t start_heap_usage; using value_type = size_t;
size_t end_heap_usage;
size_t high_watermark;
   
size_t current_heap_usage; value_type start_heap_usage;
value_type end_heap_usage;
value_type high_watermark;
value_type current_heap_usage;
   
static void init ( unsigned, measurements::stealth_vector < MeasurementFrame > & ); static void init ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
static void update ( unsigned, measurements::stealth_vector < MeasurementFrame > & ); static void update ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
......
...@@ -15,10 +15,12 @@ namespace measurements { ...@@ -15,10 +15,12 @@ namespace measurements {
struct MeasurementFrame; struct MeasurementFrame;
   
struct TimeDataFrame { struct TimeDataFrame {
using value_type = std::chrono::microseconds;
std::chrono::time_point < std::chrono::high_resolution_clock > start; std::chrono::time_point < std::chrono::high_resolution_clock > start;
   
std::chrono::microseconds duration; value_type duration;
std::chrono::microseconds real_duration; value_type real_duration;
   
static void init ( unsigned, measurements::stealth_vector < MeasurementFrame > & ); static void init ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
static void update ( unsigned, measurements::stealth_vector < MeasurementFrame > & ); static void update ( unsigned, measurements::stealth_vector < MeasurementFrame > & );
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#define MEASUREMENTS_HPP_ #define MEASUREMENTS_HPP_
   
#include "MeasurementEngine.hpp" #include "MeasurementEngine.hpp"
#include "MeasurementXmlFactory.hpp"
   
namespace measurements { namespace measurements {
   
......
#include "MeasurementsTest.h" #include "MeasurementsTest.h"
#include "sax/SaxComposeInterface.h" #include "sax/SaxComposeInterface.h"
#include <sstream>
#include <thread> #include <thread>
#include <cmath> #include <cmath>
#include <measure> #include <measure>
...@@ -15,7 +16,6 @@ void MeasurementsTest::tearDown ( ) { ...@@ -15,7 +16,6 @@ void MeasurementsTest::tearDown ( ) {
} }
   
void MeasurementsTest::testConstructMeasurements ( ) { void MeasurementsTest::testConstructMeasurements ( ) {
} }
   
void MeasurementsTest::testTimeMeasurements ( ) { void MeasurementsTest::testTimeMeasurements ( ) {
...@@ -72,11 +72,12 @@ void MeasurementsTest::testMemoryMeasurements ( ) { ...@@ -72,11 +72,12 @@ void MeasurementsTest::testMemoryMeasurements ( ) {
measurements::start ( "chunk1", measurements::Type::MAIN ); measurements::start ( "chunk1", measurements::Type::MAIN );
int * baz = new int[500]; int * baz = new int[500];
   
delete[] baz;
measurements::end ( ); measurements::end ( );
   
measurements::start ( "chunk2", measurements::Type::MAIN ); delete[] baz;
int * foo = new int[1000]; int * foo = new int[1000];
measurements::start ( "chunk2", measurements::Type::MAIN );
measurements::start ( "chunk21", measurements::Type::MAIN ); measurements::start ( "chunk21", measurements::Type::MAIN );
int * bar = new int[2000]; int * bar = new int[2000];
measurements::end ( ); measurements::end ( );
...@@ -92,21 +93,21 @@ void MeasurementsTest::testMemoryMeasurements ( ) { ...@@ -92,21 +93,21 @@ void MeasurementsTest::testMemoryMeasurements ( ) {
void MeasurementsTest::testCounterMeasurements ( ) { void MeasurementsTest::testCounterMeasurements ( ) {
   
measurements::start ( "chunk1", measurements::Type::MAIN ); measurements::start ( "chunk1", measurements::Type::MAIN );
measurements::hint( measurements::CounterHint { "test1", measurements::CounterHint::Type::ADD, 5 } ); measurements::hint ( measurements::CounterHint { "test1", measurements::CounterHint::Type::ADD, 5 } );
measurements::hint( measurements::CounterHint { "test2", measurements::CounterHint::Type::INC, 0 } ); measurements::hint ( measurements::CounterHint { "test2", measurements::CounterHint::Type::INC, 0 } );
measurements::start ( "chunk11", measurements::Type::MAIN ); measurements::start ( "chunk11", measurements::Type::MAIN );
measurements::hint( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0} ); measurements::hint ( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0 } );
measurements::start ( "chunk111", measurements::Type::MAIN ); measurements::start ( "chunk111", measurements::Type::MAIN );
measurements::hint( measurements::CounterHint { "test1", measurements::CounterHint::Type::DEC, 0 } ); measurements::hint ( measurements::CounterHint { "test1", measurements::CounterHint::Type::DEC, 0 } );
measurements::hint( measurements::CounterHint { "test2", measurements::CounterHint::Type::SUB, 10 } ); measurements::hint ( measurements::CounterHint { "test2", measurements::CounterHint::Type::SUB, 10 } );
measurements::hint( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0} ); measurements::hint ( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0 } );
measurements::hint( measurements::CounterHint { "test4", measurements::CounterHint::Type::DEC, 0} ); measurements::hint ( measurements::CounterHint { "test4", measurements::CounterHint::Type::DEC, 0 } );
measurements::end ( ); measurements::end ( );
measurements::start ( "chunk112", measurements::Type::MAIN ); measurements::start ( "chunk112", measurements::Type::MAIN );
measurements::hint( measurements::CounterHint { "test1", measurements::CounterHint::Type::DEC, 0 } ); measurements::hint ( measurements::CounterHint { "test1", measurements::CounterHint::Type::DEC, 0 } );
measurements::hint( measurements::CounterHint { "test2", measurements::CounterHint::Type::SUB, 10 } ); measurements::hint ( measurements::CounterHint { "test2", measurements::CounterHint::Type::SUB, 10 } );
measurements::hint( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0} ); measurements::hint ( measurements::CounterHint { "test3", measurements::CounterHint::Type::DEC, 0 } );
measurements::hint( measurements::CounterHint { "test4", measurements::CounterHint::Type::DEC, 0} ); measurements::hint ( measurements::CounterHint { "test4", measurements::CounterHint::Type::DEC, 0 } );
measurements::end ( ); measurements::end ( );
measurements::end ( ); measurements::end ( );
measurements::end ( ); measurements::end ( );
...@@ -114,4 +115,84 @@ void MeasurementsTest::testCounterMeasurements ( ) { ...@@ -114,4 +115,84 @@ void MeasurementsTest::testCounterMeasurements ( ) {
std::cout << measurements::MeasurementFormat::LIST << measurements::results ( ) << std::endl; std::cout << measurements::MeasurementFormat::LIST << measurements::results ( ) << std::endl;
std::cout << measurements::MeasurementFormat::TREE << measurements::results ( ) << std::endl; std::cout << measurements::MeasurementFormat::TREE << measurements::results ( ) << std::endl;
std::cout << measurements::MeasurementFormat::XML << measurements::results ( ) << std::endl; std::cout << measurements::MeasurementFormat::XML << measurements::results ( ) << std::endl;
} }
\ No newline at end of file
void MeasurementsTest::testMeasurementXmlFactory ( ) {
measurements::start ( "global", measurements::Type::OVERALL );
measurements::start ( "init", measurements::Type::INIT );
std::this_thread::sleep_for ( std::chrono::milliseconds ( 100 ) );
measurements::end ( );
measurements::hint ( measurements::CounterHint { "counter2", measurements::CounterHint::Type::SUB, 5 } );
measurements::start ( "main", measurements::Type::MAIN );
int * foo = new int[1000];
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::hint ( measurements::CounterHint { "counter2", measurements::CounterHint::Type::SUB, 5 } );
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::hint ( measurements::CounterHint { "counter2", measurements::CounterHint::Type::SUB, 5 } );
measurements::start ( "fin", measurements::Type::FINALIZE );
std::this_thread::sleep_for ( std::chrono::milliseconds ( 30 ) );
measurements::start ( "aux", measurements::Type::AUXILIARY );
int * bar = new int[2000];
std::this_thread::sleep_for ( std::chrono::milliseconds ( 40 ) );
measurements::end ( );
std::this_thread::sleep_for ( std::chrono::milliseconds ( 80 ) );
measurements::end ( );
measurements::hint ( measurements::CounterHint { "counter1", measurements::CounterHint::Type::ADD, 1 } );
measurements::end ( );
measurements::start ( "global2", measurements::Type::OVERALL );
std::this_thread::sleep_for ( std::chrono::milliseconds ( 100 ) );
measurements::end ( );
delete[] foo;
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 );
delete[] bar;
std::this_thread::sleep_for ( std::chrono::milliseconds ( 20 ) );
measurements::start ( "aux", measurements::Type::AUXILIARY );
measurements::hint ( measurements::CounterHint { "counter1", measurements::CounterHint::Type::ADD, 1 } );
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 );
measurements::hint ( measurements::CounterHint { "counter1", measurements::CounterHint::Type::ADD, 1 } );
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::deque < sax::Token > tokens = measurements::MeasurementXmlFactory::composeMeasurementResults ( measurements::results ( ) );
measurements::MeasurementResults convertedResults = measurements::MeasurementXmlFactory::parseMeasurementResults ( tokens );
std::ostringstream ossoriginal;
ossoriginal << measurements::MeasurementFormat::LIST << measurements::results ( ) << std::endl;
std::ostringstream ossconverted;
ossconverted << measurements::MeasurementFormat::LIST << convertedResults << std::endl;
std::cout << ossoriginal.str ( ) << std::endl << ossconverted.str ( ) << std::endl;
CPPUNIT_ASSERT ( ossoriginal.str ( ) == ossconverted.str ( ) );
}
...@@ -9,6 +9,7 @@ class MeasurementsTest : public CppUnit::TestFixture { ...@@ -9,6 +9,7 @@ class MeasurementsTest : public CppUnit::TestFixture {
CPPUNIT_TEST ( testTimeMeasurements ); CPPUNIT_TEST ( testTimeMeasurements );
CPPUNIT_TEST ( testMemoryMeasurements ); CPPUNIT_TEST ( testMemoryMeasurements );
CPPUNIT_TEST ( testCounterMeasurements ); CPPUNIT_TEST ( testCounterMeasurements );
CPPUNIT_TEST ( testMeasurementXmlFactory );
CPPUNIT_TEST_SUITE_END ( ); CPPUNIT_TEST_SUITE_END ( );
   
public: public:
...@@ -19,6 +20,8 @@ public: ...@@ -19,6 +20,8 @@ public:
void testTimeMeasurements ( ); void testTimeMeasurements ( );
void testMemoryMeasurements ( ); void testMemoryMeasurements ( );
void testCounterMeasurements ( ); void testCounterMeasurements ( );
void testMeasurementXmlFactory ( );
}; };
   
#endif // MEASUREMENTS_TEST_H_ #endif // MEASUREMENTS_TEST_H_
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