Skip to main content

Reducing OpenLayers map render time by 51%

How component boundaries, event handling, and layer management reduced OpenLayers render time by 51% in a 1,000+ label test.

Reducing OpenLayers map render time by 51%

Context and measurement

Rendering large volumes of label data degraded performance in a satellite imagery analysis solution. I measured rendering time and memory usage with Chrome DevTools. I also used function execution times to estimate computational cost; this was a timing-based estimate, not a direct measurement of CPU utilization or operation counts.

Two scenarios provided the comparison: a 77-label environment representing typical usage and a 1,000+ label environment used as a stress scenario.

Scenario Before After
77 labels 355.87 ms 265.35 ms
1,000+ labels 856.03 ms 421.44 ms

Bottlenecks

The original structure rendered a component for every label, so component work grew with the dataset. Event listeners and state updates added work during map interaction, while synchronizing React and OpenLayers introduced repeated rendering calls.

I worked on three sources of cost together: how many label components React rendered, how often interaction events updated state, and how changes reached OpenLayers.

Changes

Render labels within the viewport

I rendered components only for labels within the current viewport, rather than for every label in the dataset.

Delegate and debounce events

I moved label event handling to the container rather than attaching a listener to each item. I also debounced viewport updates to avoid a state update for every input event.

Batch updates and manage the label layer

I collected label changes before applying them in a batch, reducing repeated OpenLayers updates. A separate label layer kept the label source and styling together.

Results

For the 77-label scenario, measured rendering time decreased by 25%. For the 1,000+ label stress scenario, it decreased by 51%. Memory usage, also measured with Chrome DevTools, decreased by approximately 30%.

Function execution times suggested an approximately 40% reduction in computational cost. This was a rough timing-based estimate, rather than a measured reduction in overall CPU utilization.

Measurement limits

The figures describe the combined changes in two label-count scenarios. They do not isolate the contribution of each technique or establish user-centric First Contentful Paint (FCP), Largest Contentful Paint (LCP), or Cumulative Layout Shift (CLS) outcomes.