Skip to content

More robust environment installs for ASV benchmarks - #1776

Open
cmdupuis3 wants to merge 4 commits into
UXARRAY:mainfrom
cmdupuis3:cmd/bench-install-all-extras
Open

cmdupuis3 wants to merge 4 commits into
UXARRAY:mainfrom
cmdupuis3:cmd/bench-install-all-extras

Conversation

@cmdupuis3

@cmdupuis3 cmdupuis3 commented Sep 21, 2026

Copy link
Copy Markdown
Collaborator

Closes #1777

Overview

This PR solves #1777 and also (hopefully) optimizes the ASV CI a bit. Basically, ASV installs its own environments for benchmarking, which means it was unaware of how the optional dependencies work. Instead, we have to write its pip install line manually, but we also have the option to cache the results for the subsequent commits in the ASV runs.

PR Checklist

General

  • An issue is created and linked
  • Added appropriate labels (if your uxarray repo permissions allow it)
  • Filled out Overview and Expected Usage (if applicable) sections

Testing & Benchmarking

  • There is adequate test coverage of changes from this PR (add new tests if needed)
  • If this PR could affect performance, ran ASV benchmarks and confirmed they show expected behavior (add a new benchmark if necessary)

Documentation and Examples

  • Docstrings updated with any function changes, and included in all new functions

AI Disclosure

AI Usage: Claude Opus 5

  • I have tested and take responsibility for all AI-generated content in my PR.

cmdupuis3 and others added 2 commits September 21, 2026 14:32
UXARRAY#1548 moved cartopy, matplotlib, spatialpandas and the rest of the
geospatial/plotting stack out of the core dependencies and into the "geo"
and "viz" extras. It did not touch benchmarks/asv.conf.json, and asv does
not use the ci/environment.yml environment that runs it -- it built its
own from "matrix", which listed xarray and netcdf4 and nothing else, and
then pip-installed the wheel there, which since UXARRAY#1548 resolves core
dependencies only.

So two benchmarks have been reporting "failed" rather than a time, on
every commit including main:

    mpas_ocean.GeoDataFrame.time_to_geodataframe
        OptionalDependencyNotFoundError: Failed to import: spatialpandas.
    mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection
        OptionalDependencyNotFoundError: Failed to import: cartopy, matplotlib.

Point asv at ci/environment.yml instead. Benchmarks then run against the
package set the project is actually tested against, and a dependency has
to be added in one place rather than two -- which fixes the class of drift
rather than the two instances of it that happen to be visible today.

Conda now supplies the dependencies, so the project is installed with
--no-deps, as the test job in ci.yml already does. Without that, pip would
resolve the wheel's requirements from PyPI and, together with the
--force-reinstall asv continuous needs (asv UXARRAYgh-1421), lay PyPI wheels over
conda's builds on every commit.

The matrix keeps only what the environment file does not carry. xarray and
netcdf4 come from the file now. python-build, wheel and setuptools_scm are
named explicitly because asv seeds an environment with wheel and pip only
when it builds that environment without a file.

Note that ci/environment.yml pins no Python version on purpose, and asv
only injects "pythons" when there is no environment file, so conda now
resolves the interpreter. Benchmarks move from 3.11 to whatever that
resolves to, matching the environment asv itself runs in. A given
comparison stays internally valid -- asv continuous installs both commits
into the same environment -- but absolute timings are not comparable with
results recorded before this.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
asv does not benchmark in the uxarray_build environment set up by this
workflow; it builds its own under benchmarks/env/, and every run gets a
fresh runner, so that environment is solved and linked from scratch each
time. Pointing asv at ci/environment.yml did not change that -- it changed
which packages go in, not how often they go in.

Restore the directory instead. Once it is present, Environment.create()
returns without calling _setup() as soon as asv-env-info.json matches the
configured tool, python and requirements (asv/environment.py), so the
whole solve is skipped.

That check does not inspect the installed packages, so the key carries
everything that determines them: ci/environment.yml for the package set
and asv.conf.json for the matrix and for which environment file is in use.
There are deliberately no restore-keys -- a prefix match would restore an
environment built from an older ci/environment.yml and asv would reuse it
without noticing, which is the failure this is meant to avoid.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@cmdupuis3 cmdupuis3 self-assigned this Sep 21, 2026
@cmdupuis3 cmdupuis3 added bug Something isn't working run-benchmark Run ASV benchmark workflow labels Sep 21, 2026
@github-actions

github-actions Bot commented Sep 21, 2026

Copy link
Copy Markdown

ASV Benchmarking

Benchmark Comparison Results

Benchmarks that have stayed the same:

Change Before [1e079ce] After [1472f0c] Ratio Benchmark (Parameter)
5.27±0.02ms 5.28±0.06ms 1.00 bench_connectivity.Connectivity.time_edge_face('120km')
1.72±0.01ms 1.73±0.02ms 1.00 bench_connectivity.Connectivity.time_edge_face('480km')
4.34±0.09ms 4.23±0.04ms 0.98 bench_connectivity.Connectivity.time_edge_node('120km')
1.35±0.01ms 1.35±0.02ms 1.00 bench_connectivity.Connectivity.time_edge_node('480km')
4.20±0.04ms 4.22±0.03ms 1.00 bench_connectivity.Connectivity.time_face_edge('120km')
1.35±0.02ms 1.36±0.02ms 1.01 bench_connectivity.Connectivity.time_face_edge('480km')
6.16±0.05ms 6.22±0.07ms 1.01 bench_connectivity.Connectivity.time_face_face('120km')
2.09±0.01ms 2.05±0.01ms 0.98 bench_connectivity.Connectivity.time_face_face('480km')
60.1±3μs 61.0±1μs 1.02 bench_connectivity.Connectivity.time_face_node('120km')
58.4±1μs 59.8±2μs 1.02 bench_connectivity.Connectivity.time_face_node('480km')
440±8μs 439±5μs 1.00 bench_connectivity.Connectivity.time_n_nodes_per_face('120km')
351±3μs 358±20μs 1.02 bench_connectivity.Connectivity.time_n_nodes_per_face('480km')
5.60±0.03ms 5.80±0.1ms 1.04 bench_connectivity.Connectivity.time_node_edge('120km')
1.71±0ms 1.73±0.01ms 1.01 bench_connectivity.Connectivity.time_node_edge('480km')
77.1±0.8ms 81.2±4ms 1.05 bench_connectivity.Connectivity.time_node_face('120km')
4.88±0.04ms 4.94±0.1ms 1.01 bench_connectivity.Connectivity.time_node_face('480km')
7.48±1ms 7.56±0.05ms 1.01 face_bounds.FaceBounds.time_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/mpas/QU/oQU480.231010.nc'))
2.48±0.1ms 2.57±0.04ms 1.04 face_bounds.FaceBounds.time_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/scrip/outCSne8/outCSne8.nc'))
6.70±7s 9.78±10ms ~0.00 face_bounds.FaceBounds.time_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/geoflow-small/grid.nc'))
1.97±0.03ms 1.97±0.02ms 1.00 face_bounds.FaceBounds.time_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/quad-hexagon/grid.nc'))
57.3k 57.3k 1.00 face_bounds.FaceBounds.track_nbytes_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/mpas/QU/oQU480.231010.nc'))
12.3k 12.3k 1.00 face_bounds.FaceBounds.track_nbytes_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/scrip/outCSne8/outCSne8.nc'))
123k 123k 1.00 face_bounds.FaceBounds.track_nbytes_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/geoflow-small/grid.nc'))
128 128 1.00 face_bounds.FaceBounds.track_nbytes_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/quad-hexagon/grid.nc'))
1.27M 1.27M 1.00 face_bounds.FaceBounds.track_nbytes_grid_with_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/mpas/QU/oQU480.231010.nc'))
50.1k 50.1k 1.00 face_bounds.FaceBounds.track_nbytes_grid_with_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/scrip/outCSne8/outCSne8.nc'))
1.48M 1.48M 1.00 face_bounds.FaceBounds.track_nbytes_grid_with_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/geoflow-small/grid.nc'))
712 712 1.00 face_bounds.FaceBounds.track_nbytes_grid_with_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/quad-hexagon/grid.nc'))
1.99M 1.99M 1.00 face_bounds.FaceBounds.track_peakmem_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/mpas/QU/oQU480.231010.nc'))
2M 2M 1.00 face_bounds.FaceBounds.track_peakmem_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/scrip/outCSne8/outCSne8.nc'))
2.16M 2.16M 1.00 face_bounds.FaceBounds.track_peakmem_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/geoflow-small/grid.nc'))
38.3k 38.3k 1.00 face_bounds.FaceBounds.track_peakmem_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/quad-hexagon/grid.nc'))
316M 316M 1.00 face_bounds.FaceBoundsColdStartRss.peakmem_open_and_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/mpas/QU/oQU480.231010.nc'))
358M 359M 1.00 face_bounds.FaceBoundsColdStartRss.peakmem_open_and_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/scrip/outCSne8/outCSne8.nc'))
320M 317M 0.99 face_bounds.FaceBoundsColdStartRss.peakmem_open_and_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/geoflow-small/grid.nc'))
317M 317M 1.00 face_bounds.FaceBoundsColdStartRss.peakmem_open_and_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/quad-hexagon/grid.nc'))
1.08±0.03μs 1.15±0.02μs 1.07 geometry_kernels.AccucrossKernels.time_accucross
2.51±0.04μs 2.48±0.03μs 0.99 geometry_kernels.AccucrossKernels.time_accucross_pair
420±20ns 410±20ns 0.98 geometry_kernels.EFTPrimitives.time_acc_sqrt_re
386±9ns 410±20ns 1.06 geometry_kernels.EFTPrimitives.time_diff_of_products
371±10ns 340±10ns 0.92 geometry_kernels.EFTPrimitives.time_two_prod
351±20ns 376±70ns 1.07 geometry_kernels.EFTPrimitives.time_two_sum
606±20ns 595±10ns 0.98 geometry_kernels.GCAConstLatIntersection.time_accux_constlat_kernel
671±30ns 681±20ns 1.01 geometry_kernels.GCAConstLatIntersection.time_gca_const_lat_intersection
727±20ns 721±10ns 0.99 geometry_kernels.GCAConstLatIntersection.time_try_gca_const_lat_intersection
711±20ns 726±50ns 1.02 geometry_kernels.GCAGCAIntersection.time_accux_gca_kernel
826±10ns 806±20ns 0.98 geometry_kernels.GCAGCAIntersection.time_gca_gca_intersection
1.00±0.2μs 936±10ns 0.94 geometry_kernels.GCAGCAIntersection.time_try_gca_gca_intersection
37.1±0.3μs 36.1±0.6μs 0.97 geometry_kernels.OrientPredicates.time_on_minor_arc
641±20ns 661±20ns 1.03 geometry_kernels.OrientPredicates.time_orient3d_on_sphere
3.13±0.02ms 3.13±0.01ms 1.00 geometry_samebody.SameBodyConstLat.time_accux_dispatch
1.33±0.01ms 1.33±0ms 1.00 geometry_samebody.SameBodyConstLat.time_accux_kernel
2.11±0.01ms 2.09±0ms 0.99 geometry_samebody.SameBodyConstLat.time_fp64_dispatch
160±7μs 156±0.7μs 0.98 geometry_samebody.SameBodyConstLat.time_fp64_kernel
27.8±0ms 27.8±0.07ms 1.00 geometry_samebody_gcagca.SameBodyGcaGca.time_accux_dispatch
6.82±0ms 6.81±0ms 1.00 geometry_samebody_gcagca.SameBodyGcaGca.time_accux_kernel
23.5±0.03ms 21.0±0.01ms ~0.89 geometry_samebody_gcagca.SameBodyGcaGca.time_fp64_dispatch
871±4μs 880±1μs 1.01 geometry_samebody_gcagca.SameBodyGcaGca.time_fp64_kernel
873±5ms 882±10ms 1.01 import.Imports.timeraw_import_uxarray
275M 275M 1.00 import.Imports.track_peakmem_import_uxarray
2.24±0.03ms 2.26±0.03ms 1.01 mpas_ocean.CheckNorm.time_check_norm('120km')
1.81±0.02ms 1.81±0.02ms 1.00 mpas_ocean.CheckNorm.time_check_norm('480km')
1.06±0.01ms 1.06±0.01ms 1.00 mpas_ocean.ConnectivityConstruction.time_face_face_connectivity('120km')
554±9μs 540±6μs 0.97 mpas_ocean.ConnectivityConstruction.time_face_face_connectivity('480km')
656±8μs 659±6μs 1.00 mpas_ocean.ConnectivityConstruction.time_n_nodes_per_face('120km')
586±6μs 575±7μs 0.98 mpas_ocean.ConnectivityConstruction.time_n_nodes_per_face('480km')
4.94±0.04ms 4.99±0.02ms 1.01 mpas_ocean.ConstructFaceLatLon.time_cartesian_averaging('120km')
3.48±0.04ms 3.41±0.01ms 0.98 mpas_ocean.ConstructFaceLatLon.time_cartesian_averaging('480km')
104±0.8ms 104±0.8ms 1.00 mpas_ocean.ConstructFaceLatLon.time_welzl('120km')
10.4±0.04ms 10.1±0.3ms 0.98 mpas_ocean.ConstructFaceLatLon.time_welzl('480km')
20.4±0.02ms 20.4±0.02ms 1.00 mpas_ocean.ConstructTreeStructures.time_ball_tree('120km')
1.12±0.02ms 1.11±0.01ms 0.99 mpas_ocean.ConstructTreeStructures.time_ball_tree('480km')
10.2±0.02ms 10.2±0.03ms 1.00 mpas_ocean.ConstructTreeStructures.time_kd_tree('120km')
722±10μs 718±20μs 0.99 mpas_ocean.ConstructTreeStructures.time_kd_tree('480km')
522±5ms 517±3ms 0.99 mpas_ocean.CrossSections.time_const_lat('120km', 1)
261±0.5ms 260±0.8ms 1.00 mpas_ocean.CrossSections.time_const_lat('120km', 2)
136±0.6ms 136±0.6ms 1.00 mpas_ocean.CrossSections.time_const_lat('120km', 4)
465±2ms 465±2ms 1.00 mpas_ocean.CrossSections.time_const_lat('480km', 1)
232±1ms 232±0.6ms 1.00 mpas_ocean.CrossSections.time_const_lat('480km', 2)
120±0.4ms 120±0.6ms 1.00 mpas_ocean.CrossSections.time_const_lat('480km', 4)
336M 336M 1.00 mpas_ocean.CrossSectionsPeakMem.peakmem_const_lat('120km', 1)
336M 336M 1.00 mpas_ocean.CrossSectionsPeakMem.peakmem_const_lat('120km', 2)
336M 336M 1.00 mpas_ocean.CrossSectionsPeakMem.peakmem_const_lat('120km', 4)
319M 319M 1.00 mpas_ocean.CrossSectionsPeakMem.peakmem_const_lat('480km', 1)
319M 321M 1.01 mpas_ocean.CrossSectionsPeakMem.peakmem_const_lat('480km', 2)
319M 319M 1.00 mpas_ocean.CrossSectionsPeakMem.peakmem_const_lat('480km', 4)
23.3±0.05ms 24.2±0.03ms 1.04 mpas_ocean.DualMesh.time_dual_mesh_construction('120km')
2.63±0.03ms 2.61±0.03ms 0.99 mpas_ocean.DualMesh.time_dual_mesh_construction('480km')
13.7±0.1ms 13.7±0.3ms 1.00 mpas_ocean.FaceAreas.time_face_areas('120km')
3.70±0.03ms 3.72±0.03ms 1.01 mpas_ocean.FaceAreas.time_face_areas('480km')
229k 229k 1.00 mpas_ocean.FaceAreas.track_nbytes_face_areas('120km')
14.3k 14.3k 1.00 mpas_ocean.FaceAreas.track_nbytes_face_areas('480km')
2.12M 2.12M 1.00 mpas_ocean.FaceAreas.track_peakmem_face_areas('120km')
743k 743k 1.00 mpas_ocean.FaceAreas.track_peakmem_face_areas('480km')
832±3ms 834±9ms 1.00 mpas_ocean.GeoDataFrame.time_to_geodataframe('120km', False)
50.0±0.6ms 50.8±1ms 1.02 mpas_ocean.GeoDataFrame.time_to_geodataframe('120km', True)
71.1±0.4ms 71.9±0.7ms 1.01 mpas_ocean.GeoDataFrame.time_to_geodataframe('480km', False)
5.32±0.1ms 5.30±0.1ms 1.00 mpas_ocean.GeoDataFrame.time_to_geodataframe('480km', True)
14.5±0.06ms 14.5±0.04ms 1.00 mpas_ocean.Gradient.time_gradient('120km')
2.05±0.02ms 2.03±0.02ms 0.99 mpas_ocean.Gradient.time_gradient('480km')
457k 457k 1.00 mpas_ocean.Gradient.track_nbytes_gradient('120km')
28.7k 28.7k 1.00 mpas_ocean.Gradient.track_nbytes_gradient('480km')
3.43M 3.43M 1.00 mpas_ocean.Gradient.track_peakmem_gradient('120km')
218k 218k 1.00 mpas_ocean.Gradient.track_peakmem_gradient('480km')
334M 332M 0.99 mpas_ocean.GradientColdStartRss.peakmem_gradient('120km')
311M 311M 1.00 mpas_ocean.GradientColdStartRss.peakmem_gradient('480km')
365±9μs 365±10μs 1.00 mpas_ocean.HoleEdgeIndices.time_construct_hole_edge_indices('120km')
186±3μs 194±4μs 1.04 mpas_ocean.HoleEdgeIndices.time_construct_hole_edge_indices('480km')
584±3μs 598±9μs 1.02 mpas_ocean.Integrate.time_integrate('120km')
484±7μs 519±9μs 1.07 mpas_ocean.Integrate.time_integrate('480km')
18.4M 18.4M 1.00 mpas_ocean.Integrate.track_nbytes_integrate('120km')
1.2M 1.2M 1.00 mpas_ocean.Integrate.track_nbytes_integrate('480km')
184±0.8ms 186±0.9ms 1.01 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('120km', 'exclude')
185±2ms 187±3ms 1.01 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('120km', 'include')
184±2ms 184±2ms 1.00 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('120km', 'split')
13.5±0.2ms 13.8±0.2ms 1.02 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('480km', 'exclude')
13.4±0.06ms 13.4±0.06ms 1.00 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('480km', 'include')
13.3±0.05ms 13.5±0.1ms 1.02 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('480km', 'split')
270±0.2ms 271±0.5ms 1.00 mpas_ocean.NeighborhoodBuild.time_build('120km', 1.0)
1.43±0s 1.43±0s 1.00 mpas_ocean.NeighborhoodBuild.time_build('120km', 15.0)
558±1ms 559±2ms 1.00 mpas_ocean.NeighborhoodBuild.time_build('120km', 5.0)
14.6±0.01ms 14.6±0.05ms 1.00 mpas_ocean.NeighborhoodBuild.time_build('480km', 1.0)
27.9±0.02ms 28.0±0.1ms 1.01 mpas_ocean.NeighborhoodBuild.time_build('480km', 15.0)
18.0±0.02ms 18.1±0.04ms 1.00 mpas_ocean.NeighborhoodBuild.time_build('480km', 5.0)
266±0.1ms 266±0.2ms 1.00 mpas_ocean.NeighborhoodBuild.time_query_radius('120km', 1.0)
1.41±0s 1.42±0s 1.00 mpas_ocean.NeighborhoodBuild.time_query_radius('120km', 15.0)
552±2ms 555±2ms 1.01 mpas_ocean.NeighborhoodBuild.time_query_radius('120km', 5.0)
14.2±0.01ms 14.2±0.03ms 1.00 mpas_ocean.NeighborhoodBuild.time_query_radius('480km', 1.0)
27.2±0.03ms 27.4±0.06ms 1.00 mpas_ocean.NeighborhoodBuild.time_query_radius('480km', 15.0)
17.6±0.01ms 17.6±0.02ms 1.00 mpas_ocean.NeighborhoodBuild.time_query_radius('480km', 5.0)
1.19 1.19 1.00 mpas_ocean.NeighborhoodBuild.track_mean_neighbors('120km', 1.0)
612.76 612.76 1.00 mpas_ocean.NeighborhoodBuild.track_mean_neighbors('120km', 15.0)
74.17 74.17 1.00 mpas_ocean.NeighborhoodBuild.track_mean_neighbors('120km', 5.0)
1.0 1.0 1.00 mpas_ocean.NeighborhoodBuild.track_mean_neighbors('480km', 1.0)
37.29 37.29 1.00 mpas_ocean.NeighborhoodBuild.track_mean_neighbors('480km', 15.0)
6.57 6.57 1.00 mpas_ocean.NeighborhoodBuild.track_mean_neighbors('480km', 5.0)
728k 728k 1.00 mpas_ocean.NeighborhoodBuild.track_nbytes_neighbors('120km', 1.0)
141M 141M 1.00 mpas_ocean.NeighborhoodBuild.track_nbytes_neighbors('120km', 15.0)
17.4M 17.4M 1.00 mpas_ocean.NeighborhoodBuild.track_nbytes_neighbors('120km', 5.0)
43k 43k 1.00 mpas_ocean.NeighborhoodBuild.track_nbytes_neighbors('480km', 1.0)
563k 563k 1.00 mpas_ocean.NeighborhoodBuild.track_nbytes_neighbors('480km', 15.0)
123k 123k 1.00 mpas_ocean.NeighborhoodBuild.track_nbytes_neighbors('480km', 5.0)
5.72M 5.72M 1.00 mpas_ocean.NeighborhoodBuild.track_peakmem_build('120km', 1.0)
145M 145M 1.00 mpas_ocean.NeighborhoodBuild.track_peakmem_build('120km', 15.0)
21.5M 21.5M 1.00 mpas_ocean.NeighborhoodBuild.track_peakmem_build('120km', 5.0)
362k 362k 1.00 mpas_ocean.NeighborhoodBuild.track_peakmem_build('480km', 1.0)
824k 824k 1.00 mpas_ocean.NeighborhoodBuild.track_peakmem_build('480km', 15.0)
384k 384k 1.00 mpas_ocean.NeighborhoodBuild.track_peakmem_build('480km', 5.0)
47.4±0.5ms 47.6±0.5ms 1.00 mpas_ocean.NeighborhoodDask.time_mean('120km', 'grid_chunks')
24.9±0.08ms 24.9±0.08ms 1.00 mpas_ocean.NeighborhoodDask.time_mean('120km', 'numpy')
44.2±0.9ms 44.6±0.6ms 1.01 mpas_ocean.NeighborhoodDask.time_mean('120km', 'time_chunks')
10.6±0.09ms 10.9±0.2ms 1.03 mpas_ocean.NeighborhoodDask.time_mean('480km', 'grid_chunks')
544±10μs 553±7μs 1.02 mpas_ocean.NeighborhoodDask.time_mean('480km', 'numpy')
7.55±0.03ms 7.96±0.1ms 1.05 mpas_ocean.NeighborhoodDask.time_mean('480km', 'time_chunks')
5.84M 5.84M 1.00 mpas_ocean.NeighborhoodDask.track_peakmem_mean('120km', 'grid_chunks')
2.75M 2.75M 1.00 mpas_ocean.NeighborhoodDask.track_peakmem_mean('120km', 'numpy')
5.69M 5.68M 1.00 mpas_ocean.NeighborhoodDask.track_peakmem_mean('120km', 'time_chunks')
675k 675k 1.00 mpas_ocean.NeighborhoodDask.track_peakmem_mean('480km', 'grid_chunks')
176k 177k 1.00 mpas_ocean.NeighborhoodDask.track_peakmem_mean('480km', 'numpy')
554k 543k 0.98 mpas_ocean.NeighborhoodDask.track_peakmem_mean('480km', 'time_chunks')
13.8±0.01s 13.9±0.06s 1.01 mpas_ocean.NeighborhoodReduce.time_dataset_reduce('120km', 'mean')
14.6±0.02s 14.6±0.03s 1.00 mpas_ocean.NeighborhoodReduce.time_dataset_reduce('120km', 'median')
251±0.1ms 253±1ms 1.01 mpas_ocean.NeighborhoodReduce.time_dataset_reduce('480km', 'mean')
259±0.3ms 259±0.9ms 1.00 mpas_ocean.NeighborhoodReduce.time_dataset_reduce('480km', 'median')
1.47±0s 1.47±0s 1.00 mpas_ocean.NeighborhoodReduce.time_neighborhood_reduce('120km', 'mean')
1.68±0s 1.68±0s 1.00 mpas_ocean.NeighborhoodReduce.time_neighborhood_reduce('120km', 'median')
28.5±0.09ms 28.7±0.2ms 1.01 mpas_ocean.NeighborhoodReduce.time_neighborhood_reduce('480km', 'mean')
30.6±0.6ms 30.3±0.09ms 0.99 mpas_ocean.NeighborhoodReduce.time_neighborhood_reduce('480km', 'median')
44.8±0.05ms 44.8±0.04ms 1.00 mpas_ocean.NeighborhoodReduce.time_reduce('120km', 'mean')
259±0.1ms 259±0.1ms 1.00 mpas_ocean.NeighborhoodReduce.time_reduce('120km', 'median')
613±10μs 629±30μs 1.03 mpas_ocean.NeighborhoodReduce.time_reduce('480km', 'mean')
2.09±0.01ms 2.14±0.04ms 1.02 mpas_ocean.NeighborhoodReduce.time_reduce('480km', 'median')
239k 239k 1.00 mpas_ocean.NeighborhoodReduce.track_peakmem_reduce('120km', 'mean')
245k 245k 1.00 mpas_ocean.NeighborhoodReduce.track_peakmem_reduce('120km', 'median')
19.2k 19.2k 1.00 mpas_ocean.NeighborhoodReduce.track_peakmem_reduce('480km', 'mean')
19.7k 19.7k 1.00 mpas_ocean.NeighborhoodReduce.track_peakmem_reduce('480km', 'median')
348±5μs 366±10μs 1.05 mpas_ocean.PointInPolygon.time_face_search_lonlat('120km')
348±9μs 337±7μs 0.97 mpas_ocean.PointInPolygon.time_face_search_lonlat('480km')
333±2μs 332±9μs 1.00 mpas_ocean.PointInPolygon.time_face_search_xyz('120km')
329±4μs 333±20μs 1.01 mpas_ocean.PointInPolygon.time_face_search_xyz('480km')
219±0.2ms 219±0.3ms 1.00 mpas_ocean.RemapDownsample.time_bilinear_remapping
262±2ms 260±1ms 0.99 mpas_ocean.RemapDownsample.time_inverse_distance_weighted_remapping
15.4±0.05ms 15.6±0.2ms 1.01 mpas_ocean.RemapDownsample.time_nearest_neighbor_remapping
1.12±0.01s 1.14±0.03s 1.02 mpas_ocean.RemapUpsample.time_bilinear_remapping
36.1±0.4ms 36.5±0.7ms 1.01 mpas_ocean.RemapUpsample.time_inverse_distance_weighted_remapping
11.3±0.3ms 11.3±0.4ms 1.00 mpas_ocean.RemapUpsample.time_nearest_neighbor_remapping
9.06±0.05ms 9.16±0.1ms 1.01 mpas_ocean.ZonalAverage.time_zonal_average('120km')
4.75±0.01ms 4.89±0.1ms 1.03 mpas_ocean.ZonalAverage.time_zonal_average('480km')
338M 337M 1.00 mpas_ocean.ZonalAveragePeakMem.peakmem_zonal_average('120km')
321M 321M 1.00 mpas_ocean.ZonalAveragePeakMem.peakmem_zonal_average('480km')
6.60±0.02ms 6.90±0.2ms 1.05 quad_hexagon.QuadHexagon.time_open_dataset
5.53±0.03ms 5.55±0.06ms 1.00 quad_hexagon.QuadHexagon.time_open_grid
408 408 1.00 quad_hexagon.QuadHexagon.track_nbytes_open_dataset
392 392 1.00 quad_hexagon.QuadHexagon.track_nbytes_open_grid
73.6k 73.6k 1.00 quad_hexagon.QuadHexagon.track_peakmem_open_dataset
72.8k 72.8k 1.00 quad_hexagon.QuadHexagon.track_peakmem_open_grid

@cmdupuis3 cmdupuis3 changed the title Cmd/bench install all extras More robust environment installs for ASV benchmarks Sep 21, 2026
@cmdupuis3
cmdupuis3 marked this pull request as ready for review September 21, 2026 22:27

@Sevans711 Sevans711 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks reasonable, and seeing that the benchmarks all ran successfully here, I'm happy to approve!

One tiny non-blocking comment: is there a reason to use actions/cache@v4 instead of actions/cache@v6 here? The asv-benchmarking.yml file uses v6.

@Sevans711 Sevans711 added the benchmarking Related to benchmarks, memory usage, and/or time profiling label Sep 22, 2026
@cmdupuis3

Copy link
Copy Markdown
Collaborator Author

@Sevans711 Looks like an oversight, updated to v6

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

benchmarking Related to benchmarks, memory usage, and/or time profiling bug Something isn't working run-benchmark Run ASV benchmark workflow

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Optional dependencies causing certain benchmarks to fail

2 participants