Skip to content

Keep ASV benchmark regressions visible in bot comments - #1872

Draft
anishpentyala wants to merge 3 commits into
UXARRAY:mainfrom
anishpentyala:fix/asv-regressions-visible
Draft

anishpentyala wants to merge 3 commits into
UXARRAY:mainfrom
anishpentyala:fix/asv-regressions-visible

Conversation

@anishpentyala

Copy link
Copy Markdown

Closes #1739

Overview

Keep ASV regressions visible at the top of the benchmark bot comment, followed by improvements. Only unchanged benchmarks go in a collapsed details section. Non-comparable and unfamiliar output stays visible; the table content is retained rather than interpreted or recalculated.

The change stays inside the existing trusted inline github-script. It does not check out or execute PR/fork code in the write-token workflow, and it does not change benchmark thresholds, execution or artifact handling.

Tests

  • Seven offline workflow tests and nine subtests pass using the actual inline JavaScript with mocked artifact reads and GitHub calls. Covers mixed and missing categories, CRLF, unfamiliar output, repeated sections, and create/update routing.
  • The same-target baseline fails the regression-order and visible-results checks. No setup exceptions were counted as regression evidence.
  • Actual ASV Compare.print_table output, including a 14x slowdown and introduced failure, was passed through the renderer. This is synthetic comparison data, not a UXarray performance claim.
  • YAML parsing, explicit ruff on the new test, all applicable pre-commit hooks and git diff --check pass.
  • Rendered preview inspected: slowdown/failure tables first, improvements visible, unchanged benchmarks collapsed.

Run the offline tests with Node.js available:

python -m unittest discover -s test/ci -v

The full UXarray scientific test suite and live GitHub Actions execution were not run locally. No UXarray runtime code changes.

AI Disclosure

AI assistance generated, inspected and tested this patch and its tests. This is not a claim that Anish personally wrote or reviewed the changes. The personal-responsibility checkbox is left unchecked rather than making an attestation on his behalf.

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

AI-generated and tested contribution. Exercises the actual inline workflow script with mocked artifact and GitHub calls, without executing fork code.
AI-generated and tested. Reorder existing split tables without hiding regressions, improvements or unfamiliar output. Only unchanged benchmarks are collapsed. No new privileged checkout or execution of fork code.
@erogluorhan erogluorhan added the run-benchmark Run ASV benchmark workflow label Nov 3, 2026
@github-actions

github-actions Bot commented Nov 3, 2026

Copy link
Copy Markdown

ASV Benchmarking

Benchmark Comparison Results

Benchmarks that have stayed the same:

Change Before [79b7aa6] <v2026.10.1> After [086cddb] Ratio Benchmark (Parameter)
967±10μs 965±40μs 1.00 connectivity.Connectivity.time_edge_face('120km')
466±6μs 472±20μs 1.01 connectivity.Connectivity.time_edge_face('480km')
6.43±0.2ms 6.37±0.1ms 0.99 connectivity.Connectivity.time_edge_node('120km')
1.22±0.04ms 1.23±0.06ms 1.01 connectivity.Connectivity.time_edge_node('480km')
70.9±4μs 67.7±3μs 0.95 connectivity.Connectivity.time_face_edge('120km')
65.3±9μs 63.1±10μs 0.97 connectivity.Connectivity.time_face_edge('480km')
965±40μs 971±50μs 1.01 connectivity.Connectivity.time_face_face('120km')
387±30μs 396±10μs 1.02 connectivity.Connectivity.time_face_face('480km')
60.2±3μs 62.4±3μs 1.04 connectivity.Connectivity.time_face_node('120km')
57.5±3μs 57.4±7μs 1.00 connectivity.Connectivity.time_face_node('480km')
452±40μs 457±20μs 1.01 connectivity.Connectivity.time_n_nodes_per_face('120km')
396±20μs 395±20μs 1.00 connectivity.Connectivity.time_n_nodes_per_face('480km')
1.38±0.02ms 1.41±0.02ms 1.02 connectivity.Connectivity.time_node_edge('120km')
453±10μs 488±40μs 1.08 connectivity.Connectivity.time_node_edge('480km')
93.7±3ms 95.0±1ms 1.01 connectivity.Connectivity.time_node_face('120km')
5.48±0.02ms 5.52±0.05ms 1.01 connectivity.Connectivity.time_node_face('480km')
1.42M 1.42M 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_edge_face('120km')
105k 105k 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_edge_face('480km')
6.48M 6.48M 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_edge_node('120km')
419k 419k 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_edge_node('480km')
2.05k 2.05k 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_face_edge('120km')
2.05k 2.05k 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.18k 2.18k 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_face_node('120km')
2.18k 2.18k 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_face_node('480km')
240k 240k 1.00 connectivity.ConnectivityTracemalloc.track_peakmem_n_nodes_per_face('120km')
26k 26k 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')
4.60±0.06ms 4.52±0.03ms 0.98 face_bounds.FaceBounds.time_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/mpas/QU/oQU480.231010.nc'))
1.38±0.04ms 1.37±0.03ms 1.00 face_bounds.FaceBounds.time_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/scrip/outCSne8/outCSne8.nc'))
5.70±0.05ms 5.72±0.2ms 1.00 face_bounds.FaceBounds.time_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/geoflow-small/grid.nc'))
726±20μs 753±20μs 1.04 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.83M 1.83M 1.00 face_bounds.FaceBounds.track_peakmem_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/mpas/QU/oQU480.231010.nc'))
1.83M 1.83M 1.00 face_bounds.FaceBounds.track_peakmem_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/scrip/outCSne8/outCSne8.nc'))
1.99M 1.99M 1.00 face_bounds.FaceBounds.track_peakmem_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/geoflow-small/grid.nc'))
35.3k 35.3k 1.00 face_bounds.FaceBounds.track_peakmem_face_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/quad-hexagon/grid.nc'))
1.20±0.02μs 1.20±0.02μs 1.00 geometry_kernels.AccucrossKernels.time_accucross
2.64±0.03μs 2.68±0.04μs 1.02 geometry_kernels.AccucrossKernels.time_accucross_pair
521±30ns 506±50ns 0.97 geometry_kernels.EFTPrimitives.time_acc_sqrt_re
476±10ns 491±20ns 1.03 geometry_kernels.EFTPrimitives.time_diff_of_products
411±20ns 421±20ns 1.02 geometry_kernels.EFTPrimitives.time_two_prod
425±30ns 430±20ns 1.01 geometry_kernels.EFTPrimitives.time_two_sum
711±10ns 747±20ns 1.05 geometry_kernels.GCAConstLatIntersection.time_accux_constlat_kernel
771±20ns 786±30ns 1.02 geometry_kernels.GCAConstLatIntersection.time_gca_const_lat_intersection
837±20ns 872±20ns 1.04 geometry_kernels.GCAConstLatIntersection.time_try_gca_const_lat_intersection
837±10ns 827±30ns 0.99 geometry_kernels.GCAGCAIntersection.time_accux_gca_kernel
887±10ns 892±20ns 1.01 geometry_kernels.GCAGCAIntersection.time_gca_gca_intersection
1.07±0.02μs 1.07±0.01μs 1.00 geometry_kernels.GCAGCAIntersection.time_try_gca_gca_intersection
52.0±1μs 52.5±0.7μs 1.01 geometry_kernels.OrientPredicates.time_on_minor_arc
64.2±20μs 52.4±0.8μs ~0.82 geometry_kernels.OrientPredicates.time_orient3d_on_sphere
3.05±0ms 3.09±0.03ms 1.01 geometry_samebody.SameBodyConstLat.time_accux_dispatch
1.16±0ms 1.16±0ms 1.00 geometry_samebody.SameBodyConstLat.time_accux_kernel
2.28±0ms 2.30±0.01ms 1.01 geometry_samebody.SameBodyConstLat.time_fp64_dispatch
148±0.1μs 149±6μs 1.01 geometry_samebody.SameBodyConstLat.time_fp64_kernel
29.6±0.2ms 29.7±0.03ms 1.00 geometry_samebody_gcagca.SameBodyGcaGca.time_accux_dispatch
6.27±0.01ms 6.27±0.01ms 1.00 geometry_samebody_gcagca.SameBodyGcaGca.time_accux_kernel
23.7±0.03ms 23.9±0.01ms 1.01 geometry_samebody_gcagca.SameBodyGcaGca.time_fp64_dispatch
868±9μs 860±0.5μs 0.99 geometry_samebody_gcagca.SameBodyGcaGca.time_fp64_kernel
556±10ms 548±8ms 0.99 import.Imports.timeraw_import_uxarray
1 1 1.00 lazy_grid_construction.LazyGridConstruction.track_computes_isel
2 2 1.00 lazy_grid_construction.LazyGridConstruction.track_computes_open_grid_chunked
102±3ms 98.6±3ms 0.96 lazy_grid_construction.OpenGridChunked.time_open_grid('120km')
141±2ms 142±3ms 1.01 lazy_grid_construction.OpenGridChunked.time_open_grid('480km')
1.99M 1.99M 1.00 lazy_grid_construction.OpenGridChunked.track_peakmem_open_grid('120km')
2.32M 2.22M 0.95 lazy_grid_construction.OpenGridChunked.track_peakmem_open_grid('480km')
1.05±0.01ms 1.02±0.01ms 0.98 mpas_ocean.CheckNorm.time_check_norm('120km')
847±7μs 814±5μs 0.96 mpas_ocean.CheckNorm.time_check_norm('480km')
1.14±0.06ms 1.12±0.01ms 0.99 mpas_ocean.ConnectivityConstruction.time_face_face_connectivity('120km')
530±9μs 530±30μs 1.00 mpas_ocean.ConnectivityConstruction.time_face_face_connectivity('480km')
638±20μs 652±20μs 1.02 mpas_ocean.ConnectivityConstruction.time_n_nodes_per_face('120km')
577±10μs 576±10μs 1.00 mpas_ocean.ConnectivityConstruction.time_n_nodes_per_face('480km')
2.23±0.01ms 2.28±0.01ms 1.02 mpas_ocean.ConstructFaceLatLon.time_cartesian_averaging('120km')
1.69±0.01ms 1.75±0.01ms 1.04 mpas_ocean.ConstructFaceLatLon.time_cartesian_averaging('480km')
71.8±0.7ms 70.8±0.5ms 0.99 mpas_ocean.ConstructFaceLatLon.time_welzl('120km')
6.16±0.03ms 6.08±0.2ms 0.99 mpas_ocean.ConstructFaceLatLon.time_welzl('480km')
18.7±0.05ms 18.7±0.07ms 1.00 mpas_ocean.ConstructTreeStructures.time_ball_tree('120km')
948±20μs 945±20μs 1.00 mpas_ocean.ConstructTreeStructures.time_ball_tree('480km')
10.0±0.08ms 9.89±0.04ms 0.99 mpas_ocean.ConstructTreeStructures.time_kd_tree('120km')
585±30μs 592±20μs 1.01 mpas_ocean.ConstructTreeStructures.time_kd_tree('480km')
612±9ms 646±8ms 1.06 mpas_ocean.CrossSections.time_const_lat('120km', 1)
307±0.3ms 312±1ms 1.02 mpas_ocean.CrossSections.time_const_lat('120km', 2)
163±4ms 169±3ms 1.03 mpas_ocean.CrossSections.time_const_lat('120km', 4)
574±20ms 574±10ms 1.00 mpas_ocean.CrossSections.time_const_lat('480km', 1)
290±5ms 300±0.4ms 1.04 mpas_ocean.CrossSections.time_const_lat('480km', 2)
144±0.9ms 146±0.9ms 1.01 mpas_ocean.CrossSections.time_const_lat('480km', 4)
16.0±0.2ms 15.4±0.2ms 0.97 mpas_ocean.DualMesh.time_dual_mesh_construction('120km')
1.66±0.02ms 1.67±0.05ms 1.01 mpas_ocean.DualMesh.time_dual_mesh_construction('480km')
11.0±0.6ms 11.0±0.5ms 1.00 mpas_ocean.FaceAreas.time_face_areas('120km')
3.91±0.1ms 3.87±0.2ms 0.99 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')
674k 674k 1.00 mpas_ocean.FaceAreas.track_peakmem_face_areas('480km')
54.3±0.8ms 54.8±0.9ms 1.01 mpas_ocean.GeoDataFrame.time_to_geodataframe('120km', 'exclude')
158±2ms 160±1ms 1.01 mpas_ocean.GeoDataFrame.time_to_geodataframe('120km', 'split')
5.15±0.2ms 4.85±0.2ms 0.94 mpas_ocean.GeoDataFrame.time_to_geodataframe('480km', 'exclude')
32.2±7ms 31.2±0.4ms 0.97 mpas_ocean.GeoDataFrame.time_to_geodataframe('480km', 'split')
14.1±0.5ms 13.9±0.07ms 0.99 mpas_ocean.Gradient.time_gradient('120km')
2.36±0.02ms 2.39±0.01ms 1.01 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.44M 3.44M 1.00 mpas_ocean.Gradient.track_peakmem_gradient('120km')
226k 226k 1.00 mpas_ocean.Gradient.track_peakmem_gradient('480km')
277±10μs 303±10μs 1.09 mpas_ocean.HoleEdgeIndices.time_construct_hole_edge_indices('120km')
150±0.8μs 152±1μs 1.02 mpas_ocean.HoleEdgeIndices.time_construct_hole_edge_indices('480km')
172±10μs 173±4μs 1.00 mpas_ocean.Integrate.time_integrate('120km')
154±8μs 164±7μs 1.06 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')
74.3±1ms 74.2±0.8ms 1.00 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('120km', 'exclude')
74.6±0.5ms 73.6±0.3ms 0.99 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('120km', 'include')
73.1±0.9ms 73.5±0.7ms 1.01 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('120km', 'split')
5.17±0.04ms 5.35±0.2ms 1.04 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('480km', 'exclude')
5.14±0.01ms 5.22±0.06ms 1.02 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('480km', 'include')
5.27±0.1ms 5.17±0.04ms 0.98 mpas_ocean.MatplotlibConversion.time_dataarray_to_polycollection('480km', 'split')
168±2ms 165±0.4ms 0.98 mpas_ocean.NeighborhoodBuild.time_build('120km', 1.0)
351±4ms 354±3ms 1.01 mpas_ocean.NeighborhoodBuild.time_build('120km', 5.0)
8.92±0.03ms 8.80±0.01ms 0.99 mpas_ocean.NeighborhoodBuild.time_build('480km', 1.0)
11.1±0.1ms 10.9±0.03ms 0.99 mpas_ocean.NeighborhoodBuild.time_build('480km', 5.0)
164±3ms 166±6ms 1.02 mpas_ocean.NeighborhoodBuild.time_query_radius('120km', 1.0)
351±4ms 348±4ms 0.99 mpas_ocean.NeighborhoodBuild.time_query_radius('120km', 5.0)
8.88±0.9ms 9.03±0.2ms 1.02 mpas_ocean.NeighborhoodBuild.time_query_radius('480km', 1.0)
10.8±0.02ms 10.8±0.01ms 0.99 mpas_ocean.NeighborhoodBuild.time_query_radius('480km', 5.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)
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)
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)
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)
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)
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)
40.9±0.9ms 40.7±1ms 1.00 mpas_ocean.NeighborhoodDask.time_mean('120km', 'grid_chunks')
18.2±0.09ms 18.2±0.09ms 1.00 mpas_ocean.NeighborhoodDask.time_mean('120km', 'numpy')
35.6±0.5ms 36.0±0.6ms 1.01 mpas_ocean.NeighborhoodDask.time_mean('120km', 'time_chunks')
10.4±0.2ms 10.5±0.1ms 1.01 mpas_ocean.NeighborhoodDask.time_mean('480km', 'grid_chunks')
637±6μs 628±8μs 0.99 mpas_ocean.NeighborhoodDask.time_mean('480km', 'numpy')
7.25±0.1ms 7.54±0.2ms 1.04 mpas_ocean.NeighborhoodDask.time_mean('480km', 'time_chunks')
5.82M 5.82M 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.68M 5.68M 1.00 mpas_ocean.NeighborhoodDask.track_peakmem_mean('120km', 'time_chunks')
755k 755k 1.00 mpas_ocean.NeighborhoodDask.track_peakmem_mean('480km', 'grid_chunks')
177k 177k 1.00 mpas_ocean.NeighborhoodDask.track_peakmem_mean('480km', 'numpy')
527k 528k 1.00 mpas_ocean.NeighborhoodDask.track_peakmem_mean('480km', 'time_chunks')
3.15±0.01s 3.12±0.01s 0.99 mpas_ocean.NeighborhoodReduce.time_dataset_reduce('120km', 'mean')
3.22±0.02s 3.22±0.01s 1.00 mpas_ocean.NeighborhoodReduce.time_dataset_reduce('120km', 'median')
83.8±5ms 83.7±1ms 1.00 mpas_ocean.NeighborhoodReduce.time_dataset_reduce('480km', 'mean')
82.2±0.5ms 83.8±2ms 1.02 mpas_ocean.NeighborhoodReduce.time_dataset_reduce('480km', 'median')
355±3ms 353±4ms 0.99 mpas_ocean.NeighborhoodReduce.time_neighborhood_reduce('120km', 'mean')
384±3ms 379±4ms 0.99 mpas_ocean.NeighborhoodReduce.time_neighborhood_reduce('120km', 'median')
11.2±0.03ms 11.4±0.3ms 1.02 mpas_ocean.NeighborhoodReduce.time_neighborhood_reduce('480km', 'mean')
11.5±0.08ms 11.7±0.2ms 1.01 mpas_ocean.NeighborhoodReduce.time_neighborhood_reduce('480km', 'median')
2.39±0.03ms 2.43±0.02ms 1.01 mpas_ocean.NeighborhoodReduce.time_reduce('120km', 'mean')
26.6±0.4ms 27.2±0.06ms 1.02 mpas_ocean.NeighborhoodReduce.time_reduce('120km', 'median')
108±0.3μs 111±0.4μs 1.03 mpas_ocean.NeighborhoodReduce.time_reduce('480km', 'mean')
328±9μs 341±9μs 1.04 mpas_ocean.NeighborhoodReduce.time_reduce('480km', 'median')
234k 234k 1.00 mpas_ocean.NeighborhoodReduce.track_peakmem_reduce('120km', 'mean')
235k 235k 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.6k 19.6k 1.00 mpas_ocean.NeighborhoodReduce.track_peakmem_reduce('480km', 'median')
183±3μs 183±2μs 1.00 mpas_ocean.PointInPolygon.time_face_search_lonlat('120km')
160±10μs 165±3μs 1.03 mpas_ocean.PointInPolygon.time_face_search_lonlat('480km')
162±5μs 163±3μs 1.01 mpas_ocean.PointInPolygon.time_face_search_xyz('120km')
148±10μs 139±10μs 0.94 mpas_ocean.PointInPolygon.time_face_search_xyz('480km')
55.5±1ms 55.4±0.6ms 1.00 mpas_ocean.RemapDownsample.time_bilinear_remapping
9.89±0.1ms 9.84±0.08ms 1.00 mpas_ocean.RemapDownsample.time_inverse_distance_weighted_remapping
8.99±0.05ms 8.84±0.05ms 0.98 mpas_ocean.RemapDownsample.time_nearest_neighbor_remapping
1.11±0s 1.11±0s 1.00 mpas_ocean.RemapUpsample.time_bilinear_remapping
26.5±0.4ms 27.1±0.5ms 1.02 mpas_ocean.RemapUpsample.time_inverse_distance_weighted_remapping
11.5±0.2ms 11.3±0.1ms 0.99 mpas_ocean.RemapUpsample.time_nearest_neighbor_remapping
7.90±0.2ms 8.20±0.2ms 1.04 mpas_ocean.ZonalAverage.time_zonal_average('120km')
4.72±0.03ms 4.85±0.03ms 1.03 mpas_ocean.ZonalAverage.time_zonal_average('480km')
1.0349462261239004 1.0382944899822901 1.00 nogil_scaling.GILScaling.track_gil_scaling
317±2ms 318±7ms 1.00 plots.PlotHealpix.time_default_plot(6)
2.83±0s 2.82±0.01s 0.99 plots.PlotHealpix.time_default_plot(8)
28M 28M 1.00 plots.PlotHealpix.track_peakmem_default_plot(6)
443M 443M 1.00 plots.PlotHealpix.track_peakmem_default_plot(8)
8.03±0.2ms 7.89±0.04ms 0.98 quad_hexagon.QuadHexagon.time_open_dataset
6.77±0.07ms 6.86±0.2ms 1.01 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
69.9k 70.1k 1.00 quad_hexagon.QuadHexagon.track_peakmem_open_dataset
69.8k 69.9k 1.00 quad_hexagon.QuadHexagon.track_peakmem_open_grid
747±4ms 738±1ms 0.99 to_raster.ToRaster.time_to_raster((10000.0, 10.0))
1.54±0s 1.52±0.01s 0.99 to_raster.ToRaster.time_to_raster((10000.0, 100.0))
1.79±0s 1.78±0.01s 0.99 to_raster.ToRaster.time_to_raster((100000.0, 100.0))
270M 270M 1.00 to_raster.ToRaster.track_peakmem((10000.0, 10.0))
680M 680M 1.00 to_raster.ToRaster.track_peakmem((10000.0, 100.0))
765M 765M 1.00 to_raster.ToRaster.track_peakmem((100000.0, 100.0))

Benchmarks that have got worse:

Change Before [79b7aa6] <v2026.10.1> After [086cddb] Ratio Benchmark (Parameter)
+ 297M 385M 1.3 face_bounds.FaceBoundsColdStartRss.track_peakmem_open_and_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/mpas/QU/oQU480.231010.nc'))
+ 297M 385M 1.3 face_bounds.FaceBoundsColdStartRss.track_peakmem_open_and_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/scrip/outCSne8/outCSne8.nc'))
+ 298M 385M 1.29 face_bounds.FaceBoundsColdStartRss.track_peakmem_open_and_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/geoflow-small/grid.nc'))
+ 298M 385M 1.29 face_bounds.FaceBoundsColdStartRss.track_peakmem_open_and_bounds(PosixPath('/home/runner/work/uxarray/uxarray/test/meshfiles/ugrid/quad-hexagon/grid.nc'))
+ 277M 386M 1.4 import.Imports.track_peakmem_import_uxarray
+ 317M 385M 1.22 mpas_ocean.CrossSectionsPeakMem.track_peakmem_const_lat('120km', 1)
+ 317M 385M 1.21 mpas_ocean.CrossSectionsPeakMem.track_peakmem_const_lat('120km', 2)
+ 317M 385M 1.22 mpas_ocean.CrossSectionsPeakMem.track_peakmem_const_lat('120km', 4)
+ 300M 385M 1.28 mpas_ocean.CrossSectionsPeakMem.track_peakmem_const_lat('480km', 1)
+ 300M 385M 1.28 mpas_ocean.CrossSectionsPeakMem.track_peakmem_const_lat('480km', 2)
+ 300M 385M 1.28 mpas_ocean.CrossSectionsPeakMem.track_peakmem_const_lat('480km', 4)
+ 314M 385M 1.23 mpas_ocean.GradientColdStartRss.track_peakmem_gradient('120km')
+ 293M 385M 1.31 mpas_ocean.GradientColdStartRss.track_peakmem_gradient('480km')
+ 318M 385M 1.21 mpas_ocean.ZonalAveragePeakMem.track_peakmem_zonal_average('120km')
+ 301M 385M 1.28 mpas_ocean.ZonalAveragePeakMem.track_peakmem_zonal_average('480km')

@erogluorhan

Copy link
Copy Markdown
Member

Hi @anishpentyala thanks very much for your contribution!

FYI: I've added the "run-benchmark" label to this to trigger the ASV benchmark runs and see how their results show up. See it above in the "ASV Benchmarking" cell. Luckily, we have some of those benchmarks that got worse, but they are still shown in the bottom-most part of that cell.

@anishpentyala

Copy link
Copy Markdown
Author

@erogluorhan Thanks for checking the live output. That comment still uses the existing renderer: the comment workflow run ran from commit 79b7aa6, whose .github/workflows/asv-benchmarking-comment.yml inserts raw compareResults inside one <details> block. The category-reordering code in this draft is at f31c988, so that run did not exercise the proposed renderer.

The workflow's workflow_run trigger intentionally uses the default-branch workflow, not the fork's modified script. That write-token boundary should stay intact; running fork code in that job is not the way to test this.

The draft's offline tests exercise its actual inline JavaScript with mocked artifact reads and GitHub calls, including real ASV-formatted synthetic comparison output. Those checks support the proposed ordering, but they are not live validation of the patch against this benchmark run. The PR remains draft, and the personal-responsibility checkbox remains unchecked.

AI disclosure: this source check and reply were prepared by the AI assistant operating for @anishpentyala. No personal human review or readiness attestation is claimed.

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

Labels

run-benchmark Run ASV benchmark workflow

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Improve visibility of performance degradation in ASV benchmarking bot comment

2 participants