(entries)
| 568 | } |
| 569 | |
| 570 | function createCompressionChart(entries) { |
| 571 | const chartElement = document.getElementById("compression-chart"); |
| 572 | if (!chartElement) return; |
| 573 | |
| 574 | const allFiles = Object.keys(entries[0].hyperfine_results); |
| 575 | |
| 576 | function buildSeries(sampledEntries) { |
| 577 | return allFiles |
| 578 | .map((file) => { |
| 579 | const dataPoints = sampledEntries |
| 580 | .map((entry) => { |
| 581 | const fileData = entry.hyperfine_results[file]; |
| 582 | if (fileData && fileData.compression_ratio && fileData.output_size > 0) { |
| 583 | const compressionPercent = (1 - fileData.compression_ratio) * 100; |
| 584 | return { |
| 585 | x: new Date(entry.timestamp).getTime(), |
| 586 | y: Math.round(compressionPercent * 10) / 10, |
| 587 | }; |
| 588 | } |
| 589 | return null; |
| 590 | }) |
| 591 | .filter((point) => point !== null); |
| 592 | return { |
| 593 | name: file.replace(/\./g, " ").replace(/-/g, " "), |
| 594 | data: dataPoints, |
| 595 | }; |
| 596 | }) |
| 597 | .filter((s) => s.data.length > 0); |
| 598 | } |
| 599 | |
| 600 | const sampled = sampleEntries(entries); |
| 601 | const series = buildSeries(sampled); |
| 602 | |
| 603 | let allValues = []; |
| 604 | series.forEach((s) => s.data.forEach((point) => allValues.push(point.y))); |
| 605 | |
| 606 | const { outliers, normal } = detectOutliers(allValues); |
| 607 | const hasOutliers = outliers.length > 0; |
| 608 | |
| 609 | const normalSeries = []; |
| 610 | const outlierSeries = []; |
| 611 | series.forEach((s) => { |
| 612 | const validValues = s.data.filter((p) => p !== null); |
| 613 | const avgValue = validValues.length > 0 ? validValues.reduce((sum, p) => sum + p.y, 0) / validValues.length : 0; |
| 614 | if (outliers.includes(avgValue) || s.data.some((p) => p !== null && outliers.includes(p.y))) { |
| 615 | outlierSeries.push(s); |
| 616 | } else { |
| 617 | normalSeries.push(s); |
| 618 | } |
| 619 | }); |
| 620 | |
| 621 | function buildNormalSeries(e) { |
| 622 | return buildSeries(e).filter((s) => normalSeries.some((ns) => ns.name === s.name)); |
| 623 | } |
| 624 | function buildOutlierSeries(e) { |
| 625 | return buildSeries(e).filter((s) => outlierSeries.some((os) => os.name === s.name)); |
| 626 | } |
| 627 |
no test coverage detected