From f36581ed86dbcc90247098417084aaa9f84e1792 Mon Sep 17 00:00:00 2001 From: Juro Oravec Date: Sun, 23 Feb 2025 16:18:57 +0100 Subject: [PATCH] feat: benchmarking (#999) * feat: add benchmarking dashboard, CI hook on PR, and store lifetime results * refactor: change python env to 3.13 in benchmarks * refactor: add verbosity, use 3.11 for benchmarking * fix: OSError: [Errno 7] Argument list too long * refactor: add debug statements * refactor: remove extraneous -e * refactor: fix tests and linter errors * fix: track main package in coverage * refactor: fix test coverage testing * refactor: fix repo owner name in benchmark on pushing comment * refactor: add asv monkeypatch to docs workflow * refactor: temporarily allow building docs in forks * refactor: use py 3.13 for benchmarking * refactor: run only a single benchmark for PRs to speed them up * refactor: install asv in the docs build workflow * refactor: use hatch docs env to generate benhcmarks in docs CI * refactor: more trying * refactor: move tests * Add benchmark results for 0.137 * Trigger Build * Add benchmark results for 0.138 * refactor: set constant machine name when benchmarking * Add benchmark results for 0.139 * refactor: fix issue with paths too long * Add benchmark results for 0.140 * docs: update comment * refactor: remove test benchmarking data * refactor: fix comment * refactor: allow the benchmark workflow to write to PRs * refactor: use personal access token to set up the PR benchmark bot * refactor: split the benchmark PR flow into two to make it work with PRs from forks * refactor: update deprecated actions/upload-artifact@v3 to v4 * refactor: fix missing directory in benchmarking workflow * refactor: fix triggering of second workflow * refactor: fix workflow finally? * docs: add comments to cut-offs and direct people to benchmarks PR --------- Co-authored-by: github-actions --- .github/workflows/docs.yml | 107 +- .github/workflows/pr-benchmark-comment.yml | 98 + .github/workflows/pr-benchmark-generate.yml | 102 + .github/workflows/tests.yml | 10 + asv.conf.json | 210 + benchmarks/README.md | 195 + benchmarks/__init__.py | 0 benchmarks/assets/asv_dashboard.png | Bin 0 -> 328887 bytes benchmarks/benchmark_templating.py | 447 + benchmarks/component_rendering.py | 174 - benchmarks/monkeypatch_asv.py | 29 + benchmarks/monkeypatch_asv_ci.txt | 66 + benchmarks/test_lexer_performance.py | 195 - benchmarks/utils.py | 99 + docs/benchmarks/asv.css | 161 + docs/benchmarks/asv.js | 525 + docs/benchmarks/asv_ui.js | 231 + docs/benchmarks/error.html | 23 + docs/benchmarks/graphdisplay.js | 1427 ++ ...nts vs Django.peakmem_render_lg_first.json | 1 + ...s Django.peakmem_render_lg_subsequent.json | 1 + ...nts vs Django.peakmem_render_sm_first.json | 1 + ...s Django.peakmem_render_sm_subsequent.json | 1 + ...nts vs Django.timeraw_render_lg_first.json | 1 + ...s Django.timeraw_render_lg_subsequent.json | 1 + ...nts vs Django.timeraw_render_sm_first.json | 1 + ...s Django.timeraw_render_sm_subsequent.json | 1 + ...mponents vs Django.timeraw_startup_lg.json | 1 + .../Other.timeraw_import_time.json | 1 + ... django modes.peakmem_render_lg_first.json | 1 + ...go modes.peakmem_render_lg_subsequent.json | 1 + ... django modes.peakmem_render_sm_first.json | 1 + ...go modes.peakmem_render_sm_subsequent.json | 1 + ... django modes.timeraw_render_lg_first.json | 1 + ...go modes.timeraw_render_lg_subsequent.json | 1 + ... django modes.timeraw_render_sm_first.json | 1 + ...go modes.timeraw_render_sm_subsequent.json | 1 + ...ed vs django modes.timeraw_startup_lg.json | 1 + .../machine-ci-linux/python-3.13/summary.json | 1 + ...nts vs Django.peakmem_render_lg_first.json | 1 + ...s Django.peakmem_render_lg_subsequent.json | 1 + ...nts vs Django.peakmem_render_sm_first.json | 1 + ...s Django.peakmem_render_sm_subsequent.json | 1 + ...nts vs Django.timeraw_render_lg_first.json | 1 + ...s Django.timeraw_render_lg_subsequent.json | 1 + ...nts vs Django.timeraw_render_sm_first.json | 1 + ...s Django.timeraw_render_sm_subsequent.json | 1 + ...mponents vs Django.timeraw_startup_lg.json | 1 + .../summary/Other.timeraw_import_time.json | 1 + ... django modes.peakmem_render_lg_first.json | 1 + ...go modes.peakmem_render_lg_subsequent.json | 1 + ... django modes.peakmem_render_sm_first.json | 1 + ...go modes.peakmem_render_sm_subsequent.json | 1 + ... django modes.timeraw_render_lg_first.json | 1 + ...go modes.timeraw_render_lg_subsequent.json | 1 + ... django modes.timeraw_render_sm_first.json | 1 + ...go modes.timeraw_render_sm_subsequent.json | 1 + ...ed vs django modes.timeraw_startup_lg.json | 1 + docs/benchmarks/index.html | 161 + docs/benchmarks/index.json | 1 + docs/benchmarks/info.json | 4 + docs/benchmarks/jquery.flot.axislabels.js | 140 + docs/benchmarks/regressions.css | 44 + docs/benchmarks/regressions.js | 618 + docs/benchmarks/regressions.json | 1 + docs/benchmarks/regressions.xml | 2 + docs/benchmarks/summarygrid.js | 136 + docs/benchmarks/summarylist.css | 50 + docs/benchmarks/summarylist.js | 451 + docs/benchmarks/swallow.ico | Bin 0 -> 4286 bytes docs/benchmarks/swallow.png | Bin 0 -> 893 bytes docs/overview/code_of_conduct.md | 2 +- docs/overview/license.md | 2 +- docs/overview/performance.md | 8 + pyproject.toml | 2 +- requirements-ci.in | 3 +- requirements-dev.in | 5 +- requirements-docs.txt | 20 +- src/django_components/cache.py | 23 +- .../__snapshots__/test_benchmark_django.ambr | 13527 ++++++++++++++++ .../test_benchmark_django_small.ambr | 21 + tests/__snapshots__/test_benchmark_djc.ambr | 8590 ++++++++++ .../test_benchmark_djc_small.ambr | 21 + tests/test_benchmark_django.py | 6447 ++++++++ tests/test_benchmark_django_small.py | 348 + tests/test_benchmark_djc.py | 6060 +++++++ tests/test_benchmark_djc_small.py | 351 + tests/test_component.py | 15 +- tests/testutils.py | 62 +- tox.ini | 7 +- 90 files changed, 40817 insertions(+), 443 deletions(-) create mode 100644 .github/workflows/pr-benchmark-comment.yml create mode 100644 .github/workflows/pr-benchmark-generate.yml create mode 100644 asv.conf.json create mode 100644 benchmarks/README.md create mode 100644 benchmarks/__init__.py create mode 100644 benchmarks/assets/asv_dashboard.png create mode 100644 benchmarks/benchmark_templating.py delete mode 100644 benchmarks/component_rendering.py create mode 100644 benchmarks/monkeypatch_asv.py create mode 100644 benchmarks/monkeypatch_asv_ci.txt delete mode 100644 benchmarks/test_lexer_performance.py create mode 100644 benchmarks/utils.py create mode 100644 docs/benchmarks/asv.css create mode 100644 docs/benchmarks/asv.js create mode 100644 docs/benchmarks/asv_ui.js create mode 100644 docs/benchmarks/error.html create mode 100644 docs/benchmarks/graphdisplay.js create mode 100644 docs/benchmarks/graphs/branch-master/django-5.1/djc-core-html-parser/machine-ci-linux/python-3.13/Components vs Django.peakmem_render_lg_first.json create mode 100644 docs/benchmarks/graphs/branch-master/django-5.1/djc-core-html-parser/machine-ci-linux/python-3.13/Components vs Django.peakmem_render_lg_subsequent.json create mode 100644 docs/benchmarks/graphs/branch-master/django-5.1/djc-core-html-parser/machine-ci-linux/python-3.13/Components vs Django.peakmem_render_sm_first.json create mode 100644 docs/benchmarks/graphs/branch-master/django-5.1/djc-core-html-parser/machine-ci-linux/python-3.13/Components vs Django.peakmem_render_sm_subsequent.json create mode 100644 docs/benchmarks/graphs/branch-master/django-5.1/djc-core-html-parser/machine-ci-linux/python-3.13/Components vs Django.timeraw_render_lg_first.json create mode 100644 docs/benchmarks/graphs/branch-master/django-5.1/djc-core-html-parser/machine-ci-linux/python-3.13/Components vs Django.timeraw_render_lg_subsequent.json create mode 100644 docs/benchmarks/graphs/branch-master/django-5.1/djc-core-html-parser/machine-ci-linux/python-3.13/Components vs Django.timeraw_render_sm_first.json create mode 100644 docs/benchmarks/graphs/branch-master/django-5.1/djc-core-html-parser/machine-ci-linux/python-3.13/Components vs Django.timeraw_render_sm_subsequent.json create mode 100644 docs/benchmarks/graphs/branch-master/django-5.1/djc-core-html-parser/machine-ci-linux/python-3.13/Components vs Django.timeraw_startup_lg.json create mode 100644 docs/benchmarks/graphs/branch-master/django-5.1/djc-core-html-parser/machine-ci-linux/python-3.13/Other.timeraw_import_time.json create mode 100644 docs/benchmarks/graphs/branch-master/django-5.1/djc-core-html-parser/machine-ci-linux/python-3.13/isolated vs django modes.peakmem_render_lg_first.json create mode 100644 docs/benchmarks/graphs/branch-master/django-5.1/djc-core-html-parser/machine-ci-linux/python-3.13/isolated vs django modes.peakmem_render_lg_subsequent.json create mode 100644 docs/benchmarks/graphs/branch-master/django-5.1/djc-core-html-parser/machine-ci-linux/python-3.13/isolated vs django modes.peakmem_render_sm_first.json create mode 100644 docs/benchmarks/graphs/branch-master/django-5.1/djc-core-html-parser/machine-ci-linux/python-3.13/isolated vs django modes.peakmem_render_sm_subsequent.json create mode 100644 docs/benchmarks/graphs/branch-master/django-5.1/djc-core-html-parser/machine-ci-linux/python-3.13/isolated vs django modes.timeraw_render_lg_first.json create mode 100644 docs/benchmarks/graphs/branch-master/django-5.1/djc-core-html-parser/machine-ci-linux/python-3.13/isolated vs django modes.timeraw_render_lg_subsequent.json create mode 100644 docs/benchmarks/graphs/branch-master/django-5.1/djc-core-html-parser/machine-ci-linux/python-3.13/isolated vs django modes.timeraw_render_sm_first.json create mode 100644 docs/benchmarks/graphs/branch-master/django-5.1/djc-core-html-parser/machine-ci-linux/python-3.13/isolated vs django modes.timeraw_render_sm_subsequent.json create mode 100644 docs/benchmarks/graphs/branch-master/django-5.1/djc-core-html-parser/machine-ci-linux/python-3.13/isolated vs django modes.timeraw_startup_lg.json create mode 100644 docs/benchmarks/graphs/branch-master/django-5.1/djc-core-html-parser/machine-ci-linux/python-3.13/summary.json create mode 100644 docs/benchmarks/graphs/summary/Components vs Django.peakmem_render_lg_first.json create mode 100644 docs/benchmarks/graphs/summary/Components vs Django.peakmem_render_lg_subsequent.json create mode 100644 docs/benchmarks/graphs/summary/Components vs Django.peakmem_render_sm_first.json create mode 100644 docs/benchmarks/graphs/summary/Components vs Django.peakmem_render_sm_subsequent.json create mode 100644 docs/benchmarks/graphs/summary/Components vs Django.timeraw_render_lg_first.json create mode 100644 docs/benchmarks/graphs/summary/Components vs Django.timeraw_render_lg_subsequent.json create mode 100644 docs/benchmarks/graphs/summary/Components vs Django.timeraw_render_sm_first.json create mode 100644 docs/benchmarks/graphs/summary/Components vs Django.timeraw_render_sm_subsequent.json create mode 100644 docs/benchmarks/graphs/summary/Components vs Django.timeraw_startup_lg.json create mode 100644 docs/benchmarks/graphs/summary/Other.timeraw_import_time.json create mode 100644 docs/benchmarks/graphs/summary/isolated vs django modes.peakmem_render_lg_first.json create mode 100644 docs/benchmarks/graphs/summary/isolated vs django modes.peakmem_render_lg_subsequent.json create mode 100644 docs/benchmarks/graphs/summary/isolated vs django modes.peakmem_render_sm_first.json create mode 100644 docs/benchmarks/graphs/summary/isolated vs django modes.peakmem_render_sm_subsequent.json create mode 100644 docs/benchmarks/graphs/summary/isolated vs django modes.timeraw_render_lg_first.json create mode 100644 docs/benchmarks/graphs/summary/isolated vs django modes.timeraw_render_lg_subsequent.json create mode 100644 docs/benchmarks/graphs/summary/isolated vs django modes.timeraw_render_sm_first.json create mode 100644 docs/benchmarks/graphs/summary/isolated vs django modes.timeraw_render_sm_subsequent.json create mode 100644 docs/benchmarks/graphs/summary/isolated vs django modes.timeraw_startup_lg.json create mode 100644 docs/benchmarks/index.html create mode 100644 docs/benchmarks/index.json create mode 100644 docs/benchmarks/info.json create mode 100644 docs/benchmarks/jquery.flot.axislabels.js create mode 100644 docs/benchmarks/regressions.css create mode 100644 docs/benchmarks/regressions.js create mode 100644 docs/benchmarks/regressions.json create mode 100644 docs/benchmarks/regressions.xml create mode 100644 docs/benchmarks/summarygrid.js create mode 100644 docs/benchmarks/summarylist.css create mode 100644 docs/benchmarks/summarylist.js create mode 100644 docs/benchmarks/swallow.ico create mode 100644 docs/benchmarks/swallow.png create mode 100644 docs/overview/performance.md create mode 100644 tests/__snapshots__/test_benchmark_django.ambr create mode 100644 tests/__snapshots__/test_benchmark_django_small.ambr create mode 100644 tests/__snapshots__/test_benchmark_djc.ambr create mode 100644 tests/__snapshots__/test_benchmark_djc_small.ambr create mode 100644 tests/test_benchmark_django.py create mode 100644 tests/test_benchmark_django_small.py create mode 100644 tests/test_benchmark_djc.py create mode 100644 tests/test_benchmark_djc_small.py diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 1dbcbb1a..b544edb3 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -9,11 +9,6 @@ on: - '[0-9]+.[0-9]+.[0-9]+' branches: - master - pull_request: - branches: - - main - release: - types: [published] workflow_dispatch: jobs: @@ -27,30 +22,116 @@ jobs: # Only run in original repo (not in forks) if: github.repository == 'django-components/django-components' steps: + + ############################## + # SETUP + ############################## + - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 + - name: Set up Python uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.13" + cache: 'pip' - name: Install Hatch run: | python -m pip install --upgrade pip wheel - python -m pip install -q hatch pre-commit + python -m pip install -q hatch pre-commit asv hatch --version - - name: Create Virtual Environment - run: hatch env create docs - - name: Configure git run: | + # Get the master branch so we can run benchmarks on it + git remote add upstream https://github.com/${{ github.repository }}.git + git fetch origin master:master + git checkout master + # required for "mike deploy" command below which pushes to gh-pages git config user.name github-actions git config user.email github-actions@github.com + ########################################### + # RECORD BENCHMARK - ONLY ON PUSH TO MASTER + ########################################### + + - name: Run benchmarks for tag + if: github.ref_type == 'tag' && github.event_name == 'push' + run: | + # Get tag name + TAG=${GITHUB_REF#refs/tags/} + echo "TAG: $TAG" + + # TODO: REMOVE ONCE FIXED UPSTREAM + # Fix for https://github.com/airspeed-velocity/asv_runner/issues/45 + # Prepare virtual environment + # Currently, we have to monkeypatch the `timeit` function in the `timeraw` benchmark. + # The problem is that `asv` passes the code to execute via command line, and when the + # code is too big, it fails with `OSError: [Errno 7] Argument list too long`. + # So we have to tweak it to pass the code via STDIN, which doesn't have this limitation. + # + # 1. First create the virtual environment, so that asv generates the directories where + # the monkeypatch can be applied. + echo "Creating virtual environment..." + asv setup -v || true + echo "Virtual environment created." + # 2. Now let's apply the monkeypatch by appending it to the `timeraw.py` files. + # First find all `timeraw.py` files + echo "Applying monkeypatch..." + find .asv/env -type f -path "*/site-packages/asv_runner/benchmarks/timeraw.py" | while read -r file; do + # Add a newline and then append the monkeypatch contents + echo "" >> "$file" + cat "benchmarks/monkeypatch_asv_ci.txt" >> "$file" + done + echo "Monkeypatch applied." + # END OF MONKEYPATCH + + # Prepare the profile under which the benchmarks will be saved. + # We assume that the CI machine has a name that is unique and stable. + # See https://github.com/airspeed-velocity/asv/issues/796#issuecomment-1188431794 + echo "Preparing benchmarks profile..." + asv machine --yes --machine ci-linux + echo "Benchmarks profile DONE." + + # Run benchmarks for the current tag + # - `^` means that we mean the COMMIT of the tag's branch, not the BRANCH itself. + # Without it, we would run benchmarks for the whole branch history. + # With it, we run benchmarks FROM the tag's commit (incl) TO ... + # - `!` means that we want to select range spanning a single commit. + # Without it, we would run benchmarks for all commits FROM the tag's commit + # TO the start of the branch history. + # With it, we run benchmarks ONLY FOR the tag's commit. + echo "Running benchmarks for tag ${TAG}..." + asv run master^! -v + echo "Benchmarks for tag ${TAG} DONE." + + # Generate benchmarks site + # This should save it in `docs/benchmarks/`, so we can then use it when + # building docs site with `mkdocs`. + echo "Generating benchmarks site..." + asv publish + echo "Benchmarks site DONE." + + # Stage and commit benchmark results + echo "Staging and committing benchmark results..." + git add .asv/results/ + git add docs/benchmarks/ + git commit -m "Add benchmark results for ${TAG}" + echo "Benchmark results committed." + git push origin master + echo "Benchmark results pushed to master." + + ############################## + # BUILD & DEPLOY DOCS + ############################## + + - name: Create Virtual Environment + run: hatch env create docs + # Conditions make sure to select the right step, depending on the job trigger. # Only one of the steps below will run at a time. The others will be skipped. @@ -72,9 +153,3 @@ jobs: run: | hatch run docs:mike deploy --push --update-aliases ${{ github.ref_name }} latest hatch run docs:mike set-default latest --push - - - name: Build & deploy docs for a new release - if: github.event_name == 'release' - run: | - hatch run docs:mike deploy --push --update-aliases ${{ github.ref_name }} latest - hatch run docs:mike set-default latest --push diff --git a/.github/workflows/pr-benchmark-comment.yml b/.github/workflows/pr-benchmark-comment.yml new file mode 100644 index 00000000..07b9de16 --- /dev/null +++ b/.github/workflows/pr-benchmark-comment.yml @@ -0,0 +1,98 @@ +# Run benchmark report on pull requests to master. +# The report is added to the PR as a comment. +# +# NOTE: When making a PR from a fork, the worker doesn't have sufficient +# access to make comments on the target repo's PR. And so, this workflow +# is split to two parts: +# +# 1. Benchmarking and saving results as artifacts +# 2. Downloading the results and commenting on the PR +# +# See https://stackoverflow.com/a/71683208/9788634 + +name: PR benchmark comment + +on: + workflow_run: + # NOTE: The name here MUST match the name of the workflow that generates the data + workflows: [PR benchmarks generate] + types: + - completed + +jobs: + download: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + repository-projects: write + steps: + ########## USE FOR DEBUGGING ########## + # - name: Debug workflow run info + # uses: actions/github-script@v7 + # with: + # script: | + # console.log('Workflow Run ID:', context.payload.workflow_run.id); + # const artifacts = await github.rest.actions.listWorkflowRunArtifacts({ + # owner: context.repo.owner, + # repo: context.repo.repo, + # run_id: context.payload.workflow_run.id + # }); + # console.log('Available artifacts:'); + # console.log(JSON.stringify(artifacts.data, null, 2)); + # console.log(`PRs: ` + JSON.stringify(context.payload.workflow_run.pull_requests)); + ######################################### + + # NOTE: The next two steps (download and unzip) are equivalent to using `actions/download-artifact@v4` + # However, `download-artifact` was not picking up the artifact, while the REST client does. + - name: Download benchmark results + uses: actions/github-script@v7 + with: + script: | + const fs = require('fs'); + + // Find the artifact that was generated by the "pr-benchmark-generate" workflow + const allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({ + owner: context.repo.owner, + repo: context.repo.repo, + // Explicitly search the workflow run that generated the the results + // (AKA the "pr-benchmark-generate" workflow). + run_id: context.payload.workflow_run.id, + }); + const matchArtifact = allArtifacts.data.artifacts.filter((artifact) => { + return artifact.name == "benchmark_results" + })[0]; + + // Download the artifact + const download = await github.rest.actions.downloadArtifact({ + owner: context.repo.owner, + repo: context.repo.repo, + artifact_id: matchArtifact.id, + archive_format: 'zip', + }); + fs.writeFileSync( + `${process.env.GITHUB_WORKSPACE}/benchmark_results.zip`, + Buffer.from(download.data), + ); + + - name: Unzip artifact + run: unzip benchmark_results.zip + + - name: Comment on PR + # See https://github.com/actions/github-script + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const fs = require('fs'); + const results = fs.readFileSync('./benchmark_results.md', 'utf8'); + const body = `## Performance Benchmark Results\n\nComparing PR changes against master branch:\n\n${results}`; + + // See https://octokit.github.io/rest.js/v21/#issues-create-comment + await github.rest.issues.createComment({ + body: body, + // See https://github.com/actions/toolkit/blob/662b9d91f584bf29efbc41b86723e0e376010e41/packages/github/src/context.ts#L66 + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.payload.workflow_run.pull_requests[0].number, + }); diff --git a/.github/workflows/pr-benchmark-generate.yml b/.github/workflows/pr-benchmark-generate.yml new file mode 100644 index 00000000..5e198200 --- /dev/null +++ b/.github/workflows/pr-benchmark-generate.yml @@ -0,0 +1,102 @@ +# Run benchmark report on pull requests to master. +# The report is added to the PR as a comment. +# +# NOTE: When making a PR from a fork, the worker doesn't have sufficient +# access to make comments on the target repo's PR. And so, this workflow +# is split to two parts: +# +# 1. Benchmarking and saving results as artifacts +# 2. Downloading the results and commenting on the PR +# +# See https://stackoverflow.com/a/71683208/9788634 + +name: PR benchmarks generate + +on: + pull_request: + branches: [ master ] + +jobs: + benchmark: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # Need full history for ASV + + - name: Fetch base branch + run: | + git remote add upstream https://github.com/${{ github.repository }}.git + git fetch upstream master + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.13' + cache: 'pip' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install asv + + - name: Run benchmarks + run: | + # TODO: REMOVE ONCE FIXED UPSTREAM + # Fix for https://github.com/airspeed-velocity/asv_runner/issues/45 + # Prepare virtual environment + # Currently, we have to monkeypatch the `timeit` function in the `timeraw` benchmark. + # The problem is that `asv` passes the code to execute via command line, and when the + # code is too big, it fails with `OSError: [Errno 7] Argument list too long`. + # So we have to tweak it to pass the code via STDIN, which doesn't have this limitation. + # + # 1. First create the virtual environment, so that asv generates the directories where + # the monkeypatch can be applied. + echo "Creating virtual environment..." + asv setup -v || true + echo "Virtual environment created." + # 2. Now let's apply the monkeypatch by appending it to the `timeraw.py` files. + # First find all `timeraw.py` files + echo "Applying monkeypatch..." + find .asv/env -type f -path "*/site-packages/asv_runner/benchmarks/timeraw.py" | while read -r file; do + # Add a newline and then append the monkeypatch contents + echo "" >> "$file" + cat "benchmarks/monkeypatch_asv_ci.txt" >> "$file" + done + echo "Monkeypatch applied." + # END OF MONKEYPATCH + + # Prepare the profile under which the benchmarks will be saved. + # We assume that the CI machine has a name that is unique and stable. + # See https://github.com/airspeed-velocity/asv/issues/796#issuecomment-1188431794 + echo "Preparing benchmarks profile..." + asv machine --yes + echo "Benchmarks profile DONE." + + # Generate benchmark data + # - `^` means that we mean the COMMIT of the branch, not the BRANCH itself. + # Without it, we would run benchmarks for the whole branch history. + # With it, we run benchmarks FROM the latest commit (incl) TO ... + # - `!` means that we want to select range spanning a single commit. + # Without it, we would run benchmarks for all commits FROM the latest commit + # TO the start of the branch history. + # With it, we run benchmarks ONLY FOR the latest commit. + echo "Running benchmarks for upstream/master..." + DJC_BENCHMARK_QUICK=1 asv run upstream/master^! -v + echo "Benchmarks for upstream/master DONE." + echo "Running benchmarks for HEAD..." + DJC_BENCHMARK_QUICK=1 asv run HEAD^! -v + echo "Benchmarks for HEAD DONE." + + # Compare against master + echo "Comparing benchmarks..." + mkdir -p pr + asv compare upstream/master HEAD --factor 1.1 --split > ./pr/benchmark_results.md + echo "Benchmarks comparison DONE." + + - name: Save benchmark results + uses: actions/upload-artifact@v4 + with: + name: benchmark_results + path: pr/ diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index f1506e21..ee01f9ec 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -17,6 +17,16 @@ jobs: os: [ubuntu-20.04, windows-latest] steps: + # Configure git to handle long paths + # See https://stackoverflow.com/questions/22575662/filename-too-long-in-git-for-windows + # + # Long paths that are over the limit are because of the benchmarking data + # created by asv, as these may look like this: + # docs/benchmarks/graphs/arch-x86_64/branch-master/cpu-AMD EPYC 7763 64-Core Processor/django-5.1/djc-core-html-parser/machine-fv-az1693-854/num_cpu-4/os-Linux 6.8.0-1021-azure/python-3.13/ram-16373792/isolated vs django modes.timeraw_render_lg_subsequent.json + - name: Configure git + run: | + git config --global core.longpaths true + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} diff --git a/asv.conf.json b/asv.conf.json new file mode 100644 index 00000000..0ae16e29 --- /dev/null +++ b/asv.conf.json @@ -0,0 +1,210 @@ +{ + // The version of the config file format. Do not change, unless + // you know what you are doing + "version": 1, + + // The name of the project being benchmarked + "project": "django-components", + + // The project's homepage + // "project_url": "https://django-components.github.io/django-components/", + "project_url": "/django-components/", // Relative path, since benchmarks are nested under the docs site + + // The URL or local path of the source code repository for the + // project being benchmarked + "repo": ".", + + // The Python project's subdirectory in your repo. If missing or + // the empty string, the project is assumed to be located at the root + // of the repository. + // "repo_subdir": "", + + // Customizable commands for building the project. + // See asv.conf.json documentation. + // To build the package using pyproject.toml (PEP518), uncomment the following lines + // "build_command": [ + // "python -m pip install build", + // "python -m build", + // "python -mpip wheel -w {build_cache_dir} {build_dir}" + // ], + // To build the package using setuptools and a setup.py file, uncomment the following lines + // "build_command": [ + // "python setup.py build", + // "python -mpip wheel -w {build_cache_dir} {build_dir}" + // ], + + // Customizable commands for installing and uninstalling the project. + // See asv.conf.json documentation. + // "install_command": ["in-dir={env_dir} python -mpip install {wheel_file}"], + // "uninstall_command": ["return-code=any python -mpip uninstall -y {project}"], + "install_command": ["in-dir={env_dir} python -mpip install ./project"], + + // List of branches to benchmark. If not provided, defaults to "main" + // (for git) or "default" (for mercurial). + // "branches": ["main"], // for git + // "branches": ["default"], // for mercurial + "branches": [ + "master" + ], + + // The DVCS being used. If not set, it will be automatically + // determined from "repo" by looking at the protocol in the URL + // (if remote), or by looking for special directories, such as + // ".git" (if local). + // "dvcs": "git", + + // The tool to use to create environments. May be "conda", + // "virtualenv", "mamba" (above 3.8) + // or other value depending on the plugins in use. + // If missing or the empty string, the tool will be automatically + // determined by looking for tools on the PATH environment + // variable. + "environment_type": "virtualenv", + + // timeout in seconds for installing any dependencies in environment + // defaults to 10 min + //"install_timeout": 600, + + // the base URL to show a commit for the project. + // "show_commit_url": "http://github.com/owner/project/commit/", + + // The Pythons you'd like to test against. If not provided, defaults + // to the current version of Python used to run `asv`. + "pythons": [ + "3.13" + ], + + // The list of conda channel names to be searched for benchmark + // dependency packages in the specified order + // "conda_channels": ["conda-forge", "defaults"], + + // A conda environment file that is used for environment creation. + // "conda_environment_file": "environment.yml", + + // The matrix of dependencies to test. Each key of the "req" + // requirements dictionary is the name of a package (in PyPI) and + // the values are version numbers. An empty list or empty string + // indicates to just test against the default (latest) + // version. null indicates that the package is to not be + // installed. If the package to be tested is only available from + // PyPi, and the 'environment_type' is conda, then you can preface + // the package name by 'pip+', and the package will be installed + // via pip (with all the conda available packages installed first, + // followed by the pip installed packages). + // + // The ``@env`` and ``@env_nobuild`` keys contain the matrix of + // environment variables to pass to build and benchmark commands. + // An environment will be created for every combination of the + // cartesian product of the "@env" variables in this matrix. + // Variables in "@env_nobuild" will be passed to every environment + // during the benchmark phase, but will not trigger creation of + // new environments. A value of ``null`` means that the variable + // will not be set for the current combination. + // + // "matrix": { + // "req": { + // "numpy": ["1.6", "1.7"], + // "six": ["", null], // test with and without six installed + // "pip+emcee": [""] // emcee is only available for install with pip. + // }, + // "env": {"ENV_VAR_1": ["val1", "val2"]}, + // "env_nobuild": {"ENV_VAR_2": ["val3", null]}, + // }, + "matrix": { + "req": { + "django": [ + "5.1" + ], + "djc-core-html-parser": [""] // Empty string means the latest version + } + }, + + // Combinations of libraries/python versions can be excluded/included + // from the set to test. Each entry is a dictionary containing additional + // key-value pairs to include/exclude. + // + // An exclude entry excludes entries where all values match. The + // values are regexps that should match the whole string. + // + // An include entry adds an environment. Only the packages listed + // are installed. The 'python' key is required. The exclude rules + // do not apply to includes. + // + // In addition to package names, the following keys are available: + // + // - python + // Python version, as in the *pythons* variable above. + // - environment_type + // Environment type, as above. + // - sys_platform + // Platform, as in sys.platform. Possible values for the common + // cases: 'linux2', 'win32', 'cygwin', 'darwin'. + // - req + // Required packages + // - env + // Environment variables + // - env_nobuild + // Non-build environment variables + // + // "exclude": [ + // {"python": "3.2", "sys_platform": "win32"}, // skip py3.2 on windows + // {"environment_type": "conda", "req": {"six": null}}, // don't run without six on conda + // {"env": {"ENV_VAR_1": "val2"}}, // skip val2 for ENV_VAR_1 + // ], + // + // "include": [ + // // additional env for python3.12 + // {"python": "3.12", "req": {"numpy": "1.26"}, "env_nobuild": {"FOO": "123"}}, + // // additional env if run on windows+conda + // {"platform": "win32", "environment_type": "conda", "python": "3.12", "req": {"libpython": ""}}, + // ], + + // The directory (relative to the current directory) that benchmarks are + // stored in. If not provided, defaults to "benchmarks" + "benchmark_dir": "benchmarks", + + // The directory (relative to the current directory) to cache the Python + // environments in. If not provided, defaults to "env" + "env_dir": ".asv/env", + + // The directory (relative to the current directory) that raw benchmark + // results are stored in. If not provided, defaults to "results". + "results_dir": ".asv/results", + + // The directory (relative to the current directory) that the html tree + // should be written to. If not provided, defaults to "html". + // "html_dir": ".asv/html", + "html_dir": "docs/benchmarks", // # TODO + + // The number of characters to retain in the commit hashes. + // "hash_length": 8, + + // `asv` will cache results of the recent builds in each + // environment, making them faster to install next time. This is + // the number of builds to keep, per environment. + // "build_cache_size": 2, + + // The commits after which the regression search in `asv publish` + // should start looking for regressions. Dictionary whose keys are + // regexps matching to benchmark names, and values corresponding to + // the commit (exclusive) after which to start looking for + // regressions. The default is to start from the first commit + // with results. If the commit is `null`, regression detection is + // skipped for the matching benchmark. + // + // "regressions_first_commits": { + // "some_benchmark": "352cdf", // Consider regressions only after this commit + // "another_benchmark": null, // Skip regression detection altogether + // }, + + // The thresholds for relative change in results, after which `asv + // publish` starts reporting regressions. Dictionary of the same + // form as in ``regressions_first_commits``, with values + // indicating the thresholds. If multiple entries match, the + // maximum is taken. If no entry matches, the default is 5%. + // + // "regressions_thresholds": { + // "some_benchmark": 0.01, // Threshold of 1% + // "another_benchmark": 0.5, // Threshold of 50% + // }, +} diff --git a/benchmarks/README.md b/benchmarks/README.md new file mode 100644 index 00000000..4ef8dc8d --- /dev/null +++ b/benchmarks/README.md @@ -0,0 +1,195 @@ +# Benchmarks + +## Overview + +[`asv`](https://github.com/airspeed-velocity/) (Airspeed Velocity) is used for benchmarking performance. + +`asv` covers the entire benchmarking workflow. We can: + +1. Define benchmark tests similarly to writing pytest tests (supports both timing and memory benchmarks) +2. Run the benchmarks and generate results for individual git commits, tags, or entire branches +3. View results as an HTML report (dashboard with charts) +4. Compare performance between two commits / tags / branches for CI integration + +![asv dashboard](./assets/asv_dashboard.png) + +django-components uses `asv` for these use cases: + +- Benchmarking across releases: + + 1. When a git tag is created and pushed, this triggers a Github Action workflow (see `docs.yml`). + 2. The workflow runs the benchmarks with the latest release, and commits the results to the repository. + Thus, we can see how performance changes across releases. + +- Displaying performance results on the website: + + 1. When a git tag is created and pushed, we also update the documentation website (see `docs.yml`). + 2. Before we publish the docs website, we generate the HTML report for the benchmark results. + 3. The generated report is placed in the `docs/benchmarks/` directory, and is thus + published with the rest of the docs website and available under [`/benchmarks/`](https://django-components.github.io/django-components/benchmarks). + - NOTE: The location where the report is placed is defined in `asv.conf.json`. + +- Compare performance between commits on pull requests: + 1. When a pull request is made, this triggers a Github Action workflow (see `benchmark.yml`). + 2. The workflow compares performance between commits. + 3. The report is added to the PR as a comment made by a bot. + +## Interpreting benchmarks + +The results CANNOT be taken as ABSOLUTE values e.g.: + +"This example took 200ms to render, so my page will also take 200ms to render." + +Each UI may consist of different number of Django templates, template tags, and components, and all these may influence the rendering time differently. + +Instead, the results MUST be understood as RELATIVE values. + +- If a commit is 10% slower than the master branch, that's valid. +- If Django components are 10% slower than vanilla Django templates, that's valid. +- If "isolated" mode is 10% slower than "django" mode, that's valid. + +## Development + +Let's say we want to generate results for the last 5 commits. + +1. Install `asv` + + ```bash + pip install asv + ``` + +2. Run benchmarks and generate results + + ```bash + asv run HEAD --steps 5 -e + ``` + + - `HEAD` means that we want to run benchmarks against the [current branch](https://stackoverflow.com/a/2304106/9788634). + - `--steps 5` means that we want to run benchmarks for the last 5 commits. + - `-e` to print out any errors. + + The results will be stored in `.asv/results/`, as configured in `asv.conf.json`. + +3. Generate HTML report + + ```bash + asv publish + asv preview + ``` + + - `publish` generates the HTML report and stores it in `docs/benchmarks/`, as configured in `asv.conf.json`. + - `preview` starts a local server and opens the report in the browser. + + NOTE: Since the results are stored in `docs/benchmarks/`, you can also view the results + with `mkdocs serve` and navigating to `http://localhost:9000/django-components/benchmarks/`. + + NOTE 2: Running `publish` will overwrite the existing contents of `docs/benchmarks/`. + +## Writing benchmarks + +`asv` supports writing different [types of benchmarks](https://asv.readthedocs.io/en/latest/writing_benchmarks.html#benchmark-types). What's relevant for us is: + +- [Raw timing benchmarks](https://asv.readthedocs.io/en/latest/writing_benchmarks.html#raw-timing-benchmarks) +- [Peak memory benchmarks](https://asv.readthedocs.io/en/latest/writing_benchmarks.html#peak-memory) + +Notes: + +- The difference between "raw timing" and "timing" tests is that "raw timing" is ran in a separate process. + And instead of running the logic within the test function itself, we return a script (string) + that will be executed in the separate process. + +- The difference between "peak memory" and "memory" tests is that "memory" calculates the memory + of the object returned from the test function. On the other hand, "peak memory" detects the + peak memory usage during the execution of the test function (including the setup function). + +You can write the test file anywhere in the `benchmarks/` directory, `asv` will automatically find it. + +Inside the file, write a test function. Depending on the type of the benchmark, +prefix the test function name with `timeraw_` or `peakmem_`. See [`benchmarks/benchmark_templating.py`](benchmark_templating.py) for examples. + +### Ensuring that the benchmarked logic is correct + +The approach I (Juro) took with benchmarking the overall template rendering is that +I've defined the actual logic in `tests/test_benchmark_*.py` files. So those files +are part of the normal pytest testing, and even contain a section with pytest tests. + +This ensures that the benchmarked logic remains functional and error-free. + +However, there's some caveats: + +1. I wasn't able to import files from `tests/`. +2. When running benchmarks, we don't want to run the pytest tests. + +To work around that, the approach I used for loading the files from the `tests/` directory is to: + +1. Get the file's source code as a string. +2. Cut out unwanted sections (like the pytest tests). +3. Append the benchmark-specific code to the file (e.g. to actually render the templates). +4. In case of "timeraw" benchmarks, we can simply return the remaining code as a string + to be run in a separate process. +5. In case of "peakmem" benchmarks, we need to access this modified source code as Python objects. + So the code is made available as a "virtual" module, which makes it possible to import Python objects like so: + ```py + from my_virtual_module import run_my_benchmark + ``` + +## Using `asv` + +### Compare latest commit against master + +Note: Before comparing, you must run the benchmarks first to generate the results. The `continuous` command does not generate the results by itself. + +```bash +asv continuous master^! HEAD^! --factor 1.1 +``` + +- Factor of `1.1` means that the new commit is allowed to be 10% slower/faster than the master commit. + +- `^` means that we mean the COMMIT of the branch, not the BRANCH itself. + + Without it, we would run benchmarks for the whole branch history. + + With it, we run benchmarks FROM the latest commit (incl) TO ... + +- `!` means that we want to select range spanning a single commit. + + Without it, we would run benchmarks for all commits FROM the latest commit + TO the start of the branch history. + + With it, we run benchmarks ONLY FOR the latest commit. + +### More Examples + +Notes: + +- Use `~1` to select the second-latest commit, `~2` for the third-latest, etc.. + +Generate benchmarks for the latest commit in `master` branch. + +```bash +asv run master^! +``` + +Generate benchmarks for second-latest commit in `master` branch. + +```bash +asv run master~1^! +``` + +Generate benchmarks for all commits in `master` branch. + +```bash +asv run master +``` + +Generate benchmarks for all commits in `master` branch, but exclude the latest commit. + +```bash +asv run master~1 +``` + +Generate benchmarks for the LAST 5 commits in `master` branch, but exclude the latest commit. + +```bash +asv run master~1 --steps 5 +``` diff --git a/benchmarks/__init__.py b/benchmarks/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/benchmarks/assets/asv_dashboard.png b/benchmarks/assets/asv_dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..524990b8f9b13513e0dfc25ec734b4b7699a1543 GIT binary patch literal 328887 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˕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

tAH+y8pdbNsO$^5C!@E# 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 z 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 Path: + if renderer == "none": + raise ValueError("Cannot get filepath for renderer 'none'") + elif renderer not in ["django", "django-components"]: + raise ValueError(f"Invalid renderer: {renderer}") + + if size not in ("lg", "sm"): + raise ValueError(f"Invalid size: {size}, must be one of ('lg', 'sm')") + + # At this point, we know the renderer is either "django" or "django-components" + root = file_path = Path(__file__).parent.parent + if renderer == "django": + if size == "lg": + file_path = root / "tests" / "test_benchmark_django.py" + else: + file_path = root / "tests" / "test_benchmark_django_small.py" + else: + if size == "lg": + file_path = root / "tests" / "test_benchmark_djc.py" + else: + file_path = root / "tests" / "test_benchmark_djc_small.py" + + return file_path + + +def _get_templating_script( + renderer: TemplatingRenderer, + size: TemplatingTestSize, + context_mode: DjcContextMode, + imports_only: bool, +) -> str: + if renderer == "none": + return "" + elif renderer not in ["django", "django-components"]: + raise ValueError(f"Invalid renderer: {renderer}") + + # At this point, we know the renderer is either "django" or "django-components" + file_path = _get_templating_filepath(renderer, size) + contents = file_path.read_text() + + # The files with benchmarked code also have a section for testing them with pytest. + # We remove that pytest section, so the script is only the benchmark code. + contents = contents.split("# ----------- TESTS START ------------ #")[0] + + if imports_only: + # There is a benchmark test for measuring the time it takes to import the module. + # For that, we exclude from the code everything AFTER this line + contents = contents.split("# ----------- IMPORTS END ------------ #")[0] + else: + # Set the context mode by replacing variable in the script + contents = re.sub(r"CONTEXT_MODE.*?\n", f"CONTEXT_MODE = '{context_mode}'\n", contents, count=1) + + return contents + + +def _get_templating_module( + renderer: TemplatingRenderer, + size: TemplatingTestSize, + context_mode: DjcContextMode, + imports_only: bool, +) -> ModuleType: + if renderer not in ("django", "django-components"): + raise ValueError(f"Invalid renderer: {renderer}") + + file_path = _get_templating_filepath(renderer, size) + script = _get_templating_script(renderer, size, context_mode, imports_only) + + # This makes it possible to import the module in the benchmark function + # as `import test_templating` + module = create_virtual_module("test_templating", script, str(file_path)) + return module + + +# The `timeraw_` tests run in separate processes. But when running memory benchmarks, +# the tested logic runs in the same process as the where we run the benchmark functions +# (e.g. `peakmem_render_lg_first()`). Thus, the `peakmem_` functions have access to this file +# when the tested logic runs. +# +# Secondly, `asv` doesn't offer any way to pass data from `setup` to actual test. +# +# And so we define this global, which, when running memory benchmarks, the `setup` function +# populates. And then we trigger the actual render from within the test body. +do_render = lambda: None # noqa: E731 + + +def setup_templating_memory_benchmark( + renderer: TemplatingRenderer, + size: TemplatingTestSize, + test_type: TemplatingTestType, + context_mode: DjcContextMode, + imports_only: bool = False, +): + global do_render + module = _get_templating_module(renderer, size, context_mode, imports_only) + data = module.gen_render_data() + render = module.render + do_render = lambda: render(data) # noqa: E731 + + # Do the first render as part of setup if we're testing the subsequent renders + if test_type == "subsequent": + do_render() + + +# The timing benchmarks run the actual code in a separate process, by using the `timeraw_` prefix. +# As such, we don't actually load the code in this file. Instead, we only prepare a script (raw string) +# that will be run in the new process. +def prepare_templating_benchmark( + renderer: TemplatingRenderer, + size: TemplatingTestSize, + test_type: TemplatingTestType, + context_mode: DjcContextMode, + imports_only: bool = False, +): + global do_render + setup_script = _get_templating_script(renderer, size, context_mode, imports_only) + + # If we're testing the startup time, then the setup is actually the tested code + if test_type == "startup": + return setup_script + else: + # Otherwise include also data generation as part of setup + setup_script += "\n\n" "render_data = gen_render_data()\n" + + # Do the first render as part of setup if we're testing the subsequent renders + if test_type == "subsequent": + setup_script += "render(render_data)\n" + + benchmark_script = "render(render_data)\n" + return benchmark_script, setup_script + + +# - Group: django-components vs django +# - time: djc vs django (startup lg) +# - time: djc vs django (lg - FIRST) +# - time: djc vs django (sm - FIRST) +# - time: djc vs django (lg - SUBSEQUENT) +# - time: djc vs django (sm - SUBSEQUENT) +# - mem: djc vs django (lg - FIRST) +# - mem: djc vs django (sm - FIRST) +# - mem: djc vs django (lg - SUBSEQUENT) +# - mem: djc vs django (sm - SUBSEQUENT) +# +# NOTE: While the name suggests we're comparing Django and Django-components, be aware that +# in our "Django" tests, we still install and import django-components. We also use +# django-components's `{% html_attrs %}` tag in the Django scenario. `{% html_attrs %}` +# was used because the original sample code was from django-components. +# +# As such, these tests should seen not as "Using Django vs Using Components". But instead, +# it should be "What is the relative cost of using Components?". +# +# As an example, the benchmarking for the startup time and memory usage is not comparing +# two independent approaches. Rather, the test is checking if defining Components classes +# is more expensive than vanilla Django templates. +class DjangoComponentsVsDjangoTests: + # Testing startup time (e.g. defining classes and templates) + @benchmark( + pretty_name="startup - large", + group_name=DJC_VS_DJ_GROUP, + number=1, + rounds=5, + params={ + "renderer": ["django", "django-components"], + }, + ) + def timeraw_startup_lg(self, renderer: TemplatingRenderer): + return prepare_templating_benchmark(renderer, "lg", "startup", "isolated") + + @benchmark( + pretty_name="render - small - first render", + group_name=DJC_VS_DJ_GROUP, + number=1, + rounds=5, + params={ + "renderer": ["django", "django-components"], + }, + ) + def timeraw_render_sm_first(self, renderer: TemplatingRenderer): + return prepare_templating_benchmark(renderer, "sm", "first", "isolated") + + @benchmark( + pretty_name="render - small - second render", + group_name=DJC_VS_DJ_GROUP, + number=1, + rounds=5, + params={ + "renderer": ["django", "django-components"], + }, + ) + def timeraw_render_sm_subsequent(self, renderer: TemplatingRenderer): + return prepare_templating_benchmark(renderer, "sm", "subsequent", "isolated") + + @benchmark( + pretty_name="render - large - first render", + group_name=DJC_VS_DJ_GROUP, + number=1, + rounds=5, + params={ + "renderer": ["django", "django-components"], + }, + include_in_quick_benchmark=True, + ) + def timeraw_render_lg_first(self, renderer: TemplatingRenderer): + return prepare_templating_benchmark(renderer, "lg", "first", "isolated") + + @benchmark( + pretty_name="render - large - second render", + group_name=DJC_VS_DJ_GROUP, + number=1, + rounds=5, + params={ + "renderer": ["django", "django-components"], + }, + ) + def timeraw_render_lg_subsequent(self, renderer: TemplatingRenderer): + return prepare_templating_benchmark(renderer, "lg", "subsequent", "isolated") + + @benchmark( + pretty_name="render - small - first render (mem)", + group_name=DJC_VS_DJ_GROUP, + number=1, + rounds=5, + params={ + "renderer": ["django", "django-components"], + }, + setup=lambda renderer: setup_templating_memory_benchmark(renderer, "sm", "first", "isolated"), + ) + def peakmem_render_sm_first(self, renderer: TemplatingRenderer): + do_render() + + @benchmark( + pretty_name="render - small - second render (mem)", + group_name=DJC_VS_DJ_GROUP, + number=1, + rounds=5, + params={ + "renderer": ["django", "django-components"], + }, + setup=lambda renderer: setup_templating_memory_benchmark(renderer, "sm", "subsequent", "isolated"), + ) + def peakmem_render_sm_subsequent(self, renderer: TemplatingRenderer): + do_render() + + @benchmark( + pretty_name="render - large - first render (mem)", + group_name=DJC_VS_DJ_GROUP, + number=1, + rounds=5, + params={ + "renderer": ["django", "django-components"], + }, + setup=lambda renderer: setup_templating_memory_benchmark(renderer, "lg", "first", "isolated"), + ) + def peakmem_render_lg_first(self, renderer: TemplatingRenderer): + do_render() + + @benchmark( + pretty_name="render - large - second render (mem)", + group_name=DJC_VS_DJ_GROUP, + number=1, + rounds=5, + params={ + "renderer": ["django", "django-components"], + }, + setup=lambda renderer: setup_templating_memory_benchmark(renderer, "lg", "subsequent", "isolated"), + ) + def peakmem_render_lg_subsequent(self, renderer: TemplatingRenderer): + do_render() + + +# - Group: Django-components "isolated" vs "django" modes +# - time: Isolated vs django djc (startup lg) +# - time: Isolated vs django djc (lg - FIRST) +# - time: Isolated vs django djc (sm - FIRST) +# - time: Isolated vs django djc (lg - SUBSEQUENT) +# - time: Isolated vs django djc (sm - SUBSEQUENT) +# - mem: Isolated vs django djc (lg - FIRST) +# - mem: Isolated vs django djc (sm - FIRST) +# - mem: Isolated vs django djc (lg - SUBSEQUENT) +# - mem: Isolated vs django djc (sm - SUBSEQUENT) +class IsolatedVsDjangoContextModesTests: + # Testing startup time (e.g. defining classes and templates) + @benchmark( + pretty_name="startup - large", + group_name=DJC_ISOLATED_VS_NON_GROUP, + number=1, + rounds=5, + params={ + "context_mode": ["isolated", "django"], + }, + ) + def timeraw_startup_lg(self, context_mode: DjcContextMode): + return prepare_templating_benchmark("django-components", "lg", "startup", context_mode) + + @benchmark( + pretty_name="render - small - first render", + group_name=DJC_ISOLATED_VS_NON_GROUP, + number=1, + rounds=5, + params={ + "context_mode": ["isolated", "django"], + }, + ) + def timeraw_render_sm_first(self, context_mode: DjcContextMode): + return prepare_templating_benchmark("django-components", "sm", "first", context_mode) + + @benchmark( + pretty_name="render - small - second render", + group_name=DJC_ISOLATED_VS_NON_GROUP, + number=1, + rounds=5, + params={ + "context_mode": ["isolated", "django"], + }, + ) + def timeraw_render_sm_subsequent(self, context_mode: DjcContextMode): + return prepare_templating_benchmark("django-components", "sm", "subsequent", context_mode) + + @benchmark( + pretty_name="render - large - first render", + group_name=DJC_ISOLATED_VS_NON_GROUP, + number=1, + rounds=5, + params={ + "context_mode": ["isolated", "django"], + }, + ) + def timeraw_render_lg_first(self, context_mode: DjcContextMode): + return prepare_templating_benchmark("django-components", "lg", "first", context_mode) + + @benchmark( + pretty_name="render - large - second render", + group_name=DJC_ISOLATED_VS_NON_GROUP, + number=1, + rounds=5, + params={ + "context_mode": ["isolated", "django"], + }, + ) + def timeraw_render_lg_subsequent(self, context_mode: DjcContextMode): + return prepare_templating_benchmark("django-components", "lg", "subsequent", context_mode) + + @benchmark( + pretty_name="render - small - first render (mem)", + group_name=DJC_ISOLATED_VS_NON_GROUP, + number=1, + rounds=5, + params={ + "context_mode": ["isolated", "django"], + }, + setup=lambda context_mode: setup_templating_memory_benchmark("django-components", "sm", "first", context_mode), + ) + def peakmem_render_sm_first(self, context_mode: DjcContextMode): + do_render() + + @benchmark( + pretty_name="render - small - second render (mem)", + group_name=DJC_ISOLATED_VS_NON_GROUP, + number=1, + rounds=5, + params={ + "context_mode": ["isolated", "django"], + }, + setup=lambda context_mode: setup_templating_memory_benchmark( + "django-components", + "sm", + "subsequent", + context_mode, + ), + ) + def peakmem_render_sm_subsequent(self, context_mode: DjcContextMode): + do_render() + + @benchmark( + pretty_name="render - large - first render (mem)", + group_name=DJC_ISOLATED_VS_NON_GROUP, + number=1, + rounds=5, + params={ + "context_mode": ["isolated", "django"], + }, + setup=lambda context_mode: setup_templating_memory_benchmark( + "django-components", + "lg", + "first", + context_mode, + ), + ) + def peakmem_render_lg_first(self, context_mode: DjcContextMode): + do_render() + + @benchmark( + pretty_name="render - large - second render (mem)", + group_name=DJC_ISOLATED_VS_NON_GROUP, + number=1, + rounds=5, + params={ + "context_mode": ["isolated", "django"], + }, + setup=lambda context_mode: setup_templating_memory_benchmark( + "django-components", + "lg", + "subsequent", + context_mode, + ), + ) + def peakmem_render_lg_subsequent(self, context_mode: DjcContextMode): + do_render() + + +class OtherTests: + @benchmark( + pretty_name="import time", + group_name=OTHER_GROUP, + number=1, + rounds=5, + ) + def timeraw_import_time(self): + return prepare_templating_benchmark("django-components", "lg", "startup", "isolated", imports_only=True) diff --git a/benchmarks/component_rendering.py b/benchmarks/component_rendering.py deleted file mode 100644 index 7d430e16..00000000 --- a/benchmarks/component_rendering.py +++ /dev/null @@ -1,174 +0,0 @@ -from time import perf_counter - -from django.template import Context, Template - -from django_components import Component, registry, types -from django_components.dependencies import CSS_DEPENDENCY_PLACEHOLDER, JS_DEPENDENCY_PLACEHOLDER -from tests.django_test_setup import * # NOQA -from tests.testutils import BaseTestCase, create_and_process_template_response - - -class SlottedComponent(Component): - template: types.django_html = """ - {% load component_tags %} - -

{% slot "header" %}Default header{% endslot %}
-
{% slot "main" %}Default main{% endslot %}
-
{% slot "footer" %}Default footer{% endslot %}
- - """ - - -class SimpleComponent(Component): - template: types.django_html = """ - Variable: {{ variable }} - """ - - css_file = "style.css" - js_file = "script.js" - - def get_context_data(self, variable, variable2="default"): - return { - "variable": variable, - "variable2": variable2, - } - - -class BreadcrumbComponent(Component): - template: types.django_html = """ -
- """ - - css_file = "test.css" - js_file = "test.js" - - LINKS = [ - ( - "https://developer.mozilla.org/en-US/docs/Learn", - "Learn web development", - ), - ( - "https://developer.mozilla.org/en-US/docs/Learn/HTML", - "Structuring the web with HTML", - ), - ( - "https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML", - "Introduction to HTML", - ), - ( - "https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Document_and_website_structure", - "Document and website structure", - ), - ] - - def get_context_data(self, items): - if items > 4: - items = 4 - elif items < 0: - items = 0 - return {"links": self.LINKS[: items - 1]} - - -EXPECTED_CSS = """""" -EXPECTED_JS = """""" - - -class RenderBenchmarks(BaseTestCase): - def setUp(self): - registry.clear() - registry.register("test_component", SlottedComponent) - registry.register("inner_component", SimpleComponent) - registry.register("breadcrumb_component", BreadcrumbComponent) - - @staticmethod - def timed_loop(func, iterations=1000): - """Run func iterations times, and return the time in ms per iteration.""" - start_time = perf_counter() - for _ in range(iterations): - func() - end_time = perf_counter() - total_elapsed = end_time - start_time # NOQA - return total_elapsed * 1000 / iterations - - def test_render_time_for_small_component(self): - template_str: types.django_html = """ - {% load component_tags %} - {% component 'test_component' %} - {% slot "header" %} - {% component 'inner_component' variable='foo' %}{% endcomponent %} - {% endslot %} - {% endcomponent %} - """ - template = Template(template_str) - - print(f"{self.timed_loop(lambda: template.render(Context({})))} ms per iteration") - - def test_middleware_time_with_dependency_for_small_page(self): - template_str: types.django_html = """ - {% load component_tags %} - {% component_js_dependencies %} - {% component_css_dependencies %} - {% component 'test_component' %} - {% slot "header" %} - {% component 'inner_component' variable='foo' %}{% endcomponent %} - {% endslot %} - {% endcomponent %} - """ - template = Template(template_str) - # Sanity tests - response_content = create_and_process_template_response(template) - self.assertNotIn(CSS_DEPENDENCY_PLACEHOLDER, response_content) - self.assertNotIn(JS_DEPENDENCY_PLACEHOLDER, response_content) - self.assertIn("style.css", response_content) - self.assertIn("script.js", response_content) - - without_middleware = self.timed_loop( - lambda: create_and_process_template_response(template, use_middleware=False) - ) - with_middleware = self.timed_loop(lambda: create_and_process_template_response(template, use_middleware=True)) - - print("Small page middleware test") - self.report_results(with_middleware, without_middleware) - - def test_render_time_with_dependency_for_large_page(self): - from django.template.loader import get_template - - template = get_template("mdn_complete_page.html") - response_content = create_and_process_template_response(template, {}) - self.assertNotIn(CSS_DEPENDENCY_PLACEHOLDER, response_content) - self.assertNotIn(JS_DEPENDENCY_PLACEHOLDER, response_content) - self.assertIn("test.css", response_content) - self.assertIn("test.js", response_content) - - without_middleware = self.timed_loop( - lambda: create_and_process_template_response(template, {}, use_middleware=False) - ) - with_middleware = self.timed_loop( - lambda: create_and_process_template_response(template, {}, use_middleware=True) - ) - - print("Large page middleware test") - self.report_results(with_middleware, without_middleware) - - @staticmethod - def report_results(with_middleware, without_middleware): - print(f"Middleware active\t\t{with_middleware:.3f} ms per iteration") - print(f"Middleware inactive\t{without_middleware:.3f} ms per iteration") - time_difference = with_middleware - without_middleware - if without_middleware > with_middleware: - print(f"Decrease of {-100 * time_difference / with_middleware:.2f}%") - else: - print(f"Increase of {100 * time_difference / without_middleware:.2f}%") diff --git a/benchmarks/monkeypatch_asv.py b/benchmarks/monkeypatch_asv.py new file mode 100644 index 00000000..23003311 --- /dev/null +++ b/benchmarks/monkeypatch_asv.py @@ -0,0 +1,29 @@ +from asv_runner.benchmarks.timeraw import TimerawBenchmark, _SeparateProcessTimer + + +# Fix for https://github.com/airspeed-velocity/asv_runner/pull/44 +def _get_timer(self, *param): + """ + Returns a timer that runs the benchmark function in a separate process. + + #### Parameters + **param** (`tuple`) + : The parameters to pass to the benchmark function. + + #### Returns + **timer** (`_SeparateProcessTimer`) + : A timer that runs the function in a separate process. + """ + if param: + + def func(): + # ---------- OUR CHANGES: ADDED RETURN STATEMENT ---------- + return self.func(*param) + # ---------- OUR CHANGES END ---------- + + else: + func = self.func + return _SeparateProcessTimer(func) + + +TimerawBenchmark._get_timer = _get_timer diff --git a/benchmarks/monkeypatch_asv_ci.txt b/benchmarks/monkeypatch_asv_ci.txt new file mode 100644 index 00000000..30158b6d --- /dev/null +++ b/benchmarks/monkeypatch_asv_ci.txt @@ -0,0 +1,66 @@ +# ------------ FIX FOR #45 ------------ +# See https://github.com/airspeed-velocity/asv_runner/issues/45 +# This fix is applied in CI in the `benchmark.yml` file. +# This file is intentionally named `monkeypatch_asv_ci.txt` to avoid being +# loaded as a python file by `asv`. +# ------------------------------------- + +def timeit(self, number): + """ + Run the function's code `number` times in a separate Python process, and + return the execution time. + + #### Parameters + **number** (`int`) + : The number of times to execute the function's code. + + #### Returns + **time** (`float`) + : The time it took to execute the function's code `number` times. + + #### Notes + The function's code is executed in a separate Python process to avoid + interference from the parent process. The function can return either a + single string of code to be executed, or a tuple of two strings: the + code to be executed and the setup code to be run before timing. + """ + stmt = self.func() + if isinstance(stmt, tuple): + stmt, setup = stmt + else: + setup = "" + stmt = textwrap.dedent(stmt) + setup = textwrap.dedent(setup) + stmt = stmt.replace(r'"""', r"\"\"\"") + setup = setup.replace(r'"""', r"\"\"\"") + + # TODO + # -----------ORIGINAL CODE----------- + # code = self.subprocess_tmpl.format(stmt=stmt, setup=setup, number=number) + + # res = subprocess.check_output([sys.executable, "-c", code]) + # return float(res.strip()) + + # -----------NEW CODE----------- + code = self.subprocess_tmpl.format(stmt=stmt, setup=setup, number=number) + + evaler = textwrap.dedent( + """ + import sys + code = sys.stdin.read() + exec(code) + """ + ) + + proc = subprocess.Popen([sys.executable, "-c", evaler], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + stdout, stderr = proc.communicate(input=code.encode("utf-8")) + if proc.returncode != 0: + raise RuntimeError(f"Subprocess failed: {stderr.decode()}") + return float(stdout.decode("utf-8").strip()) + +_SeparateProcessTimer.timeit = timeit + +# ------------ END FIX #45 ------------ diff --git a/benchmarks/test_lexer_performance.py b/benchmarks/test_lexer_performance.py deleted file mode 100644 index b95f7d63..00000000 --- a/benchmarks/test_lexer_performance.py +++ /dev/null @@ -1,195 +0,0 @@ -# NOTE: This file is more of a playground than a proper test - -import timeit -from typing import List, Tuple - -from django.template.base import DebugLexer, Lexer, Token - -from django_components.util.template_parser import parse_template - - -def django_lexer(template: str) -> List[Token]: - """Use Django's built-in lexer to tokenize a template.""" - lexer = Lexer(template) - return list(lexer.tokenize()) - - -def django_debug_lexer(template: str) -> List[Token]: - """Use Django's built-in lexer to tokenize a template.""" - lexer = DebugLexer(template) - return list(lexer.tokenize()) - - -def run_benchmark(template: str, num_iterations: int = 5000) -> Tuple[float, float]: - """Run performance comparison between Django and custom lexer.""" - # django_time = timeit.timeit(lambda: django_lexer(template), number=num_iterations) - django_debug_time = timeit.timeit(lambda: django_debug_lexer(template), number=num_iterations) - custom_time = timeit.timeit(lambda: parse_template(template), number=num_iterations) - # return django_time, django_debug_time - return django_debug_time, custom_time - - -def print_benchmark_results(template: str, django_time: float, custom_time: float, num_iterations: int) -> None: - """Print formatted benchmark results.""" - print(f"\nTemplate: {template}") - print(f"Iterations: {num_iterations}") - print(f"Django Lexer: {django_time:.6f} seconds") - print(f"Custom Lexer: {custom_time:.6f} seconds") - print(f"Difference: {abs(django_time - custom_time):.6f} seconds") - print(f"Custom lexer is {(django_time / custom_time):.2f}x {'faster' if custom_time < django_time else 'slower'}") - - -if __name__ == "__main__": - test_cases = [ - # Simple text - "Hello World", - # Simple variable - "Hello {{ name }}", - # Simple block - "{% if condition %}Hello{% endif %}", - # Complex nested template - """ - {% extends "base.html" %} - {% block content %} -

{{ title }}

- {% for item in items %} -
- {{ item.name }} - {% if item.description %} -

{{ item.description }}

- {% endif %} -
- {% endfor %} - {% endblock %} - """, - # Component with nested tags - """ - {% component 'table' - headers=headers - rows=rows - footer="{% slot 'footer' %}Total: {{ total }}{% endslot %}" - title="{% trans 'Data Table' %}" - %} - """, - # Real world example - """ -
- {# Info section #} -
-
-

Project Info

- - {% if editable %} - {% component "Button" - href=project_edit_url - attrs:class="not-prose" - footer="{% slot 'footer' %}Total: {{ total }}{% endslot %}" - title="{% trans 'Data Table' %}" - %} - Edit Project - {% endcomponent %} - {% endif %} -
- - - {% for key, value in project_info %} - - - - - {% endfor %} -
- {{ key }}: - - {{ value }} -
-
- - {# Status Updates section #} - {% component "ProjectStatusUpdates" - project_id=project.pk - status_updates=status_updates - editable=editable - footer="{% slot 'footer' %}Total: {{ total }}{% endslot %}" - title="{% trans 'Data Table' %}" - / %} -
- {# Team section #} -
-
-

Dcode Team

- - {% if editable %} - {% component "Button" - href=edit_project_roles_url - attrs:class="not-prose" - footer="{% slot 'footer' %}Total: {{ total }}{% endslot %}" - title="{% trans 'Data Table' %}" - %} - Edit Team - {% endcomponent %} - {% endif %} -
- - {% component "ProjectUsers" - project_id=project.pk - roles_with_users=roles_with_users - editable=False - footer="{% slot 'footer' %}Total: {{ total }}{% endslot %}" - title="{% trans 'Data Table' %}" - / %} -
- - {# POCs section #} -
-
-

Client POCs

- - {% if editable %} - {% component "Button" - href=edit_pocs_url - attrs:class="not-prose" - footer="{% slot 'footer' %}Total: {{ total }}{% endslot %}" - title="{% trans 'Data Table' %}" - %} - Edit POCs - {% endcomponent %} - {% endif %} -
- - {% if poc_data %} - - - - - - - {% for data in poc_data %} - - - - - - {% endfor %} -
NameJob TitleHubspot Profile
{{ data.poc.contact.first_name }} {{ data.poc.contact.last_name }}{{ data.poc.contact.job_title }} - {% component "Icon" - href=data.hubspot_url - name="arrow-top-right-on-square" - variant="outline" - color="text-gray-400 hover:text-gray-500" - footer="{% slot 'footer' %}Total: {{ total }}{% endslot %}" - title="{% trans 'Data Table' %}" - / %} -
- {% else %} -

No entries

- {% endif %} -
-
-
- """, - ] - - for template in test_cases: - django_time, custom_time = run_benchmark(template) - print_benchmark_results(template, django_time, custom_time, 200) diff --git a/benchmarks/utils.py b/benchmarks/utils.py new file mode 100644 index 00000000..eb160cb0 --- /dev/null +++ b/benchmarks/utils.py @@ -0,0 +1,99 @@ +import os +import sys +from importlib.abc import Loader +from importlib.util import spec_from_loader, module_from_spec +from types import ModuleType +from typing import Any, Dict, List, Optional + + +# NOTE: benchmark_name constraints: +# - MUST BE UNIQUE +# - MUST NOT CONTAIN `-` +# - MUST START WITH `time_`, `mem_`, `peakmem_` +# See https://github.com/airspeed-velocity/asv/pull/1470 +def benchmark( + *, + pretty_name: Optional[str] = None, + timeout: Optional[int] = None, + group_name: Optional[str] = None, + params: Optional[Dict[str, List[Any]]] = None, + number: Optional[int] = None, + min_run_count: Optional[int] = None, + include_in_quick_benchmark: bool = False, + **kwargs, +): + def decorator(func): + # For pull requests, we want to run benchmarks only for a subset of tests, + # because the full set of tests takes about 10 minutes to run (5 min per commit). + # This is done by setting DJC_BENCHMARK_QUICK=1 in the environment. + if os.getenv("DJC_BENCHMARK_QUICK") and not include_in_quick_benchmark: + # By setting the benchmark name to something that does NOT start with + # valid prefixes like `time_`, `mem_`, or `peakmem_`, this function will be ignored by asv. + func.benchmark_name = "noop" + return func + + # "group_name" is our custom field, which we actually convert to asv's "benchmark_name" + if group_name is not None: + benchmark_name = f"{group_name}.{func.__name__}" + func.benchmark_name = benchmark_name + + # Also "params" is custom, so we normalize it to "params" and "param_names" + if params is not None: + func.params, func.param_names = list(params.values()), list(params.keys()) + + if pretty_name is not None: + func.pretty_name = pretty_name + if timeout is not None: + func.timeout = timeout + if number is not None: + func.number = number + if min_run_count is not None: + func.min_run_count = min_run_count + + # Additional, untyped kwargs + for k, v in kwargs.items(): + setattr(func, k, v) + + return func + + return decorator + + +class VirtualModuleLoader(Loader): + def __init__(self, code_string): + self.code_string = code_string + + def exec_module(self, module): + exec(self.code_string, module.__dict__) + + +def create_virtual_module(name: str, code_string: str, file_path: str) -> ModuleType: + """ + To avoid the headaches of importing the tested code from another diretory, + we create a "virtual" module that we can import from anywhere. + + E.g. + ```py + from benchmarks.utils import create_virtual_module + + create_virtual_module("my_module", "print('Hello, world!')", __file__) + + # Now you can import my_module from anywhere + import my_module + ``` + """ + # Create the module specification + spec = spec_from_loader(name, VirtualModuleLoader(code_string)) + + # Create the module + module = module_from_spec(spec) # type: ignore[arg-type] + module.__file__ = file_path + module.__name__ = name + + # Add it to sys.modules + sys.modules[name] = module + + # Execute the module + spec.loader.exec_module(module) # type: ignore[union-attr] + + return module diff --git a/docs/benchmarks/asv.css b/docs/benchmarks/asv.css new file mode 100644 index 00000000..d7867516 --- /dev/null +++ b/docs/benchmarks/asv.css @@ -0,0 +1,161 @@ +/* Basic navigation */ + +.asv-navigation { + padding: 2px; +} + +nav ul li.active a { + height: 52px; +} + +nav li.active span.navbar-brand { + background-color: #e7e7e7; + height: 52px; +} + +nav li.active span.navbar-brand:hover { + background-color: #e7e7e7; +} + +.navbar-default .navbar-link { + color: #2458D9; +} + +.panel-body { + padding: 0; +} + +.panel { + margin-bottom: 4px; + -webkit-box-shadow: none; + box-shadow: none; + border-radius: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} + +.panel-default>.panel-heading, +.panel-heading { + font-size: 12px; + font-weight:bold; + padding: 2px; + text-align: center; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + background-color: #eee; +} + +.btn, +.btn-group, +.btn-group-vertical>.btn:first-child, +.btn-group-vertical>.btn:last-child:not(:first-child), +.btn-group-vertical>.btn:last-child { + border: none; + border-radius: 0px; + overflow: hidden; +} + +.btn-default:focus, .btn-default:active, .btn-default.active { + border: none; + color: #fff; + background-color: #99bfcd; +} + +#range { + font-family: monospace; + text-align: center; + background: #ffffff; +} + +.form-control { + border: none; + border-radius: 0px; + font-size: 12px; + padding: 0px; +} + +.tooltip-inner { + min-width: 100px; + max-width: 800px; + text-align: left; + white-space: pre-wrap; + font-family: monospace; +} + +/* Benchmark tree */ + +.nav-list { + font-size: 12px; + padding: 0; + padding-left: 15px; +} + +.nav-list>li { + overflow-x: hidden; +} + +.nav-list>li>a { + padding: 0; + padding-left: 5px; + color: #000; +} + +.nav-list>li>a:focus { + color: #fff; + background-color: #99bfcd; + box-shadow: inset 0 3px 5px rgba(0,0,0,.125); +} + +.nav-list>li>.nav-header { + white-space: nowrap; + font-weight: 500; + margin-bottom: 2px; +} + +.caret-right { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-left: 4px solid; + border-bottom: 4px solid transparent; + border-top: 4px solid transparent; +} + +/* Summary page */ + +.benchmark-group > h1 { + text-align: center; +} + +.benchmark-container { + width: 300px; + height: 116px; + padding: 4px; + border-radius: 3px; +} + +.benchmark-container:hover { + background-color: #eee; +} + +.benchmark-plot { + width: 292px; + height: 88px; +} + +.benchmark-text { + font-size: 12px; + color: #000; + width: 292px; + overflow: hidden; +} + +#extra-buttons { + margin: 1em; +} + +#extra-buttons a { + border: solid 1px #ccc; +} diff --git a/docs/benchmarks/asv.js b/docs/benchmarks/asv.js new file mode 100644 index 00000000..ac235639 --- /dev/null +++ b/docs/benchmarks/asv.js @@ -0,0 +1,525 @@ +'use strict'; + +$(document).ready(function() { + /* GLOBAL STATE */ + /* The index.json content as returned from the server */ + var main_timestamp = ''; + var main_json = {}; + /* Extra pages: {name: show_function} */ + var loaded_pages = {}; + /* Previous window scroll positions */ + var window_scroll_positions = {}; + /* Previous window hash location */ + var window_last_location = null; + /* Graph data cache */ + var graph_cache = {}; + var graph_cache_max_size = 5; + + var colors = [ + '#247AAD', + '#E24A33', + '#988ED5', + '#777777', + '#FBC15E', + '#8EBA42', + '#FFB5B8' + ]; + + var time_units = [ + ['ps', 'picoseconds', 0.000000000001], + ['ns', 'nanoseconds', 0.000000001], + ['μs', 'microseconds', 0.000001], + ['ms', 'milliseconds', 0.001], + ['s', 'seconds', 1], + ['m', 'minutes', 60], + ['h', 'hours', 60 * 60], + ['d', 'days', 60 * 60 * 24], + ['w', 'weeks', 60 * 60 * 24 * 7], + ['y', 'years', 60 * 60 * 24 * 7 * 52], + ['C', 'centuries', 60 * 60 * 24 * 7 * 52 * 100] + ]; + + var mem_units = [ + ['', 'bytes', 1], + ['k', 'kilobytes', 1000], + ['M', 'megabytes', 1000000], + ['G', 'gigabytes', 1000000000], + ['T', 'terabytes', 1000000000000] + ]; + + function pretty_second(x) { + for (var i = 0; i < time_units.length - 1; ++i) { + if (Math.abs(x) < time_units[i+1][2]) { + return (x / time_units[i][2]).toFixed(3) + time_units[i][0]; + } + } + + return 'inf'; + } + + function pretty_byte(x) { + for (var i = 0; i < mem_units.length - 1; ++i) { + if (Math.abs(x) < mem_units[i+1][2]) { + break; + } + } + if (i == 0) { + return x + ''; + } + return (x / mem_units[i][2]).toFixed(3) + mem_units[i][0]; + } + + function pretty_unit(x, unit) { + if (unit == "seconds") { + return pretty_second(x); + } + else if (unit == "bytes") { + return pretty_byte(x); + } + else if (unit && unit != "unit") { + return '' + x.toPrecision(3) + ' ' + unit; + } + else { + return '' + x.toPrecision(3); + } + } + + function pad_left(s, c, num) { + s = '' + s; + while (s.length < num) { + s = c + s; + } + return s; + } + + function format_date_yyyymmdd(date) { + return (pad_left(date.getFullYear(), '0', 4) + + '-' + pad_left(date.getMonth() + 1, '0', 2) + + '-' + pad_left(date.getDate(), '0', 2)); + } + + function format_date_yyyymmdd_hhmm(date) { + return (format_date_yyyymmdd(date) + ' ' + + pad_left(date.getHours(), '0', 2) + + ':' + pad_left(date.getMinutes(), '0', 2)); + } + + /* Convert a flat index to permutation to the corresponding value */ + function param_selection_from_flat_idx(params, idx) { + var selection = []; + if (idx < 0) { + idx = 0; + } + for (var k = params.length-1; k >= 0; --k) { + var j = idx % params[k].length; + selection.unshift([j]); + idx = (idx - j) / params[k].length; + } + selection.unshift([null]); + return selection; + } + + /* Convert a benchmark parameter value from their native Python + repr format to a number or a string, ready for presentation */ + function convert_benchmark_param_value(value_repr) { + var match = Number(value_repr); + if (!isNaN(match)) { + return match; + } + + /* Python str */ + match = value_repr.match(/^'(.+)'$/); + if (match) { + return match[1]; + } + + /* Python unicode */ + match = value_repr.match(/^u'(.+)'$/); + if (match) { + return match[1]; + } + + /* Python class */ + match = value_repr.match(/^$/); + if (match) { + return match[1]; + } + + return value_repr; + } + + /* Convert loaded graph data to a format flot understands, by + treating either time or one of the parameters as x-axis, + and selecting only one value of the remaining axes */ + function filter_graph_data(raw_series, x_axis, other_indices, params) { + if (params.length == 0) { + /* Simple time series */ + return raw_series; + } + + /* Compute position of data entry in the results list, + and stride corresponding to plot x-axis parameter */ + var stride = 1; + var param_stride = 0; + var param_idx = 0; + for (var k = params.length - 1; k >= 0; --k) { + if (k == x_axis - 1) { + param_stride = stride; + } + else { + param_idx += other_indices[k + 1] * stride; + } + stride *= params[k].length; + } + + if (x_axis == 0) { + /* x-axis is time axis */ + var series = new Array(raw_series.length); + for (var k = 0; k < raw_series.length; ++k) { + if (raw_series[k][1] === null) { + series[k] = [raw_series[k][0], null]; + } else { + series[k] = [raw_series[k][0], + raw_series[k][1][param_idx]]; + } + } + return series; + } + else { + /* x-axis is some parameter axis */ + var time_idx = null; + if (other_indices[0] === null) { + time_idx = raw_series.length - 1; + } + else { + /* Need to search for the correct time value */ + for (var k = 0; k < raw_series.length; ++k) { + if (raw_series[k][0] == other_indices[0]) { + time_idx = k; + break; + } + } + if (time_idx === null) { + /* No data points */ + return []; + } + } + + var x_values = params[x_axis - 1]; + var series = new Array(x_values.length); + for (var k = 0; k < x_values.length; ++k) { + if (raw_series[time_idx][1] === null) { + series[k] = [convert_benchmark_param_value(x_values[k]), + null]; + } + else { + series[k] = [convert_benchmark_param_value(x_values[k]), + raw_series[time_idx][1][param_idx]]; + } + param_idx += param_stride; + } + return series; + } + } + + function filter_graph_data_idx(raw_series, x_axis, flat_idx, params) { + var selection = param_selection_from_flat_idx(params, flat_idx); + var flat_selection = []; + $.each(selection, function(i, v) { + flat_selection.push(v[0]); + }); + return filter_graph_data(raw_series, x_axis, flat_selection, params); + } + + /* Escape special characters in graph item file names. + The implementation must match asv.util.sanitize_filename */ + function sanitize_filename(name) { + var bad_re = /[<>:"\/\\^|?*\x00-\x1f]/g; + var bad_names = ["CON", "PRN", "AUX", "NUL", "COM1", "COM2", "COM3", + "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", "LPT1", + "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", + "LPT9"]; + name = name.replace(bad_re, "_"); + if (bad_names.indexOf(name.toUpperCase()) != -1) { + name = name + "_"; + } + return name; + } + + /* Given a specific group of parameters, generate the URL to + use to load that graph. + The implementation must match asv.graph.Graph.get_file_path + */ + function graph_to_path(benchmark_name, state) { + var parts = []; + $.each(state, function(key, value) { + var part; + if (value === null) { + part = key + "-null"; + } else if (value) { + part = key + "-" + value; + } else { + part = key; + } + parts.push(sanitize_filename('' + part)); + }); + parts.sort(); + parts.splice(0, 0, "graphs"); + parts.push(sanitize_filename(benchmark_name)); + + /* Escape URI components */ + parts = $.map(parts, function (val) { return encodeURIComponent(val); }); + return parts.join('/') + ".json"; + } + + /* + Load and cache graph data (on javascript side) + */ + function load_graph_data(url, success, failure) { + var dfd = $.Deferred(); + if (graph_cache[url]) { + setTimeout(function() { + dfd.resolve(graph_cache[url]); + }, 1); + } + else { + $.ajax({ + url: url + '?timestamp=' + $.asv.main_timestamp, + dataType: "json", + cache: true + }).done(function(data) { + if (Object.keys(graph_cache).length > graph_cache_max_size) { + $.each(Object.keys(graph_cache), function (i, key) { + delete graph_cache[key]; + }); + } + graph_cache[url] = data; + dfd.resolve(data); + }).fail(function() { + dfd.reject(); + }); + } + return dfd.promise(); + } + + /* + Parse hash string, assuming format similar to standard URL + query strings + */ + function parse_hash_string(str) { + var info = {location: [''], params: {}}; + + if (str && str[0] == '#') { + str = str.slice(1); + } + if (str && str[0] == '/') { + str = str.slice(1); + } + + var match = str.match(/^([^?]*?)\?/); + if (match) { + info['location'] = decodeURIComponent(match[1]).replace(/\/+/, '/').split('/'); + var rest = str.slice(match[1].length+1); + var parts = rest.split('&'); + for (var i = 0; i < parts.length; ++i) { + var part = parts[i].split('='); + if (part.length != 2) { + continue; + } + var key = decodeURIComponent(part[0].replace(/\+/g, " ")); + var value = decodeURIComponent(part[1].replace(/\+/g, " ")); + if (value == '[none]') { + value = null; + } + if (info['params'][key] === undefined) { + info['params'][key] = [value]; + } + else { + info['params'][key].push(value); + } + } + } + else { + info['location'] = decodeURIComponent(str).replace(/\/+/, '/').split('/'); + } + return info; + } + + /* + Generate a hash string, inverse of parse_hash_string + */ + function format_hash_string(info) { + var parts = info['params']; + var str = '#' + info['location']; + + if (parts) { + str = str + '?'; + var first = true; + $.each(parts, function (key, values) { + $.each(values, function (idx, value) { + if (!first) { + str = str + '&'; + } + if (value === null) { + value = '[none]'; + } + str = str + encodeURIComponent(key) + '=' + encodeURIComponent(value); + first = false; + }); + }); + } + return str; + } + + /* + Dealing with sub-pages + */ + + function show_page(name, params) { + if (loaded_pages[name] !== undefined) { + $("#nav ul li.active").removeClass('active'); + $("#nav-li-" + name).addClass('active'); + $("#graph-display").hide(); + $("#summarygrid-display").hide(); + $("#summarylist-display").hide(); + $('#regressions-display').hide(); + $('.tooltip').remove(); + loaded_pages[name](params); + return true; + } + else { + return false; + } + } + + function hashchange() { + var info = parse_hash_string(window.location.hash); + + /* Keep track of window scroll position; makes the back-button work */ + var old_scroll_pos = window_scroll_positions[info.location.join('/')]; + window_scroll_positions[window_last_location] = $(window).scrollTop(); + window_last_location = info.location.join('/'); + + /* Redirect to correct handler */ + if (show_page(info.location, info.params)) { + /* show_page does the work */ + } + else { + /* Display benchmark page */ + info.params['benchmark'] = info.location[0]; + show_page('graphdisplay', info.params); + } + + /* Scroll back to previous position, if any */ + if (old_scroll_pos !== undefined) { + $(window).scrollTop(old_scroll_pos); + } + } + + function get_commit_hash(revision) { + var commit_hash = main_json.revision_to_hash[revision]; + if (commit_hash) { + // Return printable commit hash + commit_hash = commit_hash.slice(0, main_json.hash_length); + } + return commit_hash; + } + + function get_revision(commit_hash) { + var rev = null; + $.each(main_json.revision_to_hash, function(revision, full_commit_hash) { + if (full_commit_hash.startsWith(commit_hash)) { + rev = revision; + // break the $.each loop + return false; + } + }); + return rev; + } + + function init_index() { + /* Fetch the main index.json and then set up the page elements + based on it. */ + $.ajax({ + url: "index.json" + '?timestamp=' + $.asv.main_timestamp, + dataType: "json", + cache: true + }).done(function (index) { + main_json = index; + $.asv.main_json = index; + + /* Page title */ + var project_name = $("#project-name")[0]; + project_name.textContent = index.project; + project_name.setAttribute("href", index.project_url); + $("#project-name").textContent = index.project; + document.title = "airspeed velocity of an unladen " + index.project; + + $(window).on('hashchange', hashchange); + + $('#graph-display').hide(); + $('#regressions-display').hide(); + $('#summarygrid-display').hide(); + $('#summarylist-display').hide(); + + hashchange(); + }).fail(function () { + $.asv.ui.network_error(); + }); + } + + function init() { + /* Fetch the info.json */ + $.ajax({ + url: "info.json", + dataType: "json", + cache: false + }).done(function (info) { + main_timestamp = info['timestamp']; + $.asv.main_timestamp = main_timestamp; + init_index(); + }).fail(function () { + $.asv.ui.network_error(); + }); + } + + + /* + Set up $.asv + */ + + this.register_page = function(name, show_function) { + loaded_pages[name] = show_function; + } + this.parse_hash_string = parse_hash_string; + this.format_hash_string = format_hash_string; + + this.filter_graph_data = filter_graph_data; + this.filter_graph_data_idx = filter_graph_data_idx; + this.convert_benchmark_param_value = convert_benchmark_param_value; + this.param_selection_from_flat_idx = param_selection_from_flat_idx; + this.graph_to_path = graph_to_path; + this.load_graph_data = load_graph_data; + this.get_commit_hash = get_commit_hash; + this.get_revision = get_revision; + + this.main_timestamp = main_timestamp; /* Updated after info.json loads */ + this.main_json = main_json; /* Updated after index.json loads */ + + this.format_date_yyyymmdd = format_date_yyyymmdd; + this.format_date_yyyymmdd_hhmm = format_date_yyyymmdd_hhmm; + this.pretty_unit = pretty_unit; + this.time_units = time_units; + this.mem_units = mem_units; + + this.colors = colors; + + $.asv = this; + + + /* + Launch it + */ + + init(); +}); diff --git a/docs/benchmarks/asv_ui.js b/docs/benchmarks/asv_ui.js new file mode 100644 index 00000000..af757c70 --- /dev/null +++ b/docs/benchmarks/asv_ui.js @@ -0,0 +1,231 @@ +'use strict'; + +$(document).ready(function() { + function make_panel(nav, heading) { + var panel = $('
'); + nav.append(panel); + var panel_header = $( + '
' + heading + '
'); + panel.append(panel_header); + var panel_body = $('
'); + panel.append(panel_body); + return panel_body; + } + + function make_value_selector_panel(nav, heading, values, setup_callback) { + var panel_body = make_panel(nav, heading); + var vertical = false; + var buttons = $('
'); + + panel_body.append(buttons); + + $.each(values, function (idx, value) { + var button = $( + ''); + setup_callback(idx, value, button); + buttons.append(button); + }); + + return panel_body; + } + + function reflow_value_selector_panels(no_timeout) { + $('.panel').each(function (i, panel_obj) { + var panel = $(panel_obj); + panel.find('.btn-group').each(function (i, buttons_obj) { + var buttons = $(buttons_obj); + var width = 0; + + if (buttons.hasClass('reflow-done')) { + /* already processed */ + return; + } + + $.each(buttons.children(), function(idx, value) { + width += value.scrollWidth; + }); + + var max_width = panel_obj.clientWidth; + + if (width >= max_width) { + buttons.addClass("btn-group-vertical"); + buttons.css("width", "100%"); + buttons.css("max-height", "20ex"); + buttons.css("overflow-y", "auto"); + } + else { + buttons.addClass("btn-group-justified"); + } + + /* The widths can be zero if the UI is not fully layouted yet, + so mark the adjustment complete only if this is not the case */ + if (width > 0 && max_width > 0) { + buttons.addClass("reflow-done"); + } + }); + }); + + if (!no_timeout) { + /* Call again asynchronously, in case the UI was not fully layouted yet */ + setTimeout(function() { $.asv.ui.reflow_value_selector_panels(true); }, 0); + } + } + + function network_error(ajax, status, error) { + $("#error-message").text( + "Error fetching content. " + + "Perhaps web server has gone down."); + $("#error").modal('show'); + } + + function hover_graph(element, graph_url, benchmark_basename, parameter_idx, revisions) { + /* Show the summary graph as a popup */ + var plot_div = $('
'); + plot_div.css('width', '11.8em'); + plot_div.css('height', '7em'); + plot_div.css('border', '2px solid black'); + plot_div.css('background-color', 'white'); + + function update_plot() { + var markings = []; + + if (revisions) { + $.each(revisions, function(i, revs) { + var rev_a = revs[0]; + var rev_b = revs[1]; + + if (rev_a !== null) { + markings.push({ color: '#d00', lineWidth: 2, xaxis: { from: rev_a, to: rev_a }}); + markings.push({ color: "rgba(255,0,0,0.1)", xaxis: { from: rev_a, to: rev_b }}); + } + markings.push({ color: '#d00', lineWidth: 2, xaxis: { from: rev_b, to: rev_b }}); + }); + } + + $.asv.load_graph_data( + graph_url + ).done(function (data) { + var params = $.asv.main_json.benchmarks[benchmark_basename].params; + data = $.asv.filter_graph_data_idx(data, 0, parameter_idx, params); + var options = { + colors: ['#000'], + series: { + lines: { + show: true, + lineWidth: 2 + }, + shadowSize: 0 + }, + grid: { + borderWidth: 1, + margin: 0, + labelMargin: 0, + axisMargin: 0, + minBorderMargin: 0, + markings: markings, + }, + xaxis: { + ticks: [], + }, + yaxis: { + ticks: [], + min: 0 + }, + legend: { + show: false + } + }; + var plot = $.plot(plot_div, [{data: data}], options); + }).fail(function () { + // TODO: Handle failure + }); + + return plot_div; + } + + element.popover({ + placement: 'left auto', + trigger: 'hover', + html: true, + delay: 50, + content: $('
').append(plot_div) + }); + + element.on('show.bs.popover', update_plot); + } + + function hover_summary_graph(element, benchmark_basename) { + /* Show the summary graph as a popup */ + var plot_div = $('
'); + plot_div.css('width', '11.8em'); + plot_div.css('height', '7em'); + plot_div.css('border', '2px solid black'); + plot_div.css('background-color', 'white'); + + function update_plot() { + var markings = []; + + $.asv.load_graph_data( + 'graphs/summary/' + benchmark_basename + '.json' + ).done(function (data) { + var options = { + colors: $.asv.colors, + series: { + lines: { + show: true, + lineWidth: 2 + }, + shadowSize: 0 + }, + grid: { + borderWidth: 1, + margin: 0, + labelMargin: 0, + axisMargin: 0, + minBorderMargin: 0, + markings: markings, + }, + xaxis: { + ticks: [], + }, + yaxis: { + ticks: [], + min: 0 + }, + legend: { + show: false + } + }; + var plot = $.plot(plot_div, [{data: data}], options); + }).fail(function () { + // TODO: Handle failure + }); + + return plot_div; + } + + element.popover({ + placement: 'left auto', + trigger: 'hover', + html: true, + delay: 50, + content: $('
').append(plot_div) + }); + + element.on('show.bs.popover', update_plot); + } + + /* + Set up $.asv.ui + */ + + this.network_error = network_error; + this.make_panel = make_panel; + this.make_value_selector_panel = make_value_selector_panel; + this.reflow_value_selector_panels = reflow_value_selector_panels; + this.hover_graph = hover_graph; + this.hover_summary_graph = hover_summary_graph; + + $.asv.ui = this; +}); diff --git a/docs/benchmarks/error.html b/docs/benchmarks/error.html new file mode 100644 index 00000000..af2a4d54 --- /dev/null +++ b/docs/benchmarks/error.html @@ -0,0 +1,23 @@ + + + + airspeed velocity error + + + + +

+ swallow + Can not determine continental origin of swallow. +

+ +

+ One or more external (JavaScript) dependencies of airspeed velocity failed to load. +

+ +

+ Make sure you have an active internet connection and enable 3rd-party scripts + in your browser the first time you load airspeed velocity. +

+ + diff --git a/docs/benchmarks/graphdisplay.js b/docs/benchmarks/graphdisplay.js new file mode 100644 index 00000000..ba715322 --- /dev/null +++ b/docs/benchmarks/graphdisplay.js @@ -0,0 +1,1427 @@ +'use strict'; + +$(document).ready(function() { + /* The state of the parameters in the sidebar. Dictionary mapping + strings to arrays containing the "enabled" configurations. */ + var state = null; + /* The name of the current benchmark being displayed. */ + var current_benchmark = null; + /* An array of graphs being displayed. */ + var graphs = []; + var orig_graphs = []; + /* An array of commit revisions being displayed */ + var current_revisions = []; + /* True when log scaling is enabled. */ + var log_scale = false; + /* True when zooming in on the y-axis. */ + var zoom_y_axis = false; + /* True when log scaling is enabled. */ + var reference_scale = false; + /* True when selecting a reference point */ + var select_reference = false; + /* The reference value */ + var reference = 1.0; + /* Whether to show the legend */ + var show_legend = true; + /* Is even commit spacing being used? */ + var even_spacing = false; + var even_spacing_revisions = []; + /* Is date scale being used ? */ + var date_scale = false; + var date_to_revision = {}; + /* A little div to handle tooltip placement on the graph */ + var tooltip = null; + /* X-axis coordinate axis in the data set; always 0 for + non-parameterized tests where revision and date are the only potential x-axis */ + var x_coordinate_axis = 0; + var x_coordinate_is_category = false; + /* List of lists of value combinations to plot (apart from x-axis) + in parameterized tests. */ + var benchmark_param_selection = [[null]]; + /* Highlighted revisions */ + var highlighted_revisions = null; + /* Whether benchmark graph display was set up */ + var benchmark_graph_display_ready = false; + + + /* UTILITY FUNCTIONS */ + function arr_remove_from(a, x) { + var out = []; + $.each(a, function(i, val) { + if (x !== val) { + out.push(val); + } + }); + return out; + } + + function obj_copy(obj) { + var newobj = {}; + $.each(obj, function(key, val) { + newobj[key] = val; + }); + return newobj; + } + + function obj_length(obj) { + var i = 0; + for (var x in obj) + ++i; + return i; + } + + function obj_get_first_key(data) { + for (var prop in data) + return prop; + } + + function no_data(ajax, status, error) { + $("#error-message").text( + "No data for this combination of filters. "); + $("#error").modal('show'); + } + + function get_x_from_revision(rev) { + if (date_scale) { + return $.asv.main_json.revision_to_date[rev]; + } else { + return rev; + } + } + + function get_commit_hash(x) { + // Return the commit hash in the current graph located at position x + if (date_scale) { + x = date_to_revision[x]; + } + return $.asv.get_commit_hash(x); + } + + + function display_benchmark(bm_name, state_selection, highlight_revisions) { + setup_benchmark_graph_display(); + + $('#graph-display').show(); + $('#summarygrid-display').hide(); + $('#regressions-display').hide(); + $('.tooltip').remove(); + + if (reference_scale) { + reference_scale = false; + $('#reference').removeClass('active'); + reference = 1.0; + } + current_benchmark = bm_name; + highlighted_revisions = highlight_revisions; + $("#title").text(bm_name); + setup_benchmark_params(state_selection); + replace_graphs(); + } + + function setup_benchmark_graph_display() { + if (benchmark_graph_display_ready) { + return; + } + benchmark_graph_display_ready = true; + + /* When the window resizes, redraw the graphs */ + $(window).on('resize', function() { + update_graphs(); + }); + + var nav = $("#graphdisplay-navigation"); + + /* Make the static tooltips look correct */ + $('[data-toggle="tooltip"]').tooltip({container: 'body'}); + + /* Add insertion point for benchmark parameters */ + var state_params_nav = $("
"); + nav.append(state_params_nav); + + /* Add insertion point for benchmark parameters */ + var bench_params_nav = $("
"); + nav.append(bench_params_nav); + + /* Benchmark panel */ + var panel_body = $.asv.ui.make_panel(nav, 'benchmark'); + + var tree = $('