diff --git a/.claude/skills/profiling/SKILL.md b/.claude/skills/profiling/SKILL.md new file mode 100644 index 0000000000..62e33a0ea8 --- /dev/null +++ b/.claude/skills/profiling/SKILL.md @@ -0,0 +1,26 @@ +--- +name: profiling +description: Profile Lean programs with demangled names using samply and Firefox Profiler. Use when the user asks to profile a Lean binary or investigate performance. +allowed-tools: Bash, Read, Glob, Grep +--- + +# Profiling Lean Programs + +Full documentation: `script/PROFILER_README.md`. + +## Quick Start + +```bash +script/lean_profile.sh ./build/release/stage1/bin/lean some_file.lean +``` + +Requires `samply` (`cargo install samply`) and `python3`. + +## Agent Notes + +- The pipeline is interactive (serves to browser at the end). When running non-interactively, run the steps manually instead of using the wrapper script. +- The three steps are: `samply record --save-only`, `symbolicate_profile.py`, then `serve_profile.py`. +- `lean_demangle.py` works standalone as a stdin filter (like `c++filt`) for quick name lookups. +- The `--raw` flag on `lean_demangle.py` gives exact demangled names without postprocessing (keeps `._redArg`, `._lam_0` suffixes as-is). +- Use `PROFILE_KEEP=1` to keep the temp directory for later inspection. +- The demangled profile is a standard Firefox Profiler JSON. Function names live in `threads[i].stringArray`, indexed by `threads[i].funcTable.name`. diff --git a/script/lean_profile.sh b/script/lean_profile.sh index f2a5501997..5592c9d5c3 100755 --- a/script/lean_profile.sh +++ b/script/lean_profile.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Profile a Lean binary with demangled names. # # Usage: