Skip to content

feat(benches): forge test --isolate #11037

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 4 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .github/scripts/combine-benchmarks.sh
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ EOF
FIRST_FILE=1
SYSTEM_INFO=""

for bench_file in "forge_test_bench.md" "forge_build_bench.md" "forge_coverage_bench.md"; do
for bench_file in "forge_test_bench.md" "forge_build_bench.md" "forge_coverage_bench.md" "forge_isolate_test_bench.md"; do
if [ -f "$OUTPUT_DIR/$bench_file" ]; then
echo "Processing $bench_file..."

Expand All @@ -135,6 +135,9 @@ for bench_file in "forge_test_bench.md" "forge_build_bench.md" "forge_coverage_b
"forge_test_bench.md")
SECTION_NAME="Forge Test"
;;
"forge_isolate_test_bench.md")
SECTION_NAME="Forge Test (Isolated)"
;;
"forge_build_bench.md")
SECTION_NAME="Forge Build"
;;
Expand Down
35 changes: 34 additions & 1 deletion .github/workflows/benchmarks.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
name: Foundry Benchmarks

on:
pull_request:
types: [opened, synchronize, reopened]
workflow_dispatch:
inputs:
pr_number:
Expand Down Expand Up @@ -155,9 +157,40 @@ jobs:
name: forge-coverage-results
path: benches/forge_coverage_bench.md

forge-isolate-test-bench:
name: Forge Isolate Test Benchmarks
needs: setup
runs-on: foundry-runner
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Benchmark setup
uses: ./.github/actions/benchmark-setup

- name: Run forge isolate test benchmarks
env:
FOUNDRY_DIR: ${{ github.workspace }}/.foundry
run: |
VERSIONS="${{ github.event.inputs.versions || 'stable,nightly' }}"
# Isolate tests default to Vectorized/solady but can be overridden
REPOS="${{ github.event.inputs.repos || env.VECTORIZED_SOLADY }}"

./foundry-bench --output-dir ./benches --force-install \
--versions $VERSIONS \
--repos $REPOS \
--benchmarks forge_isolate_test \
--output-file forge_isolate_test_bench.md

- name: Upload isolate test benchmark results
uses: actions/upload-artifact@v4
with:
name: forge-isolate-test-results
path: benches/forge_isolate_test_bench.md

combine-results:
name: Combine and Publish Results
needs: [forge-test-bench, forge-build-bench, forge-coverage-bench]
needs: [forge-test-bench, forge-build-bench, forge-coverage-bench, forge-isolate-test-bench]
runs-on: foundry-runner
steps:
- name: Checkout repository
Expand Down
40 changes: 27 additions & 13 deletions benches/LATEST.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# 📊 Foundry Benchmark Results

**Generated at**: 2025-07-11 11:48:21 UTC
**Generated at**: 2025-07-18 09:47:02 UTC

## Forge Test

Expand All @@ -11,19 +11,19 @@
### Foundry Versions

- **stable**: forge Version: 1.2.3-stable (a813a2c 2025-06-08)
- **nightly**: forge Version: 1.2.3-nightly (d592b3e 2025-07-11)
- **nightly**: forge Version: 1.3.0-nightly (5eb910c 2025-07-18)

| Repository | stable | nightly |
|------------|----------|----------|
| ithacaxyz-account | 6.86 s | 6.03 s |
| solady | 7.70 s | 6.94 s |
| ithacaxyz-account | 5.84 s | 6.44 s |
| solady | 6.90 s | 6.98 s |

## Forge Fuzz Test

| Repository | stable | nightly |
|------------|----------|----------|
| ithacaxyz-account | 6.65 s | 6.28 s |
| solady | 7.87 s | 6.98 s |
| ithacaxyz-account | 6.13 s | 6.58 s |
| solady | 7.72 s | 7.27 s |

## Forge Build

Expand All @@ -34,21 +34,21 @@
### Foundry Versions

- **stable**: forge Version: 1.2.3-stable (a813a2c 2025-06-08)
- **nightly**: forge Version: 1.2.3-nightly (d592b3e 2025-07-11)
- **nightly**: forge Version: 1.3.0-nightly (5eb910c 2025-07-18)

### No Cache

| Repository | stable | nightly |
|------------|----------|----------|
| ithacaxyz-account | 2.57 s | 2.61 s |
| solady | 3.95 s | 4.08 s |
| ithacaxyz-account | 2.59 s | 2.82 s |
| solady | 4.03 s | 4.06 s |

### With Cache

| Repository | stable | nightly |
|------------|----------|----------|
| ithacaxyz-account | 2.58 s | 2.60 s |
| solady | 4.04 s | 4.07 s |
| ithacaxyz-account | 2.59 s | 2.83 s |
| solady | 4.10 s | 3.99 s |

## Forge Coverage

Expand All @@ -58,11 +58,25 @@
### Foundry Versions

- **stable**: forge Version: 1.2.3-stable (a813a2c 2025-06-08)
- **nightly**: forge Version: 1.2.3-nightly (d592b3e 2025-07-11)
- **nightly**: forge Version: 1.3.0-nightly (5eb910c 2025-07-18)

| Repository | stable | nightly |
|------------|----------|----------|
| ithacaxyz-account | 21.49 s | 20.85 s |
| ithacaxyz-account | 20.54 s | 21.97 s |

## Forge Test (Isolated)

### Repositories Tested

1. [Vectorized/solady](https://github.com/Vectorized/solady)
### Foundry Versions

- **stable**: forge Version: 1.2.3-stable (a813a2c 2025-06-08)
- **nightly**: forge Version: 1.3.0-nightly (5eb910c 2025-07-18)

| Repository | stable | nightly |
|------------|----------|----------|
| solady | 3.24 s | 3.03 s |

## System Information

Expand Down
20 changes: 20 additions & 0 deletions benches/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -355,6 +355,25 @@ impl BenchmarkProject {
)
}

/// Benchmark forge test with --isolate flag
pub fn bench_forge_isolate_test(
&self,
version: &str,
runs: u32,
verbose: bool,
) -> Result<HyperfineResult> {
// Build before running tests
self.hyperfine(
"forge_isolate_test",
version,
"forge test --isolate",
runs,
Some("forge build"),
None,
verbose,
)
}

/// Get the root path of the project
pub fn root(&self) -> &Path {
&self.root_path
Expand All @@ -374,6 +393,7 @@ impl BenchmarkProject {
"forge_build_with_cache" => self.bench_forge_build_with_cache(version, runs, verbose),
"forge_fuzz_test" => self.bench_forge_fuzz_test(version, runs, verbose),
"forge_coverage" => self.bench_forge_coverage(version, runs, verbose),
"forge_isolate_test" => self.bench_forge_isolate_test(version, runs, verbose),
_ => eyre::bail!("Unknown benchmark: {}", benchmark),
}
}
Expand Down
3 changes: 2 additions & 1 deletion benches/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,13 @@ use foundry_common::sh_println;
use rayon::prelude::*;
use std::{fs, path::PathBuf, process::Command, sync::Mutex};

const ALL_BENCHMARKS: [&str; 5] = [
const ALL_BENCHMARKS: [&str; 6] = [
"forge_test",
"forge_build_no_cache",
"forge_build_with_cache",
"forge_fuzz_test",
"forge_coverage",
"forge_isolate_test",
];

/// Foundry Benchmark Runner
Expand Down
1 change: 1 addition & 0 deletions benches/src/results.rs
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,7 @@ pub fn format_benchmark_name(name: &str) -> String {
"forge_build_with_cache" => "Forge Build (With Cache)",
"forge_fuzz_test" => "Forge Fuzz Test",
"forge_coverage" => "Forge Coverage",
"forge_isolate_test" => "Forge Test (Isolated)",
_ => name,
}
.to_string()
Expand Down