Skip to content

Connectivity peakmem benchmarks - #1661

Open
cmdupuis3 wants to merge 17 commits into
UXARRAY:mainfrom
cmdupuis3:cmd/connectivity_peakmem
Open

cmdupuis3 wants to merge 17 commits into
UXARRAY:mainfrom
cmdupuis3:cmd/connectivity_peakmem

Conversation

@cmdupuis3

@cmdupuis3 cmdupuis3 commented Aug 8, 2026 •

Copy link
Copy Markdown
Collaborator

Closes #1660

Overview

Two sets of memory benchmarks, tracking allocations in isolation and total peakmem usage.

ConnectivityTracemalloc results from Derecho:

Resolution edge_face edge_node face_face n_nodes_per_face node_edge node_face
480km 204k 980k 888k 24.8k 127k 747k
120km 3.05M 15.5M 14.8M 239k 1.9M 11.9M
30km 68.2M 577M 351M 5.25M 41.9M 249M
15km 273M 2.31G 1.41G 21M 168M 996M
7.5km 1.09G 5.68G 5.29G 83.9M 671M 3.98G
3.75km 4.36G timeout timeout 336M 2.68G 15.9G

(face_edge is a flat 11.4k, face_node is a flat 2.54k)

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

  • Adequate tests are created if there is new functionality
  • Tests are not too basic (such as simply calling a function and nothing else)
  • If this PR could affect performance, ran ASV benchmarks and confirmed they show expected behavior (add a new benchmark if necessary)

Documentation

  • Docstrings have been added to all new functions
  • Docstrings have been updated with any function changes

AI Disclosure

AI Usage: Claude Opus 5

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

@cmdupuis3 cmdupuis3 self-assigned this Aug 8, 2026
@cmdupuis3 cmdupuis3 added the benchmarking Related to benchmarks, memory usage, and/or time profiling label Aug 8, 2026
@cmdupuis3 cmdupuis3 added the run-benchmark Run ASV benchmark workflow label Aug 21, 2026
@github-actions

github-actions Bot commented Aug 22, 2026 •

Copy link
Copy Markdown

ASV Benchmarking

Benchmark Comparison Results

Benchmarks that have improved:

Change Before [9609c3a] After [4871ee1] Ratio Benchmark (Parameter)
- 349M 317M 0.91 face_bounds.FaceBoundsColdStartRss.track_peakmem_open_and_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/mpas/QU/oQU480.231010.nc'))
- 349M 275M 0.79 import.Imports.track_peakmem_import_uxarray
- 349M 312M 0.9 mpas_ocean.GradientColdStartRss.track_peakmem_gradient('480km')

Benchmarks that have stayed the same:

Change Before [9609c3a] After [4871ee1] Ratio Benchmark (Parameter)
992±20μs 990±20μs 1.00 connectivity.Connectivity.time_edge_face('120km')
480±20μs 477±10μs 0.99 connectivity.Connectivity.time_edge_face('480km')
3.99±0.06ms 4.02±0.06ms 1.01 connectivity.Connectivity.time_edge_node('120km')
1.31±0.02ms 1.32±0.04ms 1.01 connectivity.Connectivity.time_edge_node('480km')
71.7±3μs 73.0±10μs 1.02 connectivity.Connectivity.time_face_edge('120km')
71.0±5μs 68.1±4μs 0.96 connectivity.Connectivity.time_face_edge('480km')
1.03±0.03ms 1.00±0.03ms 0.97 connectivity.Connectivity.time_face_face('120km')
429±30μs 451±30μs 1.05 connectivity.Connectivity.time_face_face('480km')
62.7±10μs 63.0±10μs 1.00 connectivity.Connectivity.time_face_node('120km')
64.3±10μs 66.9±10μs 1.04 connectivity.Connectivity.time_face_node('480km')
493±20μs 486±50μs 0.99 connectivity.Connectivity.time_n_nodes_per_face('120km')
432±30μs 421±10μs 0.98 connectivity.Connectivity.time_n_nodes_per_face('480km')
1.36±0.03ms 1.37±0.04ms 1.00 connectivity.Connectivity.time_node_edge('120km')
501±10μs 489±10μs 0.98 connectivity.Connectivity.time_node_edge('480km')
83.0±2ms 77.9±2ms 0.94 connectivity.Connectivity.time_node_face('120km')
5.19±0.07ms 5.10±0.05ms 0.98 connectivity.Connectivity.time_node_face('480km')
1.42M 1.42M 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_edge_face('120km')
106k 106k 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_edge_face('480km')
6.48M 6.48M 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_edge_node('120km')
417k 417k 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_edge_node('480km')
2.42k 2.42k 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_face_edge('120km')
2.42k 2.42k 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_face_edge('480km')
1.6M 1.6M 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_face_face('120km')
101k 101k 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_face_face('480km')
2.54k 2.54k 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_face_node('120km')
2.54k 2.54k 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_face_node('480km')
240k 240k 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_n_nodes_per_face('120km')
25.8k 25.8k 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_n_nodes_per_face('480km')
1.9M 1.9M 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_node_edge('120km')
127k 127k 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_node_edge('480km')
11.9M 11.9M 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_node_face('120km')
747k 747k 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_node_face('480km')
8.51±0.1ms 8.46±0.09ms 0.99 face_bounds.FaceBounds.time_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/mpas/QU/oQU480.231010.nc'))
2.89±0.1ms 2.80±0.07ms 0.97 face_bounds.FaceBounds.time_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/scrip/outCSne8/outCSne8.nc'))
7.20±7s 10.2±10ms ~0.00 face_bounds.FaceBounds.time_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/geoflow-small/grid.nc'))
1.60±0.05ms 1.54±0.04ms 0.97 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.98M 1.98M 1.00 face_bounds.FaceBounds.track_peakmem_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/mpas/QU/oQU480.231010.nc'))
1.97M 1.97M 1.00 face_bounds.FaceBounds.track_peakmem_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/scrip/outCSne8/outCSne8.nc'))
2.13M 2.13M 1.00 face_bounds.FaceBounds.track_peakmem_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/geoflow-small/grid.nc'))
35.5k 35.5k 1.00 face_bounds.FaceBounds.track_peakmem_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/quad-hexagon/grid.nc'))
349M 318M 0.91 face_bounds.FaceBoundsColdStartRss.track_peakmem_open_and_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/scrip/outCSne8/outCSne8.nc'))
349M 319M 0.91 face_bounds.FaceBoundsColdStartRss.track_peakmem_open_and_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/geoflow-small/grid.nc'))
349M 318M 0.91 face_bounds.FaceBoundsColdStartRss.track_peakmem_open_and_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/quad-hexagon/grid.nc'))
1.14±0.02μs 1.15±0.02μs 1.01 geometry_kernels.AccucrossKernels.time_accucross
2.57±0.01μs 2.59±0.03μs 1.01 geometry_kernels.AccucrossKernels.time_accucross_pair
456±20ns 466±10ns 1.02 geometry_kernels.EFTPrimitives.time_acc_sqrt_re
426±10ns 441±10ns 1.04 geometry_kernels.EFTPrimitives.time_diff_of_products
401±20ns 381±8ns 0.95 geometry_kernels.EFTPrimitives.time_two_prod
381±20ns 391±10ns 1.03 geometry_kernels.EFTPrimitives.time_two_sum
696±10ns 686±10ns 0.99 geometry_kernels.GCAConstLatIntersection.time_accux_constlat_kernel
726±30ns 746±10ns 1.03 geometry_kernels.GCAConstLatIntersection.time_gca_const_lat_intersection
797±40ns 792±20ns 0.99 geometry_kernels.GCAConstLatIntersection.time_try_gca_const_lat_intersection
827±30ns 842±20ns 1.02 geometry_kernels.GCAGCAIntersection.time_accux_gca_kernel
932±20ns 902±10ns 0.97 geometry_kernels.GCAGCAIntersection.time_gca_gca_intersection
1.04±0.02μs 1.04±0.03μs 1.00 geometry_kernels.GCAGCAIntersection.time_try_gca_gca_intersection
52.7±0.3μs 51.6±0.4μs 0.98 geometry_kernels.OrientPredicates.time_on_minor_arc
51.9±0.4μs 50.9±1μs 0.98 geometry_kernels.OrientPredicates.time_orient3d_on_sphere
3.10±0.01ms 3.07±0ms 0.99 geometry_samebody.SameBodyConstLat.time_accux_dispatch
1.16±0ms 1.17±0.01ms 1.01 geometry_samebody.SameBodyConstLat.time_accux_kernel
2.30±0.01ms 2.30±0.01ms 1.00 geometry_samebody.SameBodyConstLat.time_fp64_dispatch
146±0.2μs 146±0.08μs 1.00 geometry_samebody.SameBodyConstLat.time_fp64_kernel
29.6±0.03ms 29.6±0.03ms 1.00 geometry_samebody_gcagca.SameBodyGcaGca.time_accux_dispatch
6.32±0.04ms 6.29±0.02ms 0.99 geometry_samebody_gcagca.SameBodyGcaGca.time_accux_kernel
23.8±0.2ms 23.6±0.08ms 0.99 geometry_samebody_gcagca.SameBodyGcaGca.time_fp64_dispatch
891±10μs 859±1μs 0.96 geometry_samebody_gcagca.SameBodyGcaGca.time_fp64_kernel
928±10ms 938±8ms 1.01 import.Imports.timeraw_import_uxarray
2.47±0.03ms 2.48±0.01ms 1.00 mpas_ocean.CheckNorm.time_check_norm('120km')
2.08±0.06ms 2.00±0.01ms 0.96 mpas_ocean.CheckNorm.time_check_norm('480km')
1.17±0.01ms 1.14±0.01ms 0.98 mpas_ocean.ConnectivityConstruction.time_face_face_connectivity('120km')
571±10μs 554±10μs 0.97 mpas_ocean.ConnectivityConstruction.time_face_face_connectivity('480km')
678±10μs 642±5μs 0.95 mpas_ocean.ConnectivityConstruction.time_n_nodes_per_face('120km')
603±9μs 597±10μs 0.99 mpas_ocean.ConnectivityConstruction.time_n_nodes_per_face('480km')
5.36±0.07ms 5.31±0.05ms 0.99 mpas_ocean.ConstructFaceLatLon.time_cartesian_averaging('120km')
3.87±0.05ms 3.88±0.02ms 1.00 mpas_ocean.ConstructFaceLatLon.time_cartesian_averaging('480km')
97.1±0.07ms 97.8±0.1ms 1.01 mpas_ocean.ConstructFaceLatLon.time_welzl('120km')
10.2±0.3ms 9.85±0.3ms 0.96 mpas_ocean.ConstructFaceLatLon.time_welzl('480km')
18.7±0.06ms 19.3±0.4ms 1.03 mpas_ocean.ConstructTreeStructures.time_ball_tree('120km')
977±20μs 982±20μs 1.01 mpas_ocean.ConstructTreeStructures.time_ball_tree('480km')
10.1±0.07ms 11.6±2ms ~1.15 mpas_ocean.ConstructTreeStructures.time_kd_tree('120km')
614±20μs 723±70μs ~1.18 mpas_ocean.ConstructTreeStructures.time_kd_tree('480km')
625±7ms 590±7ms 0.94 mpas_ocean.CrossSections.time_const_lat('120km', 1)
307±9ms 299±1ms 0.97 mpas_ocean.CrossSections.time_const_lat('120km', 2)
156±2ms 154±1ms 0.99 mpas_ocean.CrossSections.time_const_lat('120km', 4)
567±6ms 547±5ms 0.97 mpas_ocean.CrossSections.time_const_lat('480km', 1)
279±2ms 278±5ms 1.00 mpas_ocean.CrossSections.time_const_lat('480km', 2)
141±3ms 143±2ms 1.01 mpas_ocean.CrossSections.time_const_lat('480km', 4)
349M 337M 0.97 mpas_ocean.CrossSectionsPeakMem.track_peakmem_const_lat('120km', 1)
349M 337M 0.97 mpas_ocean.CrossSectionsPeakMem.track_peakmem_const_lat('120km', 2)
349M 337M 0.97 mpas_ocean.CrossSectionsPeakMem.track_peakmem_const_lat('120km', 4)
349M 320M 0.92 mpas_ocean.CrossSectionsPeakMem.track_peakmem_const_lat('480km', 1)
349M 320M 0.92 mpas_ocean.CrossSectionsPeakMem.track_peakmem_const_lat('480km', 2)
349M 320M 0.92 mpas_ocean.CrossSectionsPeakMem.track_peakmem_const_lat('480km', 4)
26.6±0.2ms 26.1±0.6ms 0.98 mpas_ocean.DualMesh.time_dual_mesh_construction('120km')
3.00±0.05ms 2.89±0.02ms 0.96 mpas_ocean.DualMesh.time_dual_mesh_construction('480km')
14.9±0.6ms 14.9±0.6ms 1.00 mpas_ocean.FaceAreas.time_face_areas('120km')
4.27±0.2ms 4.31±0.2ms 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')
715k 715k 1.00 mpas_ocean.FaceAreas.track_peakmem_face_areas('480km')
921±9ms 905±10ms 0.98 mpas_ocean.GeoDataFrame.time_to_geodataframe('120km', False)
52.7±0.8ms 52.9±0.6ms 1.00 mpas_ocean.GeoDataFrame.time_to_geodataframe('120km', True)
81.7±0.1ms 82.2±0.5ms 1.01 mpas_ocean.GeoDataFrame.time_to_geodataframe('480km', False)
5.30±0.4ms 5.42±0.2ms 1.02 mpas_ocean.GeoDataFrame.time_to_geodataframe('480km', True)
13.5±0.6ms 13.2±0.1ms 0.97 mpas_ocean.Gradient.time_gradient('120km')
1.84±0.01ms 1.81±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.2M 3.2M 1.00 mpas_ocean.Gradient.track_peakmem_gradient('120km')
204k 204k 1.00 mpas_ocean.Gradient.track_peakmem_gradient('480km')
349M 333M 0.95 mpas_ocean.GradientColdStartRss.track_peakmem_gradient('120km')
274±10μs 273±7μs 1.00 mpas_ocean.HoleEdgeIndices.time_construct_hole_edge_indices('120km')
149±10μs 147±5μs 0.99 mpas_ocean.HoleEdgeIndices.time_construct_hole_edge_indices('480km')
205±7μs 200±2μs 0.97 mpas_ocean.Integrate.time_integrate('120km')
188±4μs 187±3μs 1.00 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')
182±0.9ms 187±1ms 1.03 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('120km', 'exclude')
183±1ms 187±0.7ms 1.02 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('120km', 'include')
184±3ms 186±2ms 1.01 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('120km', 'split')
13.0±0.3ms 13.1±0.2ms 1.01 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('480km', 'exclude')
13.4±0.3ms 13.2±0.3ms 0.99 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('480km', 'include')
13.1±0.2ms 13.2±0.2ms 1.01 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('480km', 'split')
248±1ms 245±0.4ms 0.99 mpas_ocean.NeighborhoodBuild.time_build('120km', 1.0)
1.31±0s 1.31±0s 1.00 mpas_ocean.NeighborhoodBuild.time_build('120km', 15.0)
506±2ms 507±1ms 1.00 mpas_ocean.NeighborhoodBuild.time_build('120km', 5.0)
13.4±0.2ms 13.5±0.09ms 1.00 mpas_ocean.NeighborhoodBuild.time_build('480km', 1.0)
25.4±0.1ms 25.5±0.1ms 1.01 mpas_ocean.NeighborhoodBuild.time_build('480km', 15.0)
16.6±0.2ms 16.4±0.03ms 0.99 mpas_ocean.NeighborhoodBuild.time_build('480km', 5.0)
243±0.9ms 240±0.2ms 0.99 mpas_ocean.NeighborhoodBuild.time_query_radius('120km', 1.0)
1.29±0s 1.28±0s 1.00 mpas_ocean.NeighborhoodBuild.time_query_radius('120km', 15.0)
501±1ms 501±0.5ms 1.00 mpas_ocean.NeighborhoodBuild.time_query_radius('120km', 5.0)
12.9±0.04ms 13.0±0.06ms 1.00 mpas_ocean.NeighborhoodBuild.time_query_radius('480km', 1.0)
25.3±0.2ms 25.0±0.08ms 0.99 mpas_ocean.NeighborhoodBuild.time_query_radius('480km', 15.0)
16.2±0.2ms 16.2±0.05ms 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)
825k 825k 1.00 mpas_ocean.NeighborhoodBuild.track_peakmem_build('480km', 15.0)
384k 384k 1.00 mpas_ocean.NeighborhoodBuild.track_peakmem_build('480km', 5.0)
40.7±0.9ms 40.4±0.4ms 0.99 mpas_ocean.NeighborhoodDask.time_mean('120km', 'grid_chunks')
18.3±0.05ms 18.3±0.07ms 1.00 mpas_ocean.NeighborhoodDask.time_mean('120km', 'numpy')
36.9±0.6ms 35.8±0.9ms 0.97 mpas_ocean.NeighborhoodDask.time_mean('120km', 'time_chunks')
10.9±0.1ms 11.0±0.09ms 1.01 mpas_ocean.NeighborhoodDask.time_mean('480km', 'grid_chunks')
816±30μs 792±20μs 0.97 mpas_ocean.NeighborhoodDask.time_mean('480km', 'numpy')
7.91±0.3ms 7.66±0.1ms 0.97 mpas_ocean.NeighborhoodDask.time_mean('480km', 'time_chunks')
5.83M 5.9M 1.01 mpas_ocean.NeighborhoodDask.track_peakmem_mean('120km', 'grid_chunks')
2.75M 2.75M 1.00 mpas_ocean.NeighborhoodDask.track_peakmem_mean('120km', 'numpy')
5.68M 5.68M 1.00 mpas_ocean.NeighborhoodDask.track_peakmem_mean('120km', 'time_chunks')
177k 177k 1.00 mpas_ocean.NeighborhoodDask.track_peakmem_mean('480km', 'numpy')
539k 548k 1.02 mpas_ocean.NeighborhoodDask.track_peakmem_mean('480km', 'time_chunks')
12.6±0.03s 12.6±0.03s 1.00 mpas_ocean.NeighborhoodReduce.time_dataset_reduce('120km', 'mean')
13.3±0.03s 13.3±0.02s 1.00 mpas_ocean.NeighborhoodReduce.time_dataset_reduce('120km', 'median')
226±2ms 227±2ms 1.00 mpas_ocean.NeighborhoodReduce.time_dataset_reduce('480km', 'mean')
232±1ms 232±0.8ms 1.00 mpas_ocean.NeighborhoodReduce.time_dataset_reduce('480km', 'median')
1.34±0s 1.35±0.01s 1.01 mpas_ocean.NeighborhoodReduce.time_neighborhood_reduce('120km', 'mean')
1.54±0s 1.54±0s 1.00 mpas_ocean.NeighborhoodReduce.time_neighborhood_reduce('120km', 'median')
26.1±0.1ms 25.8±0.1ms 0.99 mpas_ocean.NeighborhoodReduce.time_neighborhood_reduce('480km', 'mean')
27.2±0.2ms 27.0±0.2ms 0.99 mpas_ocean.NeighborhoodReduce.time_neighborhood_reduce('480km', 'median')
31.0±0.09ms 31.3±0.2ms 1.01 mpas_ocean.NeighborhoodReduce.time_reduce('120km', 'mean')
228±0.3ms 228±0.6ms 1.00 mpas_ocean.NeighborhoodReduce.time_reduce('120km', 'median')
511±40μs 462±30μs ~0.90 mpas_ocean.NeighborhoodReduce.time_reduce('480km', 'mean')
1.75±0.02ms 1.77±0.02ms 1.01 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.5k 19.5k 1.00 mpas_ocean.NeighborhoodReduce.track_peakmem_reduce('480km', 'mean')
19.9k 19.9k 1.00 mpas_ocean.NeighborhoodReduce.track_peakmem_reduce('480km', 'median')
427±20μs 401±10μs 0.94 mpas_ocean.PointInPolygon.time_face_search_lonlat('120km')
402±10μs 398±8μs 0.99 mpas_ocean.PointInPolygon.time_face_search_lonlat('480km')
382±10μs 426±20μs ~1.12 mpas_ocean.PointInPolygon.time_face_search_xyz('120km')
384±10μs 375±20μs 0.98 mpas_ocean.PointInPolygon.time_face_search_xyz('480km')
133±0.9ms 131±0.6ms 0.99 mpas_ocean.RemapDownsample.time_bilinear_remapping
17.2±0.1ms 17.1±0.1ms 0.99 mpas_ocean.RemapDownsample.time_inverse_distance_weighted_remapping
15.5±0.1ms 15.6±0.09ms 1.01 mpas_ocean.RemapDownsample.time_nearest_neighbor_remapping
1.43±0s 1.42±0s 0.99 mpas_ocean.RemapUpsample.time_bilinear_remapping
26.8±0.3ms 26.7±0.2ms 1.00 mpas_ocean.RemapUpsample.time_inverse_distance_weighted_remapping
12.7±0.2ms 12.4±0.4ms 0.97 mpas_ocean.RemapUpsample.time_nearest_neighbor_remapping
8.46±0.06ms 8.29±0.2ms 0.98 mpas_ocean.ZonalAverage.time_zonal_average('120km')
5.21±0.09ms 5.22±0.09ms 1.00 mpas_ocean.ZonalAverage.time_zonal_average('480km')
349M 339M 0.97 mpas_ocean.ZonalAveragePeakMem.track_peakmem_zonal_average('120km')
349M 322M 0.92 mpas_ocean.ZonalAveragePeakMem.track_peakmem_zonal_average('480km')
1.0372335911660553 1.0336878180661495 1.00 nogil_scaling.GILScaling.track_gil_scaling
7.19±0.3ms 7.24±0.04ms 1.01 quad_hexagon.QuadHexagon.time_open_dataset
6.22±0.2ms 6.11±0.03ms 0.98 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.6k 72.7k 1.00 quad_hexagon.QuadHexagon.track_peakmem_open_grid

Benchmarks that have got worse:

Change Before [9609c3a] After [4871ee1] Ratio Benchmark (Parameter)
+ 671k 757k 1.13 mpas_ocean.NeighborhoodDask.track_peakmem_mean('480km', 'grid_chunks')

cmdupuis3 and others added 10 commits September 1, 2026 13:17
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Drop the GridBenchmark template, whose full cached_grid setup was always
overridden, and root MinimalGridBenchmark on CachedFixtures directly so
the suite only touches the parent-preloaded topology fixtures. Pin numba
threads around the tracemalloc samples, as the other suites do, since
edge_node and face_edge are built by parallel kernels.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@cmdupuis3
cmdupuis3 marked this pull request as ready for review September 29, 2026 21:01
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 run-benchmark Run ASV benchmark workflow

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add connectivity peakmem benchmarks

1 participant