94 lines
2.7 KiB
C++

/*
* main.cpp
*
* Created on: Dec 4, 2020
* Author: hoo2
*/
#include <sstream>
#include <fstream>
#include <iostream>
#include <algorithm>
#define SIZE 20
std::ifstream file;
/*!
* Calculates and return the median of an array of measurements
* \param t Pointer to measurements
* \param n Size of measurements array
* \return The average
*/
int median (int *t, int n) {
std::sort (t, &t[n]);
return (n % 2) ? t[n/2] : (t[n/2] + t[n/2 -1]) /2;
}
/*
* A small post processing...
*/
int main(int argc, char* argv[]) {
file = std::ifstream(argv[1]);
std::string line, token, exec, mtx, times, dt, units, dyn1, dyn2;
std::string t1, t2, t3, t4;
enum state_en {RUNNING, LOAD, DATA, SUM} state = RUNNING;
int cnt =0, med =0;
int delta_t[SIZE];
while (std::getline (file, line, '\n')) {
std::stringstream ss(line);
switch (state) {
case RUNNING:
ss >> token;
if (token == "running") {
ss >> exec >> t1 >> mtx >> t2 >> times >> t3 >> t4 >> dyn1 >> dyn2;
cnt =0;
state = LOAD;
}
break;
case LOAD: state = DATA; break;
case DATA:
ss >> t1 >> t2 >> t3 >> dt >> units;
if (units == "[usec]") delta_t[cnt] = std::atoi(dt.c_str());
else if (units == "[msec]") delta_t[cnt] = std::atoi(dt.c_str()) * 1000;
else if (units == "[sec]") delta_t[cnt] = std::atoi(dt.c_str()) * 1000000;
if (++cnt == std::atoi(times.c_str())) {
med = median (delta_t, cnt);
cnt =0;
state = SUM;
}
break;
case SUM:
ss >> token;
if (token == "running") {
std::cout << exec << ',' << mtx << ',' << med << ", ," <<
(((dyn1 == "--dynamic") || (dyn2 == "--dynamic")) ? "dyn\n" : " \n");
dyn1 = "";
dyn2 = "";
ss >> exec >> t1 >> mtx >> t2 >> times >> t3 >> t4 >> dyn1 >> dyn2;
cnt =0;
state = LOAD;
}
else if (token == "[Timing]:") {
ss >> t1 >> t2 >> dt >> units;
if (units == "[usec]") med += std::atoi(dt.c_str());
else if (units == "[msec]") med += std::atoi(dt.c_str()) * 1000;
else if (units == "[sec]") med += std::atoi(dt.c_str()) * 1000000;
state = RUNNING;
std::cout << exec << ',' << mtx << ',' << med << ",sum," <<
(((dyn1 == "--dynamic") || (dyn2 == "--dynamic")) ? "dyn\n" : " \n");
dyn1 = "";
dyn2 = "";
}
break;
}
}
return 0;
}