/
githubmirror
/
sway
Обзор
Документация
Войти
/
githubmirror
/
sway
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
justfile
192 строки
7 KB
Igor Rončević
Extract all perf data from in-language tests run in parallel (#7670)
29 июн 2026, 22:44
Не верифицирован
29 июн 2026, 22:44
723a0b9
Код
Авторство
О чём код?
# list all available recipes default: just --list --unsorted [group('ci')] [confirm("Do you want to install cargo-sort, cargo-generate and cargo-udeps from crates.io?")] install-ci-check: cargo install cargo-sort cargo install cargo-generate cargo install cargo-udeps [group('ci')] ci-check: bash ./ci_checks.sh [group('automation')] [confirm("Do you want to bump all fuel maintained dependencies?")] update-fuel-dependencies: bash ./update_fuel_dependencies.sh [group('automation')] [confirm("Do you want to automatically update contractIds in this repo?")] update-contract-ids: bash ./test/update-contract-ids.sh [group('automation')] bisect-forc path command: bash ./scripts/bisect-forc/bisect-forc.sh "{{path}}" "{{command}}" # The `benchmark` group contains recipes related to benchmarking the Sway compiler, e.g., compilation times. [group('benchmark')] benchmark: bash ./benchmark.sh [group('benchmark')] benchmark-tests: bash ./test/bench.sh # The `performance` group contains recipes related to benchmarking the performance of compiled code: # gas usages and bytecode sizes. alias pe2e := perf-e2e # collect gas usages and bytecode sizes from E2E tests [group('performance')] perf-e2e filter='': cargo r -r -p test -- --release --kind e2e --perf-only --perf {{filter}} alias pil := perf-in-lang # collect gas usages and bytecode sizes from in-language tests [group('performance')] perf-in-lang filter='': #!/usr/bin/env bash branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null); [[ "$branch" == "HEAD" || -z "$branch" ]] && branch="unknown-branch"; branch=${branch//\//-}; ts="$(date '+%m%d%H%M%S')" gas_outfile="./test/perf_out/$ts-in-language-gas-usages-release-$branch.csv" size_outfile="./test/perf_out/$ts-in-language-bytecode-sizes-release-$branch.csv" filter_args=(); [[ -n "{{filter}}" ]] && filter_args=(--filter "{{filter}}"); # Capture the test run output once and feed it to both extractors, so the # (expensive) test run happens only once. tmp="$(mktemp)"; trap 'rm -f "$tmp"' EXIT ./test/src/in_language_tests/run_in_language_tests.sh --print-output "${filter_args[@]}" --release | tee /dev/stderr > "$tmp" ./scripts/perf/extract-gas-usages.sh < "$tmp" > "$gas_outfile" ./scripts/perf/extract-bytecode-sizes.sh < "$tmp" > "$size_outfile" echo "Gas usages written to: $gas_outfile" echo "Bytecode sizes written to: $size_outfile" alias pst := perf-storage # run storage benchmarks (storage fields and StorageVec), optionally filtered by project name substring [group('performance')] perf-storage filter='': ./test/src/e2e_vm_tests/test_programs/should_pass/storage_benchmarks/bench.sh "{{filter}}" alias pa := perf-all # collect gas usages and bytecode sizes from all tests (E2E, in-language, and storage) [group('performance')] perf-all filter='': (perf-e2e filter) (perf-in-lang filter) (perf-storage filter) alias pd := perf-diff # generate performance diff between two CSV files [group('performance')] perf-diff before after format='md': ./scripts/perf/perf-diff.sh "{{before}}" "{{after}}" "{{format}}" alias pds := perf-diff-stats # generate performance statistics summary from a `perf-diff` output CSV file [group('performance')] perf-diff-stats diff_file: cat "{{diff_file}}" | ./scripts/perf/perf-diff-stats.sh alias pdl := perf-diff-latest # generate performance diffs between the latest two CSV files per testing category [group('performance')] perf-diff-latest format='md': ./scripts/perf/perf-diff-latest.sh "{{format}}" # This recipe should be used on snapshot tests that contain gas usages from `forc test`. # It will extract gas usages from versions of the test's `stdout.snap` file # that are within of the `revision_range`, and output a CSV pivot table # or an interactive HTML report, depending on the `format`. # path: repo path to `stdout.snap` file to extract gas usage from, e.g.: `test/src/e2e_vm_tests/path_to/some_test/stdout.snap` # revision_range: Git revision range to consider when collecting historic gas usages, e.g.: `HEAD~10..HEAD` (default: all revisions) # format: output format, either `csv` or `html` (default: `csv`) # open: for `html` output, `-o` opens the report in the default browser alias psh := perf-snapshot-historical # collect historic gas usages from a snapshot test that has a `forc test` output [linux] [macos] [group('performance')] perf-snapshot-historical path revision_range='' format='csv' open='': #!/usr/bin/env bash if [[ "{{format}}" != "csv" && "{{format}}" != "html" ]]; then echo "ERROR: Invalid output format '{{format}}'. Output format must be either 'csv' or 'html'." exit 1 fi now_ts=$(date '+%m%d%H%M%S') outfile="./test/perf_out/$now_ts-snapshot-gas-usages-historical-$(basename "$(dirname "{{path}}")")" echo "test,gas,commit" > "$outfile.csv" for HASH in `git log --format='%H' {{revision_range}} -- {{path}}`; do TIMESTAMP=$(git show -s --format='%as-%ct-%H' "$HASH") git --no-pager show "$HASH:{{path}}" | bash -c "scripts/perf/extract-gas-usages.sh $TIMESTAMP" >> "$outfile.csv" done echo "Historical gas usages written to: $outfile.csv" if [ "{{format}}" = "html" ]; then ./scripts/csv2html/csv2html.sh "$outfile.csv" >> "$outfile.html" echo "Pivot table written to: $outfile.html" if [ -n "{{open}}" ]; then if which xdg-open &>> /dev/null then xdg-open "$outfile.html" elif which gnome-open &>> /dev/null then gnome-open "$outfile.html" fi fi else pivot_file="./test/perf_out/$now_ts-pivot-snapshot-gas-usages-historical-$(basename "$(dirname "{{path}}")")" clipivot max $outfile.csv --rows=test --cols=commit --val=gas > $pivot_file.csv echo "Pivot table written to: $pivot_file.csv" fi alias pl := perf-list # list all performance files (*gas-usages-*.* and *bytecode-sizes-*.*) [group('performance')] perf-list: find . -type f \( -name '*-gas-usages-*.*' -o -name '*-bytecode-sizes-*.*' \) -print | sort alias pr := perf-remove # remove all performance files (*gas-usages-*.* and *bytecode-sizes-*.*) [group('performance')] perf-remove: #!/usr/bin/env bash files=$(find . -type f \( -name '*-gas-usages-*.*' -o -name '*-bytecode-sizes-*.*' \) -print | sort) if [ -z "$files" ]; then echo "No performance data files to remove." exit 0 fi echo "The following performance data files will be removed:" echo "$files" echo read -r -p 'Do you want to proceed with removing? [y/N] ' yn if [[ $yn =~ ^[Yy]$ ]]; then echo "Removing..." find . -type f \( -name '*-gas-usages-*.*' -o -name '*-bytecode-sizes-*.*' \) -print -delete else echo "Removing canceled." fi [group('build')] build-prism: cd ./scripts/prism && ./build.sh [group('build')] build-highlightjs: cd ./scripts/highlightjs && ./build.sh [group('build')] generate-sway-lib-std: cd ./sway-lib-std && ./generate.sh [group('test')] test-forc-fmt-check-panic: cd ./scripts/formatter && ./forc-fmt-check-panic.sh