void PrettyPrinter::print_measurements(const Profiler::MeasurementsMap &measurements) { for(const auto &instrument : measurements) { *_stream << begin_color("3") << " " << instrument.first << ":"; auto add_measurements = [](Measurement::Value a, const Measurement & b) { return a + b.value(); }; auto cmp_measurements = [](const Measurement & a, const Measurement & b) { return a.value() < b.value(); }; int num_values = instrument.second.size(); const auto minmax_values = std::minmax_element(instrument.second.begin(), instrument.second.end(), cmp_measurements); Measurement::Value sum_values = std::accumulate(instrument.second.begin(), instrument.second.end(), Measurement::Value(minmax_values.first->value().is_floating_point), add_measurements); // Calculate the median value auto measurements = instrument.second; std::nth_element(measurements.begin(), measurements.begin() + (num_values / 2), measurements.end(), cmp_measurements); const auto median_value = measurements[num_values / 2]; // Calculate the relative standard deviation auto mean_value = sum_values / num_values; std::vector<Measurement::Value> diff(measurements.size(), minmax_values.first->value().is_floating_point); std::transform(measurements.begin(), measurements.end(), diff.begin(), [mean_value](const Measurement & x) { return x.value() - mean_value; }); auto sq_sum = std::inner_product(diff.begin(), diff.end(), diff.begin(), Measurement::Value(minmax_values.first->value().is_floating_point)); auto variance = sq_sum / measurements.size(); auto rsd = Measurement::Value::relative_standard_deviation(variance, mean_value); if(num_values > 2) { sum_values -= minmax_values.first->value() + minmax_values.second->value(); num_values -= 2; } *_stream << " "; *_stream << "MEDIAN=" << median_value.value() << " " << median_value.unit() << ", "; *_stream << "AVG=" << (sum_values / num_values) << " " << minmax_values.second->unit() << ", "; *_stream << "STDDEV=" << arithmetic_to_string(rsd, 2) << " %, "; if(num_values > 1) { *_stream << "MIN=" << *minmax_values.first << ", "; *_stream << "MAX=" << *minmax_values.second; } *_stream << end_color() << "\n"; } }
int main (int argc, char *argv[]) { struct stats s, s0; int print = 0; FILE *fp = fopen(STATS_FILE, "rb"); if (fp != NULL) { fread(&s0, sizeof(struct stats), 1, fp); fclose(fp); print = 1; } get_times(&s); get_temp(&s); get_mail(&s); get_cputime(&s); get_power(&s); get_mem(&s); get_txrx(&s); if (print) { int i; double temp = 1e-3*s.temp; double charge = 100*s.charge_now/s.charge_full; double tx = (s.tx-s0.tx)/(s.t-s0.t); double rx = (s.rx-s0.rx)/(s.t-s0.t); double mem = s.mem*9.5367431640625e-07; double cpu_pct[MAX_CPUS]; for (i=0; i < s.n_cpus; i++) { double idle = s.cpu_idle[i] - s0.cpu_idle[i]; double total = s.cpu_total[i] - s0.cpu_total[i]; cpu_pct[i] = 1-idle/total; } fputs(" [", stdout); begin_color(color_bar); fputs(th_spc, stdout); for (i=0; i < s.n_cpus; i++) { print_bar(cpu_pct[i]); fputs(th_spc, stdout); } end_color(); fputc(']', stdout); begin_color (color_div); fputs(spc, stdout); fputs(divider, stdout); end_color(); begin_color_coded (temp, LO_TEMP, HI_TEMP); num_print (temp, 3, degc); end_color(); begin_color (color_div); fputs(spc, stdout); fputs(divider, stdout); fputs(spc, stdout); end_color(); begin_color_coded (mem, LO_MEM, HI_MEM); num_print (mem, 4, "MB"); end_color(); begin_color (color_div); fputs(spc, stdout); fputs(divider, stdout); fputs(spc, stdout); end_color(); begin_color (s.ac_connected ? "cyan" : "red"); fputs(s.ac_connected ? acon : acoff, stdout); fputc(' ', stdout); end_color(); begin_color_coded (100-charge, LO_CHARGE, HI_CHARGE); num_print (charge, 3, "%"); end_color(); begin_color (color_div); fputs(spc, stdout); fputs(divider, stdout); end_color(); begin_color_coded (tx, LO_RATE, HI_RATE); num_print (tx, 0, "B/s "); end_color(); begin_color (color_up); fputs(up, stdout); end_color(); begin_color_coded (rx, LO_RATE, HI_RATE); fputs(spc, stdout); num_print (rx, 0, "B/s "); end_color(); begin_color (color_down); fputs(down, stdout); end_color(); fputs(spc, stdout); begin_color (color_div); fputs(divider, stdout); fputs(spc, stdout); end_color(); if (s.gmail) { begin_color (color_mail); printf ("%2d/g", s.gmail); end_color(); } if (s.uiucmail) { begin_color (color_mail); printf ("%2d/u", s.uiucmail); end_color(); } if (s.uiucmail || s.gmail) { fputs(spc, stdout); begin_color (color_div); fputs(divider, stdout); fputs(spc, stdout); end_color(); } begin_color (color_date); fputs(s.date, stdout); end_color(); fputs(spc, stdout); begin_color (color_div); fputs(divider, stdout); end_color(); } fp = fopen(STATS_FILE, "wb"); fwrite(&s, sizeof(struct stats), 1, fp); fclose(fp); return 0; }
void PrettyPrinter::print_info(const std::string &info) { *_stream << begin_color("1") << "INFO: " << info << end_color() << "\n"; }
void PrettyPrinter::print_test_header(const TestInfo &info) { *_stream << begin_color("2") << "Running [" << info.id << "] '" << info.name << "'" << end_color() << "\n"; }
void PrettyPrinter::print_entry(const std::string &name, const std::string &value) { *_stream << begin_color("4") << name << " = " << value << end_color() << "\n"; }
void PrettyPrinter::print_error(const std::exception &error, bool expected) { std::string prefix = expected ? "EXPECTED ERROR: " : "ERROR: "; *_stream << begin_color("1") << prefix << error.what() << end_color() << "\n"; }