diff --git a/bench.py b/bench.py
old mode 100644
new mode 100755
index 59617aa8..7797ebc9
--- a/bench.py
+++ b/bench.py
@@ -1,30 +1,64 @@
+#!/usr/bin/env python3
+# /// scripts
+# dependencies = [
+# ".",
+# "pyperf",
+# ]
+# ///
import subprocess
import sys
+import tempfile
-for name, s in (
- ("short escape", '"Hello, World!"'),
- ("long escape", '"Hello, World!" * 1000'),
- ("short plain", '"Hello, World!"'),
- ("long plain", '"Hello, World!" * 1000'),
- ("long suffix", '"Hello, World!" + "x" * 100_000'),
-):
+with tempfile.TemporaryDirectory() as d:
+ outfiles = []
for mod in "native", "speedups":
- subprocess.run(
- [
- sys.executable,
- "-m",
- "pyperf",
- "timeit",
- "--name",
- f"{name} {mod}",
- "-s",
- (
- "import markupsafe\n"
- f"from markupsafe._{mod} import _escape_inner\n"
- "markupsafe._escape_inner = _escape_inner\n"
- "from markupsafe import escape\n"
- f"s = {s}"
- ),
- "escape(s)",
- ]
- )
+ print(mod, end="", flush=True)
+ outname = f"{d}/{mod}.json"
+ outfiles.append(outname)
+ for name, s in (
+ ("short escape", '"Hello, World!"'),
+ ("long escape", '"Hello, World!" * 1000'),
+ ("short plain", '"Hello, World!"'),
+ ("long plain", '"Hello, World!" * 1000'),
+ (
+ "long prefix",
+ '"Hello, World!" * 1000 + "Hello, World!"',
+ ),
+ ("long suffix", '"Hello, World!" + "x" * 100_000'),
+ ):
+ subprocess.run(
+ [
+ sys.executable,
+ "-m",
+ "pyperf",
+ "timeit",
+ "--quiet",
+ "--name",
+ name,
+ "--append",
+ outname,
+ "-s",
+ (
+ "import markupsafe\n"
+ f"from markupsafe._{mod} import _escape_inner\n"
+ "markupsafe._escape_inner = _escape_inner\n"
+ "from markupsafe import escape\n"
+ f"s = {s}"
+ ),
+ "escape(s)",
+ ],
+ stdout=subprocess.DEVNULL,
+ )
+ print(".", end="", flush=True)
+ print()
+
+ subprocess.run(
+ [
+ sys.executable,
+ "-m",
+ "pyperf",
+ "compare_to",
+ "--table",
+ *outfiles,
+ ]
+ )