Skip to content

Commit efa9762

Browse files
add benchmarks from api (#196)
* add benchmarks from api
1 parent b39ab9e commit efa9762

File tree

2 files changed

+107
-59
lines changed

2 files changed

+107
-59
lines changed

src/components/benchmarks/index.tsx

Lines changed: 61 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,50 @@ 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+
fetch(`https://boa-api.jason-williams.co.uk/benchmarks?months=${range}&engines=${selectedEngines.join(',')}`).then(
58+
(res) => res.json())
59+
.then(respData => {
60+
setData(respData)
61+
});
62+
}, [selectedEngines, range]);
7463

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

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-
);
68+
69+
return charts && charts.map((chart) => chart);
9270
};
9371

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
72+
const normalizeBenchmarkData = (benchmarkData: any[]) => {
73+
const labels = benchmarkData.map((entry: any) =>
74+
new Date(entry.date).toLocaleDateString(),
75+
);
76+
77+
const engines = Object.keys(benchmarkData[0]).filter(key => key != "date");
78+
9879
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-
}),
80+
labels,
81+
datasets: engines.map(engine => ({
82+
label: engine,
83+
data: benchmarkData.map(entry => entry[engine]),
84+
fill: false
85+
})),
11186
};
11287
};
11388

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

src/pages/benchmarks/index.tsx

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

27-
const handleCheckboxChange = (engine: string) => {
27+
const [range, setRange] = useState<string>("6");
28+
29+
const handleEngineCheckboxChange = (engine: string) => {
2830
if (selectedEngines.includes(engine)) {
2931
setSelectedEngines(selectedEngines.filter((e) => e !== engine));
3032
} else {
3133
setSelectedEngines([...selectedEngines, engine]);
3234
}
3335
};
3436

37+
const handleRangeCheckboxChange = (evt: any) => {
38+
setRange(evt.target.value);
39+
};
40+
3541
return (
3642
<Layout title="Benchmarks" description="Boa Benchmarks Page">
3743
<div className={styles.container}>
@@ -54,15 +60,51 @@ export default function Benchmarks() {
5460
type="checkbox"
5561
value={engine}
5662
checked={selectedEngines.includes(engine)}
57-
onChange={() => handleCheckboxChange(engine)}
63+
onChange={() => handleEngineCheckboxChange(engine)}
5864
/>
5965
{engine}
6066
</label>
6167
</div>
6268
))}
6369
</div>
64-
<BenchmarkGraphs selectedEngines={selectedEngines} />
70+
71+
72+
<form>
73+
<fieldset className={styles.benchmarkControls}>
74+
<legend>Select rolling range</legend>
75+
<div className={styles.benchmarkLabelWrap}>
76+
<input
77+
type="radio"
78+
value={1}
79+
checked={range === "1"}
80+
onChange={handleRangeCheckboxChange}
81+
/>
82+
1 Month
83+
</div>
84+
85+
<div className={styles.benchmarkLabelWrap}>
86+
<input
87+
type="radio"
88+
value={6}
89+
checked={range === "6"}
90+
onChange={handleRangeCheckboxChange}
91+
/>
92+
6 Month
93+
</div>
94+
95+
<div className={styles.benchmarkLabelWrap}>
96+
<input
97+
type="radio"
98+
value={12}
99+
checked={range === "12"}
100+
onChange={handleRangeCheckboxChange}
101+
/>
102+
12 Month
103+
</div>
104+
</fieldset>
105+
</form>
106+
<BenchmarkGraphs selectedEngines={selectedEngines} range={range}/>
65107
</div>
66-
</Layout>
108+
</Layout >
67109
);
68110
}

0 commit comments

Comments
 (0)