Skip to content

Optimizations in Chart control - #401

Merged
PaulAndersonS merged 6 commits into
mainfrom
paulandersons-shiny-fishstick
Aug 14, 2026
Merged

PaulAndersonS merged 6 commits into
mainfrom
paulandersons-shiny-fishstick

Conversation

@PaulAndersonS

Copy link
Copy Markdown
Collaborator

Summary

This PR consolidates 10 performance improvements across the Chart control to reduce memory allocations, eliminate redundant LINQ evaluations, and improve CPU efficiency in hot rendering and interaction paths.

Performance Improvements

# Fix File(s) Impact
1 Replace string-based double comparison with Math.Abs epsilon check ChartDataUtils.cs Critical - Eliminates 2 string allocations per call
2 Add direct type checks in ConvertToDouble to avoid redundant ToString() ChartUtils.cs High - Skips string conversion for numeric types
3 Materialize OfType<CartesianSeries>() to prevent repeated LINQ evaluation CartesianChartArea.cs High - Eliminates redundant type-check filtering
4 Remove unnecessary .ToList() on Dictionary.Values CartesianChartArea.cs Medium - Eliminates collection copy
5 Eliminate list copy in DataPointSelectionBehavior.ResetMultiSelection DataPointSelectionBehavior.cs High - Removes allocation in interaction path
6 Eliminate list copy in SeriesSelectionBehavior.ResetMultiSelection SeriesSelectionBehavior.cs High - Removes allocation in interaction path
7 Use HashSet for O(1) lookups in trackball point filtering ChartTrackballBehavior.cs High - O(1) vs O(n) Contains
8 Replace Cast<T>() LINQ wrapper with direct iteration CircularSeries, FinancialSeriesBase, StepAreaSeries, AreaSeries, ScatterSeries, RangeAreaSeries High - Eliminates LINQ enumerator overhead in rendering loops
9 Remove unnecessary .ToList() materialization CartesianSeries.cs Medium - Avoids intermediate collection
10 Replace separate Min()/Max() LINQ calls with single-pass loop BoxAndWhiskerSeries.cs Medium - O(n) instead of O(2n)

Build Verification

  • dotnet build passes with 0 errors

1. Replace string-based double comparison with Math.Abs epsilon check (ChartDataUtils.cs)
2. Add direct type checks in ConvertToDouble to avoid redundant ToString() allocations (ChartUtils.cs)
3. Materialize OfType<CartesianSeries>() result to prevent repeated LINQ evaluation (CartesianChartArea.cs)
4. Remove unnecessary .ToList() on Dictionary.Values - use foreach directly (CartesianChartArea.cs)
5. Eliminate unnecessary list copies in DataPointSelectionBehavior.ResetMultiSelection
6. Eliminate unnecessary list copies in SeriesSelectionBehavior.ResetMultiSelection
7. Use HashSet for O(1) lookups in trackball point filtering (ChartTrackballBehavior.cs)
8. Replace Cast<T>() LINQ wrapper with direct iteration in rendering loops (CircularSeries, FinancialSeriesBase, StepAreaSeries, AreaSeries, ScatterSeries, RangeAreaSeries)
9. Remove unnecessary .ToList() materialization in CartesianSeries.UpdateSbsSeries
10. Replace separate Min()/Max() LINQ calls with single-pass loop (BoxAndWhiskerSeries)

These changes reduce memory allocations, eliminate redundant LINQ evaluations,
and improve CPU efficiency in hot rendering and interaction paths.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@PaulAndersonS PaulAndersonS changed the title perf(Charts): Consolidate 10 performance improvements in Chart control Optimizations in Chart control Aug 7, 2026

@SaiyathAliFathima SaiyathAliFathima 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.

Fine

@PaulAndersonS
PaulAndersonS merged commit 6d3ada8 into main Aug 14, 2026
@PaulAndersonS PaulAndersonS added this to the v1.0.11 milestone Aug 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants