diff options
Diffstat (limited to 'emulator/qtools/hist_trace.cpp')
-rw-r--r-- | emulator/qtools/hist_trace.cpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/emulator/qtools/hist_trace.cpp b/emulator/qtools/hist_trace.cpp new file mode 100644 index 0000000..d2c6a90 --- /dev/null +++ b/emulator/qtools/hist_trace.cpp @@ -0,0 +1,64 @@ +#include <stdio.h> +#include <stdlib.h> +#include <inttypes.h> +#include "trace_reader.h" + +static const int kMaxHistEntries = 256; +static const int kMaxHistEntries2 = kMaxHistEntries / 2; +int hist[kMaxHistEntries]; +int underflow, overflow; + +int main(int argc, char **argv) { + if (argc != 2) { + fprintf(stderr, "Usage: %s trace_file\n", argv[0]); + exit(1); + } + + char *trace_filename = argv[1]; + TraceReaderBase *trace = new TraceReaderBase; + trace->Open(trace_filename); + + uint64_t prev_bb_num = 0; + uint64_t prev_time = 0; + int total = 0; + + while (1) { + BBEvent event; + + if (trace->ReadBB(&event)) + break; + int bb_diff = event.bb_num - prev_bb_num; + //int time_diff = event.time - prev_time; + //printf("bb_num: %llu prev: %llu, diff: %d\n", + // event.bb_num, prev_bb_num, bb_diff); + prev_bb_num = event.bb_num; + prev_time = event.time; + + bb_diff += kMaxHistEntries2; + if (bb_diff < 0) + underflow += 1; + else if (bb_diff >= kMaxHistEntries) + overflow += 1; + else + hist[bb_diff] += 1; + total += 1; + } + + int sum = 0; + double sum_per = 0; + double per = 0; + for (int ii = 0; ii < kMaxHistEntries; ++ii) { + if (hist[ii] == 0) + continue; + per = 100.0 * hist[ii] / total; + sum += hist[ii]; + sum_per = 100.0 * sum / total; + printf(" %4d: %6d %6.2f %6.2f\n", ii - kMaxHistEntries2, hist[ii], per, sum_per); + } + per = 100.0 * underflow / total; + printf("under: %6d %6.2f\n", underflow, per); + per = 100.0 * overflow / total; + printf("over: %6d %6.2f\n", overflow, per); + printf("total: %6d\n", total); + return 0; +} |