Skip to content

Commit 2a1528f

Browse files
authored
[Benchmarks] Load charts lazily (#18729)
This shall improve web page load time
1 parent 3e3de96 commit 2a1528f

File tree

1 file changed

+34
-3
lines changed

1 file changed

+34
-3
lines changed

devops/scripts/benchmarks/html/scripts.js

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,35 @@ let timeseriesData, barChartsData, allRunNames;
1111
let activeTags = new Set();
1212
let layerComparisonsData;
1313
let latestRunsLookup = new Map();
14+
let pendingCharts = new Map(); // Store chart data for lazy loading
15+
let chartObserver; // Intersection observer for lazy loading charts
1416

1517
// DOM Elements
1618
let runSelect, selectedRunsDiv, suiteFiltersContainer, tagFiltersContainer;
1719

20+
// Observer for lazy loading charts
21+
function initChartObserver() {
22+
if (chartObserver) return;
23+
24+
chartObserver = new IntersectionObserver((entries) => {
25+
entries.forEach(entry => {
26+
if (entry.isIntersecting) {
27+
const containerId = entry.target.querySelector('canvas').id;
28+
if (pendingCharts.has(containerId)) {
29+
const { data, type } = pendingCharts.get(containerId);
30+
createChart(data, containerId, type);
31+
pendingCharts.delete(containerId);
32+
chartObserver.unobserve(entry.target);
33+
}
34+
}
35+
});
36+
}, {
37+
root: null, // viewport (current view)
38+
rootMargin: '100px', // Load charts a bit before they enter the viewport
39+
threshold: 0.1 // Start loading when 10% of the chart is within the rootMargin
40+
});
41+
}
42+
1843
const colorPalette = [
1944
'rgb(255, 50, 80)',
2045
'rgb(255, 145, 15)',
@@ -230,29 +255,35 @@ function drawCharts(filteredTimeseriesData, filteredBarChartsData, filteredLayer
230255
document.querySelectorAll('.charts').forEach(container => container.innerHTML = '');
231256
chartInstances.forEach(chart => chart.destroy());
232257
chartInstances.clear();
258+
pendingCharts.clear();
259+
260+
initChartObserver(); // For lazy loading charts
233261

234262
// Create timeseries charts
235263
filteredTimeseriesData.forEach((data, index) => {
236264
const containerId = `timeseries-${index}`;
237265
const container = createChartContainer(data, containerId, 'benchmark');
238266
document.querySelector('.timeseries .charts').appendChild(container);
239-
createChart(data, containerId, 'time');
267+
pendingCharts.set(containerId, { data, type: 'time' });
268+
chartObserver.observe(container);
240269
});
241270

242271
// Create layer comparison charts
243272
filteredLayerComparisonsData.forEach((data, index) => {
244273
const containerId = `layer-comparison-${index}`;
245274
const container = createChartContainer(data, containerId, 'group');
246275
document.querySelector('.layer-comparisons .charts').appendChild(container);
247-
createChart(data, containerId, 'time');
276+
pendingCharts.set(containerId, { data, type: 'time' });
277+
chartObserver.observe(container);
248278
});
249279

250280
// Create bar charts
251281
filteredBarChartsData.forEach((data, index) => {
252282
const containerId = `barchart-${index}`;
253283
const container = createChartContainer(data, containerId, 'group');
254284
document.querySelector('.bar-charts .charts').appendChild(container);
255-
createChart(data, containerId, 'bar');
285+
pendingCharts.set(containerId, { data, type: 'bar' });
286+
chartObserver.observe(container);
256287
});
257288

258289
// Apply current filters

0 commit comments

Comments
 (0)