Index: tools/ignition/bytecode_dispatches_report.py |
diff --git a/tools/ignition/bytecode_dispatches_report.py b/tools/ignition/bytecode_dispatches_report.py |
index 1c140141f0dd3904a271001627372abaf072c639..97f8e8394d3ef756af7079744d7631b7f7575af7 100755 |
--- a/tools/ignition/bytecode_dispatches_report.py |
+++ b/tools/ignition/bytecode_dispatches_report.py |
@@ -12,6 +12,7 @@ from matplotlib import colors |
from matplotlib import pyplot |
import numpy |
import struct |
+import sys |
__DESCRIPTION = """ |
@@ -50,8 +51,8 @@ __COUNTER_MAX = 2**__COUNTER_BITS - 1 |
def warn_if_counter_may_have_saturated(dispatches_table): |
- for source, counters_from_source in dispatches_table.items(): |
- for destination, counter in counters_from_source.items(): |
+ for source, counters_from_source in iteritems(dispatches_table): |
+ for destination, counter in iteritems(counters_from_source): |
if counter == __COUNTER_MAX: |
print "WARNING: {} -> {} may have saturated.".format(source, |
destination) |
@@ -59,8 +60,8 @@ def warn_if_counter_may_have_saturated(dispatches_table): |
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(): |
+ for source, counters_from_source in iteritems(dispatches_table): |
+ for destination, counter in iteritems(counters_from_source): |
yield source, destination, counter |
return heapq.nlargest(top_count, flattened_counters_generator(), |
@@ -77,8 +78,9 @@ def print_top_bytecode_dispatch_pairs(dispatches_table, top_count): |
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()))) |
+ for bytecode, counters_from_bytecode in iteritems(dispatches_table): |
+ top_bytecodes.append((bytecode, sum(itervalues(counters_from_bytecode)))) |
+ |
top_bytecodes.sort(key=lambda x: x[1], reverse=True) |
return top_bytecodes |
@@ -90,30 +92,37 @@ def print_top_bytecodes(dispatches_table): |
print "{:>12d}\t{}".format(counter, bytecode) |
-def find_top_dispatch_sources(dispatches_table, destination, top_count): |
- def source_counters_generator(): |
- for source, table_row in dispatches_table.items(): |
- if destination in table_row: |
- yield source, table_row[destination] |
+def find_top_dispatch_sources_and_destinations( |
+ dispatches_table, bytecode, top_count, sort_source_relative): |
+ sources = [] |
+ for source, destinations in iteritems(dispatches_table): |
+ total = float(sum(itervalues(destinations))) |
+ if bytecode in destinations: |
+ count = destinations[bytecode] |
+ sources.append((source, count, count / total)) |
- return heapq.nlargest(top_count, source_counters_generator(), |
- key=lambda x: x[1]) |
+ destinations = [] |
+ bytecode_destinations = dispatches_table[bytecode] |
+ bytecode_total = float(sum(itervalues(bytecode_destinations))) |
+ for destination, count in iteritems(bytecode_destinations): |
+ destinations.append((destination, count, count / bytecode_total)) |
+ return (heapq.nlargest(top_count, sources, |
+ key=lambda x: x[2 if sort_source_relative else 1]), |
+ heapq.nlargest(top_count, destinations, key=lambda x: x[1])) |
-def print_top_dispatch_sources_and_destinations(dispatches_table, bytecode, |
- top_count): |
- top_sources = find_top_dispatch_sources(dispatches_table, bytecode, top_count) |
- top_destinations = heapq.nlargest(top_count, |
- dispatches_table[bytecode].items(), |
- key=lambda x: x[1]) |
+def print_top_dispatch_sources_and_destinations(dispatches_table, bytecode, |
+ top_count, sort_relative): |
+ top_sources, top_destinations = find_top_dispatch_sources_and_destinations( |
+ dispatches_table, bytecode, top_count, sort_relative) |
print "Top sources of dispatches to {}:".format(bytecode) |
- for source_name, counter in top_sources: |
- print "{:>12d}\t{}".format(counter, source_name) |
+ for source_name, counter, ratio in top_sources: |
+ print "{:>12d}\t{:>5.1f}%\t{}".format(counter, ratio * 100, source_name) |
print "\nTop destinations of dispatches from {}:".format(bytecode) |
- for destination_name, counter in top_destinations: |
- print "{:>12d}\t{}".format(counter, destination_name) |
+ for destination_name, counter, ratio in top_destinations: |
+ print "{:>12d}\t{:>5.1f}%\t{}".format(counter, ratio * 100, destination_name) |
def build_counters_matrix(dispatches_table): |
@@ -215,6 +224,12 @@ def parse_command_line(): |
"extension. PDF, SVG, PNG supported") |
) |
command_line_parser.add_argument( |
+ "--sort-sources-relative", "-r", |
+ action="store_true", |
+ help=("print top sources in order to how often they dispatch to the " |
+ "specified bytecode, only applied when using -f") |
+ ) |
+ command_line_parser.add_argument( |
"input_filename", |
metavar="<input filename>", |
default="v8.ignition_dispatches_table.json", |
@@ -225,6 +240,14 @@ def parse_command_line(): |
return command_line_parser.parse_args() |
+def itervalues(d): |
+ return d.values() if sys.version_info[0] > 2 else d.itervalues() |
+ |
+ |
+def iteritems(d): |
+ return d.items() if sys.version_info[0] > 2 else d.iteritems() |
+ |
+ |
def main(): |
program_options = parse_command_line() |
@@ -249,7 +272,7 @@ def main(): |
elif program_options.top_dispatches_for_bytecode: |
print_top_dispatch_sources_and_destinations( |
dispatches_table, program_options.top_dispatches_for_bytecode, |
- program_options.top_entries_count) |
+ program_options.top_entries_count, program_options.sort_sources_relative) |
else: |
print_top_bytecodes(dispatches_table) |