Skip to content

Commit 4d48da7

Browse files
committed
add benchmarks from api
1 parent b39ab9e commit 4d48da7

File tree

2 files changed

+109
-59
lines changed

2 files changed

+109
-59
lines changed

src/components/benchmarks/index.tsx

Lines changed: 62 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
Title,
1313
Tooltip,
1414
} from "chart.js";
15-
import React from "react";
15+
import { useEffect, useState } from "react";
1616
import { Bar, Line } from "react-chartjs-2";
1717
import styles from "./styles.module.css";
1818

@@ -30,6 +30,7 @@ ChartJS.register(
3030

3131
interface BenchmarkGraphsProps {
3232
selectedEngines: string[];
33+
range: string;
3334
}
3435

3536
const ChartOptions = {
@@ -42,75 +43,51 @@ const ChartOptions = {
4243

4344
export const BenchmarkGraphs: React.FC<BenchmarkGraphsProps> = ({
4445
selectedEngines,
46+
range
4547
}) => {
4648
// Control the state of which engines are displayed using a Set
4749

48-
const [data, setData] = React.useState([]);
50+
const [charts, setCharts] = useState([]);
51+
const [data, setData] = useState({});
4952
const colorMode = useColorMode();
5053
ChartJS.defaults.color = colorMode.colorMode === "light" ? "#666" : "white";
5154

52-
React.useEffect(() => {
53-
Promise.all([
54-
buildChartFromBenchmark("Crypto", selectedEngines),
55-
buildChartFromBenchmark("DeltaBlue", selectedEngines),
56-
buildChartFromBenchmark("EarleyBoyer", selectedEngines),
57-
buildChartFromBenchmark("NavierStokes", selectedEngines),
58-
buildChartFromBenchmark("RayTrace", selectedEngines),
59-
buildChartFromBenchmark("RegExp", selectedEngines),
60-
buildChartFromBenchmark("Richards", selectedEngines),
61-
buildChartFromBenchmark("Splay", selectedEngines),
62-
buildChartFromBenchmark("score", selectedEngines),
63-
]).then((charts) => setData(charts));
64-
}, [selectedEngines]);
65-
66-
return data && data.map((chart) => chart);
67-
};
6855

69-
const buildChartFromBenchmark = async (name: string, engines: string[]) => {
70-
const data = await fetchData(
71-
`https://raw.githubusercontent.com/boa-dev/data/main/bench/results/${name}.json`,
72-
engines,
73-
);
56+
useEffect(() => {
57+
console.log("range changed", range);
58+
fetch(`https://boa-api.jason-williams.co.uk/benchmarks?months=${range}&engines=${selectedEngines.join(',')}`).then(
59+
(res) => res.json())
60+
.then(respData => {
61+
setData(respData)
62+
});
63+
}, [selectedEngines, range]);
7464

75-
const barData = getBarChartData(data);
65+
useEffect(() => {
66+
setCharts(buildChartFromBenchmark(data));
67+
}, [data]);
7668

77-
return (
78-
<div key={name}>
79-
<div className={`card__header ${styles["benchmark-card-header"]}`}>
80-
<Heading as="h2">{name}</Heading>
81-
</div>
82-
<div className={styles["cards-wrap"]}>
83-
<div className={`card ${styles["benchmark-card"]}`}>
84-
<Line data={data} options={ChartOptions}></Line>
85-
</div>
86-
<div className={`card ${styles["benchmark-card"]}`}>
87-
<Bar data={barData} options={ChartOptions}></Bar>
88-
</div>
89-
</div>
90-
</div>
91-
);
69+
70+
return charts && charts.map((chart) => chart);
9271
};
9372

94-
const fetchData = async (url: string, engines: string[]) => {
95-
const response = await fetch(url);
96-
const data = await response.json();
97-
// Add the dataset if the engine is enabled
73+
const normalizeBenchmarkData = (benchmarkData: any[]) => {
74+
const labels = benchmarkData.map((entry: any) =>
75+
new Date(entry.date).toLocaleDateString(),
76+
);
77+
78+
const engines = Object.keys(benchmarkData[0]).filter(key => key != "date");
79+
9880
return {
99-
labels: data.labels.map((epoch: number) =>
100-
new Date(epoch).toLocaleDateString(),
101-
),
102-
datasets: Object.keys(data.results)
103-
.filter((engine) => engines.includes(engine))
104-
.map((engine) => {
105-
return {
106-
label: engine,
107-
data: data.results[engine],
108-
fill: false,
109-
};
110-
}),
81+
labels,
82+
datasets: engines.map(engine => ({
83+
label: engine,
84+
data: benchmarkData.map(entry => entry[engine]),
85+
fill: false
86+
})),
11187
};
11288
};
11389

90+
11491
const getBarChartData = (data) => {
11592
// We only want the last value from each dataset
11693
return {
@@ -123,3 +100,33 @@ const getBarChartData = (data) => {
123100
}),
124101
};
125102
};
103+
104+
const buildChartFromBenchmark = (data: any): any[] => {
105+
106+
let charts = [];
107+
for (const benchmark in data) {
108+
const normalizedData = normalizeBenchmarkData(data[benchmark])
109+
const barData = getBarChartData(normalizedData);
110+
charts.push((
111+
<div key={benchmark}>
112+
<div className={`card__header ${styles["benchmark-card-header"]}`}>
113+
<Heading as="h2">{benchmark}</Heading>
114+
</div>
115+
<div className={styles["cards-wrap"]}>
116+
<div className={`card ${styles["benchmark-card"]}`}>
117+
<Line data={normalizedData} options={ChartOptions}></Line>
118+
</div>
119+
<div className={`card ${styles["benchmark-card"]}`}>
120+
<Bar data={barData} options={ChartOptions}></Bar>
121+
</div>
122+
</div>
123+
</div>
124+
));
125+
};
126+
127+
return charts;
128+
};
129+
130+
131+
132+

src/pages/benchmarks/index.tsx

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,21 @@ export default function Benchmarks() {
2424
"quickjs",
2525
]);
2626

27-
const handleCheckboxChange = (engine: string) => {
27+
const [range, setRange] = useState<string>("6");
28+
console.log(range);
29+
30+
const handleEngineCheckboxChange = (engine: string) => {
2831
if (selectedEngines.includes(engine)) {
2932
setSelectedEngines(selectedEngines.filter((e) => e !== engine));
3033
} else {
3134
setSelectedEngines([...selectedEngines, engine]);
3235
}
3336
};
3437

38+
const handleRangeCheckboxChange = (evt: any) => {
39+
setRange(evt.target.value);
40+
};
41+
3542
return (
3643
<Layout title="Benchmarks" description="Boa Benchmarks Page">
3744
<div className={styles.container}>
@@ -54,15 +61,51 @@ export default function Benchmarks() {
5461
type="checkbox"
5562
value={engine}
5663
checked={selectedEngines.includes(engine)}
57-
onChange={() => handleCheckboxChange(engine)}
64+
onChange={() => handleEngineCheckboxChange(engine)}
5865
/>
5966
{engine}
6067
</label>
6168
</div>
6269
))}
6370
</div>
64-
<BenchmarkGraphs selectedEngines={selectedEngines} />
71+
72+
73+
<form>
74+
<fieldset className={styles.benchmarkControls}>
75+
<legend>Select rolling range</legend>
76+
<div className={styles.benchmarkLabelWrap}>
77+
<input
78+
type="radio"
79+
value={1}
80+
checked={range === "1"}
81+
onChange={handleRangeCheckboxChange}
82+
/>
83+
1 Month
84+
</div>
85+
86+
<div className={styles.benchmarkLabelWrap}>
87+
<input
88+
type="radio"
89+
value={6}
90+
checked={range === "6"}
91+
onChange={handleRangeCheckboxChange}
92+
/>
93+
6 Month
94+
</div>
95+
96+
<div className={styles.benchmarkLabelWrap}>
97+
<input
98+
type="radio"
99+
value={12}
100+
checked={range === "12"}
101+
onChange={handleRangeCheckboxChange}
102+
/>
103+
12 Month
104+
</div>
105+
</fieldset>
106+
</form>
107+
<BenchmarkGraphs selectedEngines={selectedEngines} range={range}/>
65108
</div>
66-
</Layout>
109+
</Layout >
67110
);
68111
}

0 commit comments

Comments
 (0)