forge-flamegraph-profiling
Profile Solidity gas with Foundry flamegraphs and harness tests.
ソース情報
- リポジトリ
- ethereum/sol-spartan-whir
- ソースの最終更新活動
- 2026年4月20日 06:25
- 検出された SKILL.md の言語
- 英語
- スター
- 8
- フォーク
- 3
インストール方法
デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。
ソースファイルを確認
インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。
ファイルエクスプローラー
3 ファイルSKILL.md を表示中
SKILL.md
ソースの指示 · 読み取り専用プレビュー- name
- forge-flamegraph-profiling
- description
- Profile Solidity gas with Foundry flamegraphs and harness tests.
# Forge Flamegraph Profiling
## Overview
Use this skill to profile **execution gas inside the EVM** with Foundry in a way that is fast, reproducible, and useful for optimization work. This is not total transaction gas — use the tx-gas benchmarking skill for that.
Start with the `gasleft()` harness tests to identify the expensive phase, then generate a focused flamegraph for that phase and parse the SVG titles programmatically.
## Workflow
1. Run the canonical gas number for the path you are profiling.
For the typed verifier path:
```bash
forge test --match-test testGasWhirVerifyFixed -vv
```
If the branch contains multiple suites with that test name, qualify it further with `--match-contract` or `--match-path`.
For the native blob verifier path:
```bash
forge test --match-test testGasWhirVerifyBlobNativeFixed -vv
```
2. Run the harness breakdown before generating a flamegraph.
```bash
forge test --match-test testProfileFullBreakdown -vv
forge test --match-test testProfileStirBreakdown -vv
forge test --match-test testProfileStirMicro -vv
```
3. Choose the visualization mode.
- Prefer `--flamegraph` first. It is aggregated by function and answers "where does total gas go?"
- Use `--flamechart` only after the hotspot is known and you need call ordering or sequencing.
- Foundry can crash on deep call trees when generating either artifact. Treat that as a Foundry trace-decoding bug, not as an OOM signal. If a test crashes, switch to a smaller or more focused test.
4. Generate the artifact from the Foundry project directory.
For this repo, run from `sol-spartan-whir/`. Prefer focused harness tests or synthetic tests over a full-path verifier test, because fixture loading adds noise.
Example:
```bash
forge test --match-test testFlameFinalStir --flamegraph
```
`--flamegraph` requires exactly one matching test. If the filter matches more than one suite, add `--match-contract` or `--match-path`.
5. Read the SVG programmatically.
- Do not use `view_image` on SVG flamegraphs.
- Foundry writes useful `<title>` tags into both flamegraphs and flamecharts.
- Use the script bundled with this skill.
To parse every `cache/flamegraph_*.svg` artifact:
```bash
python3 .agents/skills/forge-flamegraph-profiling/scripts/parse_flamegraphs.py
```
To parse a specific SVG:
```bash
python3 .agents/skills/forge-flamegraph-profiling/scripts/parse_flamegraphs.py \
cache/flamegraph_WhirGasProfileTest_testProfileStirBreakdown.svg
```
Use `--limit N` to change the number of rows printed per SVG.
6. Interpret the results correctly.
- The `gasleft()` harness is the canonical phase-level breakdown.
- The flamegraph is for finding hidden internal costs inside that phase.
- The same function can appear multiple times in different call stacks in the SVG output. Treat the raw title list as a hotspot map, not as a de-duplicated accounting table.
- Compare changes only on the same verifier path and the same fixture family.
## Spartan-WHIR Profiling Surface
The main profiling surface lives in the `test/WhirGasProfile*.t.sol` harness family.
Use these tests as the standard entrypoints:
- `testGasWhirVerifyFixed`: single canonical gas number
- `testProfileFullBreakdown`: setup, sumchecks, STIR, constraints, final check
- `testProfileStirBreakdown`: per-round STIR internals
- `testProfileStirMicro`: micro-benchmarks for leaf hashing, node compression, `KoalaBear.pow`, and query sampling
Prefer focused flamegraphs for one phase at a time. Tests that call `_loadSuccessFixture()` include measurable harness noise.
## Validation Order
Use this order when profiling an optimization candidate:
1. Run `forge test`.
2. Measure the canonical gas number.
3. Measure the harness breakdown.
4. Flamegraph the hottest phase.
5. Re-measure after the code change on the same path.
Do not hardcode gas numbers into the skill. Always measure the current branch.
GitHubで見る