Skip to content

Commit 44a1d14

Browse files
committed
[Benchmarks] Load charts lazily
This shall improve web page load time
1 parent 1e13c00 commit 44a1d14

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
@@ -10,10 +10,35 @@ let suiteNames = new Set();
1010
let timeseriesData, barChartsData, allRunNames;
1111
let activeTags = new Set();
1212
let layerComparisonsData;
13+
let pendingCharts = new Map(); // Store chart data for lazy loading
14+
let chartObserver; // Intersection observer for lazy loading charts
1315

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

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

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

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

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

257288
// Apply current filters

0 commit comments

Comments
 (0)