[CmdletBinding()] param( [ValidateSet("samply", "flamegraph")] [string]$Profiler = "samply", [int]$ProfileSeconds = 4, [string]$Scenario = "shared_runtime_live_http_transfer/tight_cap_6way", [string]$OutputDir ) Set-StrictMode -Version Latest $ErrorActionPreference = "Stop" $repoRoot = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) $OutputDir = if ([string]::IsNullOrWhiteSpace($OutputDir)) { Join-Path $repoRoot "artifacts\shared-runtime-http-pressure-profile" } else { $OutputDir } $manifestPath = Join-Path $repoRoot "Cargo.toml" $null = New-Item -ItemType Directory -Path $OutputDir -Force $artifactStem = ($Scenario -replace "[^A-Za-z0-9._-]", "-").Trim("-") if ([string]::IsNullOrWhiteSpace($artifactStem)) { throw "Scenario must produce a non-empty artifact stem." } $cargoArgs = @( "bench", "-p", "aria2-rust-pro-tests", "--bench", "rpc_pressure", $Scenario, "--manifest-path", $manifestPath, "--", "--profile-time", $ProfileSeconds.ToString() ) $metaPath = Join-Path $OutputDir "meta.txt" @( "timestamp=$([DateTimeOffset]::Now.ToString('O'))" "profiler=$Profiler" "profile_seconds=$ProfileSeconds" "scenario=$Scenario" ) | Set-Content -LiteralPath $metaPath -Encoding UTF8 Push-Location $repoRoot try { switch ($Profiler) { "samply" { $outputPath = Join-Path $OutputDir "$artifactStem-profile.json.gz" & samply record ` --save-only ` --no-open ` --output $outputPath ` --profile-name "shared-runtime-http-pressure" ` cargo @cargoArgs } "flamegraph" { $outputPath = Join-Path $OutputDir "$artifactStem-flamegraph.svg" & cargo flamegraph ` "-p" "aria2-rust-pro-tests" ` "--bench" "rpc_pressure" ` "--manifest-path" $manifestPath ` "--output" $outputPath ` "--" ` $Scenario ` "--profile-time" ` $ProfileSeconds } default { throw "Unsupported profiler: $Profiler" } } if ($LASTEXITCODE -ne 0) { throw "Profiler command failed with exit code $LASTEXITCODE." } } finally { Pop-Location }