Index: tools/ignition/bytecode_dispatches_report.py |
diff --git a/tools/ignition/bytecode_dispatches_report.py b/tools/ignition/bytecode_dispatches_report.py |
index 2c04bef600e0336e9cb84f21d928b20eb3eb61eb..ae169135e91e3a33fbd8e895d300f93d7969d17d 100755 |
--- a/tools/ignition/bytecode_dispatches_report.py |
+++ b/tools/ignition/bytecode_dispatches_report.py |
@@ -17,17 +17,20 @@ import struct |
__DESCRIPTION = """ |
Process v8.ignition_dispatches_counters.json and list top counters, |
or plot a dispatch heatmap. |
+ |
+Please note that those handlers that may not or will never dispatch |
+(e.g. Return or Throw) do not show up in the results. |
""" |
__HELP_EPILOGUE = """ |
examples: |
- # Print the top 10 counters, reading from default filename |
- # v8.ignition_dispatches_counters.json (default mode) |
+ # Print the hottest bytecodes in descending order, reading from |
+ # default filename v8.ignition_dispatches_counters.json (default mode) |
$ tools/ignition/bytecode_dispatches_report.py |
- # Print the top 15 counters reading from data.json |
- $ tools/ignition/bytecode_dispatches_report.py -t 15 data.json |
+ # Print the hottest 15 bytecode dispatch pairs reading from data.json |
+ $ tools/ignition/bytecode_dispatches_report.py -t -n 15 data.json |
# Save heatmap to default filename v8.ignition_dispatches_counters.svg |
$ tools/ignition/bytecode_dispatches_report.py -p |
@@ -51,7 +54,7 @@ def warn_if_counter_may_have_saturated(dispatches_table): |
destination) |
-def find_top_counters(dispatches_table, top_count): |
+def find_top_bytecode_dispatch_pairs(dispatches_table, top_count): |
def flattened_counters_generator(): |
for source, counters_from_source in dispatches_table.items(): |
for destination, counter in counters_from_source.items(): |
@@ -61,13 +64,29 @@ def find_top_counters(dispatches_table, top_count): |
key=lambda x: x[2]) |
-def print_top_counters(dispatches_table, top_count): |
- top_counters = find_top_counters(dispatches_table, top_count) |
- print "Top {} dispatch counters:".format(top_count) |
- for source, destination, counter in top_counters: |
+def print_top_bytecode_dispatch_pairs(dispatches_table, top_count): |
+ top_bytecode_dispatch_pairs = ( |
+ find_top_bytecode_dispatch_pairs(dispatches_table, top_count)) |
+ print "Top {} bytecode dispatch pairs:".format(top_count) |
+ for source, destination, counter in top_bytecode_dispatch_pairs: |
print "{:>12d}\t{} -> {}".format(counter, source, destination) |
+def find_top_bytecodes(dispatches_table): |
+ top_bytecodes = [] |
+ for bytecode, counters_from_bytecode in dispatches_table.items(): |
+ top_bytecodes.append((bytecode, sum(counters_from_bytecode.values()))) |
+ top_bytecodes.sort(key=lambda x: x[1], reverse=True) |
+ return top_bytecodes |
+ |
+ |
+def print_top_bytecodes(dispatches_table): |
+ top_bytecodes = find_top_bytecodes(dispatches_table) |
+ print "Top bytecodes:" |
+ for bytecode, counter in top_bytecodes: |
+ print "{:>12d}\t{}".format(counter, bytecode) |
+ |
+ |
def build_counters_matrix(dispatches_table): |
labels = sorted(dispatches_table.keys()) |
@@ -90,10 +109,10 @@ def plot_dispatches_table(dispatches_table, figure, axis): |
image = axis.pcolor( |
counters_matrix, |
- cmap='jet', |
+ cmap="jet", |
norm=colors.LogNorm(), |
- edgecolor='grey', |
- linestyle='dotted', |
+ edgecolor="grey", |
+ linestyle="dotted", |
linewidth=0.5 |
) |
@@ -103,7 +122,7 @@ def plot_dispatches_table(dispatches_table, figure, axis): |
) |
axis.xaxis.tick_top() |
axis.set_xlim(0, len(xlabels)) |
- axis.set_xticklabels(xlabels, rotation='vertical') |
+ axis.set_xticklabels(xlabels, rotation="vertical") |
axis.yaxis.set( |
ticks=numpy.arange(0.5, len(ylabels)), |
@@ -127,30 +146,35 @@ def parse_command_line(): |
epilog=__HELP_EPILOGUE |
) |
command_line_parser.add_argument( |
- "--plot_size", "-s", |
+ "--plot-size", "-s", |
metavar="N", |
default=30, |
- help="shorter side, in inches, of the output plot (default 30)" |
+ help="shorter side in inches of the output plot (default 30)" |
) |
command_line_parser.add_argument( |
"--plot", "-p", |
action="store_true", |
- help="plot dispatches table heatmap" |
+ help="plot dispatch pairs heatmap" |
) |
command_line_parser.add_argument( |
"--interactive", "-i", |
action="store_true", |
- help="open an interactive viewer, rather than writing to file" |
+ help="open the heatmap in an interactive viewer, instead of writing to file" |
+ ) |
+ command_line_parser.add_argument( |
+ "--top-bytecode-dispatch-pairs", "-t", |
+ action="store_true", |
+ help="print the top bytecode dispatch pairs" |
) |
command_line_parser.add_argument( |
- "--top_count", "-t", |
+ "--top-bytecode-dispatch-pairs-number", "-n", |
metavar="N", |
type=int, |
default=10, |
- help="print the top N counters (default 10)" |
+ help="print N top bytecode dispatch pairs when running with -t (default 10)" |
) |
command_line_parser.add_argument( |
- "--output_filename", "-o", |
+ "--output-filename", "-o", |
metavar="<output filename>", |
default="v8.ignition_dispatches_table.svg", |
help=("file to save the plot file to. File type is deduced from the " |
@@ -185,8 +209,11 @@ def main(): |
figure.set_size_inches(program_options.plot_size, |
program_options.plot_size) |
pyplot.savefig(program_options.output_filename) |
+ elif program_options.top_bytecode_dispatch_pairs: |
+ print_top_bytecode_dispatch_pairs( |
+ dispatches_table, program_options.top_bytecode_dispatch_pairs_number) |
else: |
- print_top_counters(dispatches_table, program_options.top_count) |
+ print_top_bytecodes(dispatches_table) |
if __name__ == "__main__": |