diff --git a/devops/scripts/benchmarks/html/scripts.js b/devops/scripts/benchmarks/html/scripts.js index d49698c5ce9bf..ade9addff7ccf 100644 --- a/devops/scripts/benchmarks/html/scripts.js +++ b/devops/scripts/benchmarks/html/scripts.js @@ -11,10 +11,35 @@ let timeseriesData, barChartsData, allRunNames; let activeTags = new Set(); let layerComparisonsData; let latestRunsLookup = new Map(); +let pendingCharts = new Map(); // Store chart data for lazy loading +let chartObserver; // Intersection observer for lazy loading charts // DOM Elements let runSelect, selectedRunsDiv, suiteFiltersContainer, tagFiltersContainer; +// Observer for lazy loading charts +function initChartObserver() { + if (chartObserver) return; + + chartObserver = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + const containerId = entry.target.querySelector('canvas').id; + if (pendingCharts.has(containerId)) { + const { data, type } = pendingCharts.get(containerId); + createChart(data, containerId, type); + pendingCharts.delete(containerId); + chartObserver.unobserve(entry.target); + } + } + }); + }, { + root: null, // viewport (current view) + rootMargin: '100px', // Load charts a bit before they enter the viewport + threshold: 0.1 // Start loading when 10% of the chart is within the rootMargin + }); +} + const colorPalette = [ 'rgb(255, 50, 80)', 'rgb(255, 145, 15)', @@ -230,13 +255,17 @@ function drawCharts(filteredTimeseriesData, filteredBarChartsData, filteredLayer document.querySelectorAll('.charts').forEach(container => container.innerHTML = ''); chartInstances.forEach(chart => chart.destroy()); chartInstances.clear(); + pendingCharts.clear(); + + initChartObserver(); // For lazy loading charts // Create timeseries charts filteredTimeseriesData.forEach((data, index) => { const containerId = `timeseries-${index}`; const container = createChartContainer(data, containerId, 'benchmark'); document.querySelector('.timeseries .charts').appendChild(container); - createChart(data, containerId, 'time'); + pendingCharts.set(containerId, { data, type: 'time' }); + chartObserver.observe(container); }); // Create layer comparison charts @@ -244,7 +273,8 @@ function drawCharts(filteredTimeseriesData, filteredBarChartsData, filteredLayer const containerId = `layer-comparison-${index}`; const container = createChartContainer(data, containerId, 'group'); document.querySelector('.layer-comparisons .charts').appendChild(container); - createChart(data, containerId, 'time'); + pendingCharts.set(containerId, { data, type: 'time' }); + chartObserver.observe(container); }); // Create bar charts @@ -252,7 +282,8 @@ function drawCharts(filteredTimeseriesData, filteredBarChartsData, filteredLayer const containerId = `barchart-${index}`; const container = createChartContainer(data, containerId, 'group'); document.querySelector('.bar-charts .charts').appendChild(container); - createChart(data, containerId, 'bar'); + pendingCharts.set(containerId, { data, type: 'bar' }); + chartObserver.observe(container); }); // Apply current filters