diff --git a/src/components/benchmarks/index.tsx b/src/components/benchmarks/index.tsx index 3861d366..fcdccaed 100644 --- a/src/components/benchmarks/index.tsx +++ b/src/components/benchmarks/index.tsx @@ -12,7 +12,7 @@ import { Title, Tooltip, } from "chart.js"; -import React from "react"; +import { useEffect, useState } from "react"; import { Bar, Line } from "react-chartjs-2"; import styles from "./styles.module.css"; @@ -30,6 +30,7 @@ ChartJS.register( interface BenchmarkGraphsProps { selectedEngines: string[]; + range: string; } const ChartOptions = { @@ -42,75 +43,50 @@ const ChartOptions = { export const BenchmarkGraphs: React.FC = ({ selectedEngines, + range }) => { // Control the state of which engines are displayed using a Set - const [data, setData] = React.useState([]); + const [charts, setCharts] = useState([]); + const [data, setData] = useState({}); const colorMode = useColorMode(); ChartJS.defaults.color = colorMode.colorMode === "light" ? "#666" : "white"; - React.useEffect(() => { - Promise.all([ - buildChartFromBenchmark("Crypto", selectedEngines), - buildChartFromBenchmark("DeltaBlue", selectedEngines), - buildChartFromBenchmark("EarleyBoyer", selectedEngines), - buildChartFromBenchmark("NavierStokes", selectedEngines), - buildChartFromBenchmark("RayTrace", selectedEngines), - buildChartFromBenchmark("RegExp", selectedEngines), - buildChartFromBenchmark("Richards", selectedEngines), - buildChartFromBenchmark("Splay", selectedEngines), - buildChartFromBenchmark("score", selectedEngines), - ]).then((charts) => setData(charts)); - }, [selectedEngines]); - - return data && data.map((chart) => chart); -}; -const buildChartFromBenchmark = async (name: string, engines: string[]) => { - const data = await fetchData( - `https://raw.githubusercontent.com/boa-dev/data/main/bench/results/${name}.json`, - engines, - ); + useEffect(() => { + fetch(`https://boa-api.jason-williams.co.uk/benchmarks?months=${range}&engines=${selectedEngines.join(',')}`).then( + (res) => res.json()) + .then(respData => { + setData(respData) + }); + }, [selectedEngines, range]); - const barData = getBarChartData(data); + useEffect(() => { + setCharts(buildChartFromBenchmark(data)); + }, [data]); - return ( -
-
- {name} -
-
-
- -
-
- -
-
-
- ); + + return charts && charts.map((chart) => chart); }; -const fetchData = async (url: string, engines: string[]) => { - const response = await fetch(url); - const data = await response.json(); - // Add the dataset if the engine is enabled +const normalizeBenchmarkData = (benchmarkData: any[]) => { + const labels = benchmarkData.map((entry: any) => + new Date(entry.date).toLocaleDateString(), + ); + + const engines = Object.keys(benchmarkData[0]).filter(key => key != "date"); + return { - labels: data.labels.map((epoch: number) => - new Date(epoch).toLocaleDateString(), - ), - datasets: Object.keys(data.results) - .filter((engine) => engines.includes(engine)) - .map((engine) => { - return { - label: engine, - data: data.results[engine], - fill: false, - }; - }), + labels, + datasets: engines.map(engine => ({ + label: engine, + data: benchmarkData.map(entry => entry[engine]), + fill: false + })), }; }; + const getBarChartData = (data) => { // We only want the last value from each dataset return { @@ -123,3 +99,33 @@ const getBarChartData = (data) => { }), }; }; + +const buildChartFromBenchmark = (data: any): any[] => { + + let charts = []; + for (const benchmark in data) { + const normalizedData = normalizeBenchmarkData(data[benchmark]) + const barData = getBarChartData(normalizedData); + charts.push(( +
+
+ {benchmark} +
+
+
+ +
+
+ +
+
+
+ )); + }; + + return charts; +}; + + + + diff --git a/src/pages/benchmarks/index.tsx b/src/pages/benchmarks/index.tsx index b9738030..e2273534 100644 --- a/src/pages/benchmarks/index.tsx +++ b/src/pages/benchmarks/index.tsx @@ -24,7 +24,9 @@ export default function Benchmarks() { "quickjs", ]); - const handleCheckboxChange = (engine: string) => { + const [range, setRange] = useState("6"); + + const handleEngineCheckboxChange = (engine: string) => { if (selectedEngines.includes(engine)) { setSelectedEngines(selectedEngines.filter((e) => e !== engine)); } else { @@ -32,6 +34,10 @@ export default function Benchmarks() { } }; + const handleRangeCheckboxChange = (evt: any) => { + setRange(evt.target.value); + }; + return (
@@ -54,15 +60,51 @@ export default function Benchmarks() { type="checkbox" value={engine} checked={selectedEngines.includes(engine)} - onChange={() => handleCheckboxChange(engine)} + onChange={() => handleEngineCheckboxChange(engine)} /> {engine}
))} - + + +
+
+ Select rolling range +
+ + 1 Month +
+ +
+ + 6 Month +
+ +
+ + 12 Month +
+
+
+ -
+ ); }