| <!-- |
| Copyright 2022 The Go Authors. All rights reserved. |
| Use of this source code is governed by a BSD-style |
| license that can be found in the LICENSE file. |
| --> |
| |
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <title>Go Performance Dashboard</title> |
| <link rel="icon" href="https://go.dev/favicon.ico"/> |
| <link rel="stylesheet" href="./static/style.css"/> |
| <script src="https://ajax.googleapis.com/ajax/libs/d3js/7.4.2/d3.min.js"></script> |
| <script src="./third_party/bandchart/bandchart.js"></script> |
| </head> |
| |
| <body class="Dashboard"> |
| <header class="Dashboard-topbar"> |
| <h1> |
| <a href="./">Go Performance Dashboard</a> |
| </h1> |
| <nav> |
| <ul> |
| <li><a href="https://build.golang.org">Build Dashboard</a></li> |
| </ul> |
| </nav> |
| </header> |
| |
| <nav class="Dashboard-controls"> |
| <ul> |
| <li> |
| <form autocomplete="off" action="./"> |
| <div class="Dashboard-search"> |
| <input id="benchmarkInput" type="text" name="benchmark" placeholder="Type benchmark name..."> |
| </div> |
| <input type="submit"> |
| </form> |
| </li> |
| <li><a href="?benchmark=all">All benchmarks</a></li> |
| </ul> |
| </nav> |
| |
| <script> |
| </script> |
| |
| <div id="dashboard"> |
| <h2 class="Dashboard-title" id="loading">Loading...</h2> |
| </div> |
| |
| <script> |
| function removeLoadingMessage() { |
| let loading = document.getElementById("loading"); |
| loading.parentNode.removeChild(loading); |
| } |
| |
| function addContent(benchmarks) { |
| let dashboard = document.getElementById("dashboard"); |
| |
| removeLoadingMessage(); |
| |
| let prevName = ""; |
| let grid = null; |
| for (const b in benchmarks) { |
| const bench = benchmarks[b]; |
| |
| if (bench.Name != prevName) { |
| prevName = bench.Name; |
| |
| let link = document.createElement("a"); |
| link.href = "?benchmark=" + bench.Name; |
| link.innerHTML = bench.Name; |
| |
| let title = document.createElement("h2"); |
| title.classList.add("Dashboard-title"); |
| title.appendChild(link); |
| dashboard.appendChild(title); |
| |
| grid = document.createElement("grid"); |
| grid.classList.add("Dashboard-grid"); |
| dashboard.appendChild(grid); |
| } |
| |
| let item = document.createElement("div"); |
| item.classList.add("Dashboard-grid-item"); |
| item.appendChild(BandChart(bench.Values, { |
| unit: bench.Unit, |
| })); |
| grid.appendChild(item); |
| } |
| } |
| |
| function failure(name) { |
| let dashboard = document.getElementById("dashboard"); |
| |
| removeLoadingMessage(); |
| |
| let title = document.createElement("h2"); |
| title.classList.add("Dashboard-title"); |
| title.innerHTML = "Benchmark \"" + name + "\" not found."; |
| dashboard.appendChild(title); |
| } |
| |
| let benchmark = (new URLSearchParams(window.location.search)).get('benchmark'); |
| let dataURL = './data.json'; |
| if (benchmark) { |
| dataURL += '?benchmark=' + benchmark; |
| } |
| fetch(dataURL) |
| .then(response => { |
| if (!response.ok) { |
| throw new Error("Data fetch failed"); |
| } |
| return response.json(); |
| }) |
| .then(function(benchmarks) { |
| // Convert CommitDate to a proper date. |
| benchmarks.forEach(function(b) { |
| b.Values.forEach(function(v) { |
| v.CommitDate = new Date(v.CommitDate); |
| }); |
| }); |
| |
| addContent(benchmarks); |
| }) |
| // This will look odd if the error isn't a 404 and benchmark is |
| // undefined, but close enough. |
| .catch(error => failure(benchmark)); |
| </script> |
| |
| </body> |
| </html> |