summaryrefslogtreecommitdiffstats
path: root/Tools
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2022-06-22 07:50:02 (GMT)
committerGitHub <noreply@github.com>2022-06-22 07:50:02 (GMT)
commitf805d37641bd982fd7f252e51e2fdae836fce61c (patch)
tree2c8d106250d614ea6aa54a8b8c707e5431426a08 /Tools
parent9a479c3c1063f434629a1f7553f5a4715d738f30 (diff)
downloadcpython-f805d37641bd982fd7f252e51e2fdae836fce61c.zip
cpython-f805d37641bd982fd7f252e51e2fdae836fce61c.tar.gz
cpython-f805d37641bd982fd7f252e51e2fdae836fce61c.tar.bz2
Stats: Add summary of top instructions for misses and deferred specialization. (GH-94072)
Diffstat (limited to 'Tools')
-rw-r--r--Tools/scripts/summarize_stats.py22
1 files changed, 20 insertions, 2 deletions
diff --git a/Tools/scripts/summarize_stats.py b/Tools/scripts/summarize_stats.py
index a856bbb..93a9b6b 100644
--- a/Tools/scripts/summarize_stats.py
+++ b/Tools/scripts/summarize_stats.py
@@ -188,6 +188,12 @@ class Section:
print("</details>")
print()
+def to_str(x):
+ if isinstance(x, int):
+ return format(x, ",d")
+ else:
+ return str(x)
+
def emit_table(header, rows):
width = len(header)
header_line = "|"
@@ -203,8 +209,8 @@ def emit_table(header, rows):
print(under_line)
for row in rows:
if width is not None and len(row) != width:
- raise ValueError("Wrong number of elements in row '" + str(rows) + "'")
- print("|", " | ".join(str(i) for i in row), "|")
+ raise ValueError("Wrong number of elements in row '" + str(row) + "'")
+ print("|", " | ".join(to_str(i) for i in row), "|")
print()
def emit_execution_counts(opcode_stats, total):
@@ -251,6 +257,18 @@ def emit_specialization_overview(opcode_stats, total):
("Not specialized", not_specialized, f"{not_specialized*100/total:0.1f}%"),
("Specialized", specialized, f"{specialized*100/total:0.1f}%"),
))
+ for title, field in (("Deferred", "specialization.deferred"), ("Misses", "specialization.miss")):
+ total = 0
+ counts = []
+ for i, opcode_stat in enumerate(opcode_stats):
+ value = opcode_stat.get(field, 0)
+ counts.append((value, opname[i]))
+ total += value
+ counts.sort(reverse=True)
+ if total:
+ with Section(f"{title} by instruction", 3):
+ rows = [ (name, count, f"{100*count/total:0.1f}%") for (count, name) in counts[:10] ]
+ emit_table(("Name", "Count:", "Ratio:"), rows)
def emit_call_stats(stats):
stats_path = os.path.join(os.path.dirname(__file__), "../../Include/pystats.h")