Skip to content

Commit

Permalink
Add benchmark for high pin_subpackage count recipe
Browse files Browse the repository at this point in the history
This is a performance regression benchmark for
conda#5224

Signed-off-by: Marcel Bargull <marcel.bargull@udo.edu>
  • Loading branch information
mbargull committed Mar 20, 2024
1 parent 3b1f4f1 commit 549f138
Show file tree
Hide file tree
Showing 2 changed files with 182 additions and 0 deletions.
147 changes: 147 additions & 0 deletions tests/test-recipes/metadata/_pin_subpackage_benchmark/meta.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
# Performance regression test for https://github.com/conda/conda-build/pull/5224
# This is a reduced version of
# https://github.com/conda-forge/arrow-cpp-feedstock/blob/e6f573674c5f9c35c6a614a1563b2fe3eeb3e72b/recipe/meta.yaml
# stripped of everything apart from the large number of inter-output
# pin_subpackage dependencies/run_exports.

package:
name: apache-arrow
version: 15.0.2

outputs:
- name: libarrow-all
build:
run_exports:
- {{ pin_subpackage("libarrow", max_pin="x") }}
- {{ pin_subpackage("libarrow-acero", max_pin="x") }}
- {{ pin_subpackage("libarrow-dataset", max_pin="x") }}
- {{ pin_subpackage("libarrow-flight", max_pin="x") }}
- {{ pin_subpackage("libarrow-flight-sql", max_pin="x") }}
- {{ pin_subpackage("libarrow-gandiva", max_pin="x") }}
- {{ pin_subpackage("libarrow-substrait", max_pin="x") }}
- {{ pin_subpackage("libparquet", max_pin="x") }}
requirements:
host:
- {{ pin_subpackage("libarrow", exact=True) }}
- {{ pin_subpackage("libarrow-acero", exact=True) }}
- {{ pin_subpackage("libarrow-dataset", exact=True) }}
- {{ pin_subpackage("libarrow-flight", exact=True) }}
- {{ pin_subpackage("libarrow-flight-sql", exact=True) }}
- {{ pin_subpackage("libarrow-gandiva", exact=True) }}
- {{ pin_subpackage("libarrow-substrait", exact=True) }}
- {{ pin_subpackage("libparquet", exact=True) }}
run:
- {{ pin_subpackage("libarrow", exact=True) }}
- {{ pin_subpackage("libarrow-acero", exact=True) }}
- {{ pin_subpackage("libarrow-dataset", exact=True) }}
- {{ pin_subpackage("libarrow-flight", exact=True) }}
- {{ pin_subpackage("libarrow-flight-sql", exact=True) }}
- {{ pin_subpackage("libarrow-gandiva", exact=True) }}
- {{ pin_subpackage("libarrow-substrait", exact=True) }}
- {{ pin_subpackage("libparquet", exact=True) }}

- name: libarrow
build:
run_exports:
- {{ pin_subpackage("libarrow", max_pin="x") }}

- name: libarrow-acero
build:
run_exports:
- {{ pin_subpackage("libarrow-acero", max_pin="x") }}
requirements:
host:
- {{ pin_subpackage("libarrow", exact=True) }}
run:
- {{ pin_subpackage("libarrow", exact=True) }}

- name: libarrow-dataset
build:
run_exports:
- {{ pin_subpackage("libarrow-dataset", max_pin="x") }}
requirements:
host:
- {{ pin_subpackage("libarrow", exact=True) }}
- {{ pin_subpackage("libarrow-acero", exact=True) }}
- {{ pin_subpackage("libparquet", exact=True) }}
run:
- {{ pin_subpackage("libarrow", exact=True) }}
- {{ pin_subpackage("libarrow-acero", exact=True) }}
- {{ pin_subpackage("libparquet", exact=True) }}

- name: libarrow-flight
build:
run_exports:
- {{ pin_subpackage("libarrow-flight", max_pin="x") }}
requirements:
run:
- {{ pin_subpackage("libarrow", exact=True) }}

- name: libarrow-flight-sql
build:
run_exports:
- {{ pin_subpackage("libarrow-flight-sql", max_pin="x") }}
requirements:
host:
- {{ pin_subpackage("libarrow", exact=True) }}
- {{ pin_subpackage("libarrow-flight", exact=True) }}
run:
- {{ pin_subpackage("libarrow", exact=True) }}
- {{ pin_subpackage("libarrow-flight", exact=True) }}

- name: libarrow-gandiva
build:
run_exports:
- {{ pin_subpackage("libarrow-gandiva", max_pin="x") }}
requirements:
build:
host:
- {{ pin_subpackage("libarrow", max_pin="x") }}
run:
- {{ pin_subpackage("libarrow", exact=True) }}

- name: libarrow-substrait
build:
run_exports:
- {{ pin_subpackage("libarrow-substrait", max_pin="x") }}
requirements:
host:
- {{ pin_subpackage("libarrow", exact=True) }}
- {{ pin_subpackage("libarrow-acero", exact=True) }}
- {{ pin_subpackage("libarrow-dataset", exact=True) }}
run:
- {{ pin_subpackage("libarrow", exact=True) }}
- {{ pin_subpackage("libarrow-acero", exact=True) }}
- {{ pin_subpackage("libarrow-dataset", exact=True) }}

- name: libparquet
build:
run_exports:
- {{ pin_subpackage("libparquet", max_pin="x") }}
requirements:
host:
- {{ pin_subpackage("libarrow", max_pin="x") }}
run:
- {{ pin_subpackage("libarrow", exact=True) }}

- name: pyarrow
requirements:
host:
- {{ pin_subpackage("libarrow-all", exact=True) }}
run:
- {{ pin_subpackage("libarrow", exact=True) }}
- {{ pin_subpackage("libarrow-acero", exact=True) }}
- {{ pin_subpackage("libarrow-dataset", exact=True) }}
- {{ pin_subpackage("libarrow-flight", exact=True) }}
- {{ pin_subpackage("libarrow-flight-sql", exact=True) }}
- {{ pin_subpackage("libarrow-gandiva", exact=True) }}
- {{ pin_subpackage("libarrow-substrait", exact=True) }}
- {{ pin_subpackage("libparquet", exact=True) }}

- name: pyarrow-tests
requirements:
host:
- {{ pin_subpackage("libarrow-all", exact=True) }}
- {{ pin_subpackage('pyarrow', exact=True) }}
run:
- {{ pin_subpackage('pyarrow', exact=True) }}
35 changes: 35 additions & 0 deletions tests/test_api_render.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import os
import re
from itertools import count, islice

import pytest
import yaml
Expand All @@ -15,6 +16,7 @@

from conda_build import api, render
from conda_build.conda_interface import cc_conda_build
from conda_build.variants import validate_spec

from .utils import metadata_dir, variants_dir

Expand Down Expand Up @@ -299,3 +301,36 @@ def test_pin_expression_works_with_python_prereleases(testing_config):
assert len(ms) == 2
m = next(m_[0] for m_ in ms if m_[0].meta["package"]["name"] == "bar")
assert "python >=3.10.0rc1,<3.11.0a0" in m.meta["requirements"]["run"]


@pytest.mark.benchmark
def test_pin_subpackage_benchmark(testing_config):
# ereformance regression test for https://github.com/conda/conda-build/pull/5224
recipe = os.path.join(metadata_dir, "_pin_subpackage_benchmark")

# Create variant config of size comparable (for subdir linux-64) to
# https://github.com/conda-forge/conda-forge-pinning-feedstock/blob/3c7d60f56a8cb7d1b8f5a8da0b02ae1f1f0982d7/recipe/conda_build_config.yaml
def create_variant():
# ("pkg_1, ("1.1", "1.2", ...)), ("pkg_2", ("2.1", "2.2", ...)), ...
packages = ((f"pkg_{i}", (f"{i}.{j}" for j in count(1))) for i in count(1))
variant = {}
variant["pin_run_as_build"] = {
package: {"max_pin": "x.x"}
for package, _ in islice(packages, 7)
}
variant["zip_keys"] = []
for version_count, package_count in [(1, 4), (4, 3), (4, 3)]:
zipped = []
for package, versions in islice(packages, package_count):
zipped.append(package)
variant[package] = list(islice(versions, version_count))
variant["zip_keys"].append(zipped)
for version_count, package_count in [(3, 1), (2, 4), (1, 327)]:
for package, versions in islice(packages, package_count):
variant[package] = list(islice(versions, version_count))
validate_spec("<generated>", variant)
return variant

render("arrow-cpp-feedstock/recipe", channels=[], variant=create_variant())
ms = api.render(recipe, config=testing_config, channels=[])
assert len(ms) == 11

0 comments on commit 549f138

Please sign in to comment.