Skip to content

Instantly share code, notes, and snippets.

@bluss
Created September 20, 2019 16:33
Show Gist options
  • Save bluss/f57a987580d861d1c84ca162cae0b0ad to your computer and use it in GitHub Desktop.
Save bluss/f57a987580d861d1c84ca162cae0b0ad to your computer and use it in GitHub Desktop.
<html>
<head>
<title>Cargo Build Timings — ndarray 0.12.1</title>
<meta charset="utf-8">
<style type="text/css">
html {
font-family: sans-serif;
}
.canvas-container {
position: relative;
margin-top: 5px;
margin-bottom: 5px;
}
h1 {
border-bottom: 1px solid #c0c0c0;
}
.graph {
display: block;
}
.my-table {
margin-top: 20px;
margin-bottom: 20px;
border-collapse: collapse;
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.1);
}
.my-table th {
color: #d5dde5;
background: #1b1e24;
border-bottom: 4px solid #9ea7af;
border-right: 1px solid #343a45;
font-size: 18px;
font-weight: 100;
padding: 12px;
text-align: left;
vertical-align: middle;
}
.my-table th:first-child {
border-top-left-radius: 3px;
}
.my-table th:last-child {
border-top-right-radius: 3px;
border-right:none;
}
.my-table tr {
border-top: 1px solid #c1c3d1;
border-bottom: 1px solid #c1c3d1;
font-size: 16px;
font-weight: normal;
}
.my-table tr:first-child {
border-top:none;
}
.my-table tr:last-child {
border-bottom:none;
}
.my-table tr:nth-child(odd) td {
background: #ebebeb;
}
.my-table tr:last-child td:first-child {
border-bottom-left-radius:3px;
}
.my-table tr:last-child td:last-child {
border-bottom-right-radius:3px;
}
.my-table td {
background: #ffffff;
padding: 10px;
text-align: left;
vertical-align: middle;
font-weight: 300;
font-size: 14px;
border-right: 1px solid #C1C3D1;
}
.my-table td:last-child {
border-right: 0px;
}
.summary-table td:first-child {
vertical-align: top;
text-align: right;
}
.input-table td {
text-align: center;
}
</style>
</head>
<body>
<h1>Cargo Build Timings</h1>
<table class="my-table summary-table">
<tr>
<td>Targets:</td><td>ndarray 0.12.1 (bench "par_rayon")</td>
</tr>
<tr>
<td>Profile:</td><td>release</td>
</tr>
<tr>
<td>Fresh units:</td><td>0</td>
</tr>
<tr>
<td>Dirty units:</td><td>63</td>
</tr>
<tr>
<td>Total units:</td><td>63</td>
</tr>
<tr>
<td>Max concurrency:</td><td>4</td>
</tr>
<tr>
<td>Build start:</td><td>2019-09-20T16:28:02Z</td>
</tr>
<tr>
<td>Total time:</td><td>77s (1m 17s)</td>
</tr>
<tr>
<td>rustc:</td><td>rustc 1.39.0-nightly (9b9d2aff8 2019-09-19)<br>Host: x86_64-unknown-linux-gnu<br>Target: Host</td>
</tr>
</table>
<table class="input-table">
<tr>
<td><label for="min-unit-time">Min unit time:</label></td>
<td><label for="scale">Scale:</label></td>
</tr>
<tr>
<td><input type="range" min="0" max="30" step="0.1" value="0" id="min-unit-time"></td>
<td><input type="range" min="1" max="50" value="20" id="scale"></td>
</tr>
<tr>
<td><output for="min-unit-time" id="min-unit-time-output"></output></td>
<td><output for="scale" id="scale-output"></output></td>
</tr>
</table>
<div id="pipeline-container" class="canvas-container">
<canvas id="pipeline-graph" class="graph" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
<canvas id="pipeline-graph-lines" style="position: absolute; left: 0; top: 0; z-index: 1; pointer-events:none;"></canvas>
</div>
<div class="canvas-container">
<canvas id="timing-graph" class="graph"></canvas>
</div>
<table class="my-table">
<thead>
<tr>
<th></th>
<th>Unit</th>
<th>Total</th>
<th>Codegen</th>
<th>Features</th>
</tr>
</thead>
<tbody>
<tr>
<td>1.</td>
<td>ndarray v0.12.1</td>
<td>25.4s</td>
<td>1.1s (4%)</td>
<td>rayon</td>
</tr>
<tr>
<td>2.</td>
<td>rayon v1.2.0</td>
<td>13.7s</td>
<td>1.4s (11%)</td>
<td></td>
</tr>
<tr>
<td>3.</td>
<td>rand v0.6.5</td>
<td>11.8s</td>
<td>5.5s (47%)</td>
<td>alloc, default, rand_os, std</td>
</tr>
<tr>
<td>4.</td>
<td>matrixmultiply v0.2.3</td>
<td>11.3s</td>
<td>8.9s (79%)</td>
<td></td>
</tr>
<tr>
<td>5.</td>
<td>quickcheck v0.8.5</td>
<td>9.9s</td>
<td>6.0s (61%)</td>
<td></td>
</tr>
<tr>
<td>6.</td>
<td>rayon-core v1.6.0</td>
<td>8.8s</td>
<td>6.8s (78%)</td>
<td></td>
</tr>
<tr>
<td>7.</td>
<td>semver-parser v0.7.0</td>
<td>7.2s</td>
<td>6.4s (90%)</td>
<td></td>
</tr>
<tr>
<td>8.</td>
<td>ndarray v0.12.1 bench "par_rayon" (test)</td>
<td>6.9s</td>
<td>0.0s (0%)</td>
<td>rayon</td>
</tr>
<tr>
<td>9.</td>
<td>crossbeam-utils v0.6.6</td>
<td>6.9s</td>
<td>5.5s (80%)</td>
<td>default, lazy_static, std</td>
</tr>
<tr>
<td>10.</td>
<td>num-traits v0.2.8</td>
<td>6.6s</td>
<td>1.6s (24%)</td>
<td>default, std</td>
</tr>
<tr>
<td>11.</td>
<td>semver v0.9.0</td>
<td>6.2s</td>
<td>4.8s (77%)</td>
<td>default</td>
</tr>
<tr>
<td>12.</td>
<td>itertools v0.8.0</td>
<td>6.0s</td>
<td>0.1s (2%)</td>
<td>use_std</td>
</tr>
<tr>
<td>13.</td>
<td>autocfg v0.1.6</td>
<td>5.8s</td>
<td>5.1s (88%)</td>
<td></td>
</tr>
<tr>
<td>14.</td>
<td>num_cpus v1.10.1</td>
<td>5.5s</td>
<td>5.1s (94%)</td>
<td></td>
</tr>
<tr>
<td>15.</td>
<td>num-complex v0.2.3</td>
<td>5.1s</td>
<td>1.3s (25%)</td>
<td>default, std</td>
</tr>
<tr>
<td>16.</td>
<td>crossbeam-epoch v0.7.2</td>
<td>4.8s</td>
<td>3.5s (72%)</td>
<td>default, lazy_static, std</td>
</tr>
<tr>
<td>17.</td>
<td>rustc_version v0.2.3</td>
<td>4.8s</td>
<td>4.0s (85%)</td>
<td></td>
</tr>
<tr>
<td>18.</td>
<td>libc v0.2.62</td>
<td>4.0s</td>
<td>0.7s (18%)</td>
<td>default, std</td>
</tr>
<tr>
<td>19.</td>
<td>num-integer v0.1.41</td>
<td>3.5s</td>
<td>2.0s (56%)</td>
<td>default, std</td>
</tr>
<tr>
<td>20.</td>
<td>arrayvec v0.4.11 custom-build</td>
<td>3.1s</td>
<td>0.0s (0%)</td>
<td></td>
</tr>
<tr>
<td>21.</td>
<td>rand_hc v0.1.0</td>
<td>3.0s</td>
<td>2.3s (78%)</td>
<td></td>
</tr>
<tr>
<td>22.</td>
<td>rand_isaac v0.1.1</td>
<td>2.9s</td>
<td>2.2s (74%)</td>
<td></td>
</tr>
<tr>
<td>23.</td>
<td>libc v0.2.62 custom-build</td>
<td>2.7s</td>
<td>0.0s (0%)</td>
<td>default, std</td>
</tr>
<tr>
<td>24.</td>
<td>rand_os v0.1.3</td>
<td>2.6s</td>
<td>2.1s (80%)</td>
<td></td>
</tr>
<tr>
<td>25.</td>
<td>arrayvec v0.4.11</td>
<td>2.0s</td>
<td>0.0s (2%)</td>
<td></td>
</tr>
<tr>
<td>26.</td>
<td>rand_core v0.4.2</td>
<td>1.8s</td>
<td>0.9s (50%)</td>
<td>alloc, std</td>
</tr>
<tr>
<td>27.</td>
<td>memoffset v0.5.1 custom-build</td>
<td>1.6s</td>
<td>0.0s (0%)</td>
<td></td>
</tr>
<tr>
<td>28.</td>
<td>rand_chacha v0.1.1</td>
<td>1.5s</td>
<td>0.9s (59%)</td>
<td></td>
</tr>
<tr>
<td>29.</td>
<td>rand_jitter v0.1.4</td>
<td>1.4s</td>
<td>0.9s (62%)</td>
<td>std</td>
</tr>
<tr>
<td>30.</td>
<td>num-complex v0.2.3 custom-build</td>
<td>1.3s</td>
<td>0.0s (0%)</td>
<td>default, std</td>
</tr>
<tr>
<td>31.</td>
<td>num-traits v0.2.8 custom-build</td>
<td>1.2s</td>
<td>0.0s (0%)</td>
<td>default, std</td>
</tr>
<tr>
<td>32.</td>
<td>crossbeam-deque v0.7.1</td>
<td>1.1s</td>
<td>0.1s (6%)</td>
<td></td>
</tr>
<tr>
<td>33.</td>
<td>rand v0.6.5 custom-build</td>
<td>1.1s</td>
<td>0.0s (0%)</td>
<td>alloc, default, rand_os, std</td>
</tr>
<tr>
<td>34.</td>
<td>num-integer v0.1.41 custom-build</td>
<td>1.0s</td>
<td>0.0s (0%)</td>
<td>default, std</td>
</tr>
<tr>
<td>35.</td>
<td>rand_xorshift v0.1.1</td>
<td>0.9s</td>
<td>0.5s (53%)</td>
<td></td>
</tr>
<tr>
<td>36.</td>
<td>rand_pcg v0.1.2 custom-build</td>
<td>0.8s</td>
<td>0.0s (0%)</td>
<td></td>
</tr>
<tr>
<td>37.</td>
<td>crossbeam-queue v0.1.2</td>
<td>0.8s</td>
<td>0.1s (7%)</td>
<td></td>
</tr>
<tr>
<td>38.</td>
<td>rand_chacha v0.1.1 custom-build</td>
<td>0.8s</td>
<td>0.0s (0%)</td>
<td></td>
</tr>
<tr>
<td>39.</td>
<td>either v1.5.3</td>
<td>0.8s</td>
<td>0.0s (4%)</td>
<td></td>
</tr>
<tr>
<td>40.</td>
<td>rand_pcg v0.1.2</td>
<td>0.7s</td>
<td>0.3s (43%)</td>
<td></td>
</tr>
<tr>
<td>41.</td>
<td>approx v0.3.2</td>
<td>0.7s</td>
<td>0.0s (4%)</td>
<td>default, std</td>
</tr>
<tr>
<td>42.</td>
<td>ndarray v0.12.1 custom-build</td>
<td>0.6s</td>
<td>0.0s (0%)</td>
<td>rayon</td>
</tr>
<tr>
<td>43.</td>
<td>rayon-core v1.6.0 custom-build</td>
<td>0.5s</td>
<td>0.0s (0%)</td>
<td></td>
</tr>
<tr>
<td>44.</td>
<td>num-traits v0.2.8 custom-build (run)</td>
<td>0.4s</td>
<td>0.0s (0%)</td>
<td>default, std</td>
</tr>
<tr>
<td>45.</td>
<td>num-complex v0.2.3 custom-build (run)</td>
<td>0.3s</td>
<td>0.0s (0%)</td>
<td>default, std</td>
</tr>
<tr>
<td>46.</td>
<td>lazy_static v1.4.0</td>
<td>0.3s</td>
<td>0.0s (10%)</td>
<td></td>
</tr>
<tr>
<td>47.</td>
<td>num-integer v0.1.41 custom-build (run)</td>
<td>0.3s</td>
<td>0.0s (0%)</td>
<td>default, std</td>
</tr>
<tr>
<td>48.</td>
<td>scopeguard v1.0.0</td>
<td>0.3s</td>
<td>0.0s (13%)</td>
<td></td>
</tr>
<tr>
<td>49.</td>
<td>arrayvec v0.4.11 custom-build (run)</td>
<td>0.2s</td>
<td>0.0s (0%)</td>
<td></td>
</tr>
<tr>
<td>50.</td>
<td>rawpointer v0.2.1</td>
<td>0.2s</td>
<td>0.0s (14%)</td>
<td></td>
</tr>
<tr>
<td>51.</td>
<td>rand_pcg v0.1.2 custom-build (run)</td>
<td>0.2s</td>
<td>0.0s (0%)</td>
<td></td>
</tr>
<tr>
<td>52.</td>
<td>rand_chacha v0.1.1 custom-build (run)</td>
<td>0.2s</td>
<td>0.0s (0%)</td>
<td></td>
</tr>
<tr>
<td>53.</td>
<td>rand v0.6.5 custom-build (run)</td>
<td>0.2s</td>
<td>0.0s (0%)</td>
<td>alloc, default, rand_os, std</td>
</tr>
<tr>
<td>54.</td>
<td>rand_core v0.3.1</td>
<td>0.2s</td>
<td>0.0s (21%)</td>
<td></td>
</tr>
<tr>
<td>55.</td>
<td>nodrop v0.1.13</td>
<td>0.1s</td>
<td>0.0s (18%)</td>
<td></td>
</tr>
<tr>
<td>56.</td>
<td>memoffset v0.5.1 custom-build (run)</td>
<td>0.1s</td>
<td>0.0s (0%)</td>
<td></td>
</tr>
<tr>
<td>57.</td>
<td>defmac v0.2.1</td>
<td>0.1s</td>
<td>0.0s (22%)</td>
<td></td>
</tr>
<tr>
<td>58.</td>
<td>memoffset v0.5.1</td>
<td>0.1s</td>
<td>0.0s (20%)</td>
<td></td>
</tr>
<tr>
<td>59.</td>
<td>cfg-if v0.1.9</td>
<td>0.1s</td>
<td>0.0s (22%)</td>
<td></td>
</tr>
<tr>
<td>60.</td>
<td>libc v0.2.62 custom-build (run)</td>
<td>0.0s</td>
<td>0.0s (0%)</td>
<td>default, std</td>
</tr>
<tr>
<td>61.</td>
<td>ndarray v0.12.1 custom-build (run)</td>
<td>0.0s</td>
<td>0.0s (1%)</td>
<td>rayon</td>
</tr>
<tr>
<td>62.</td>
<td>ndarray v0.12.1 custom-build (run)</td>
<td>0.0s</td>
<td>0.0s (1%)</td>
<td>rayon</td>
</tr>
<tr>
<td>63.</td>
<td>rayon-core v1.6.0 custom-build (run)</td>
<td>0.0s</td>
<td>0.0s (1%)</td>
<td></td>
</tr>
</tbody>
</table>
<script>
DURATION = 77;
const UNIT_DATA = [
{
"i": 0,
"name": "semver-parser",
"version": "0.7.0",
"mode": "todo",
"target": "",
"start": 0.36,
"duration": 7.19,
"rmeta_time": 0.74,
"unlocked_units": [],
"unlocked_rmeta_units": [
15
]
},
{
"i": 1,
"name": "arrayvec",
"version": "0.4.11",
"mode": "todo",
"target": " custom-build",
"start": 0.36,
"duration": 3.07,
"rmeta_time": 3.07,
"unlocked_units": [
17
],
"unlocked_rmeta_units": []
},
{
"i": 2,
"name": "libc",
"version": "0.2.62",
"mode": "todo",
"target": " custom-build",
"start": 0.36,
"duration": 2.71,
"rmeta_time": 2.71,
"unlocked_units": [
16
],
"unlocked_rmeta_units": []
},
{
"i": 3,
"name": "cfg-if",
"version": "0.1.9",
"mode": "todo",
"target": "",
"start": 0.36,
"duration": 0.11,
"rmeta_time": 0.08,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 4,
"name": "nodrop",
"version": "0.1.13",
"mode": "todo",
"target": "",
"start": 0.47,
"duration": 0.15,
"rmeta_time": 0.12,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 5,
"name": "lazy_static",
"version": "1.4.0",
"mode": "todo",
"target": "",
"start": 0.61,
"duration": 0.28,
"rmeta_time": 0.25,
"unlocked_units": [],
"unlocked_rmeta_units": [
14
]
},
{
"i": 6,
"name": "autocfg",
"version": "0.1.6",
"mode": "todo",
"target": "",
"start": 0.9,
"duration": 5.82,
"rmeta_time": 0.73,
"unlocked_units": [
30,
29,
26,
27,
28,
25
],
"unlocked_rmeta_units": []
},
{
"i": 7,
"name": "scopeguard",
"version": "1.0.0",
"mode": "todo",
"target": "",
"start": 3.07,
"duration": 0.26,
"rmeta_time": 0.23,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 8,
"name": "rayon-core",
"version": "1.6.0",
"mode": "todo",
"target": " custom-build",
"start": 3.33,
"duration": 0.53,
"rmeta_time": 0.53,
"unlocked_units": [
18
],
"unlocked_rmeta_units": []
},
{
"i": 9,
"name": "rand_core",
"version": "0.4.2",
"mode": "todo",
"target": "",
"start": 3.43,
"duration": 1.78,
"rmeta_time": 0.9,
"unlocked_units": [],
"unlocked_rmeta_units": [
20,
19
]
},
{
"i": 10,
"name": "ndarray",
"version": "0.12.1",
"mode": "todo",
"target": " custom-build",
"start": 3.86,
"duration": 0.58,
"rmeta_time": 0.58,
"unlocked_units": [
21,
22
],
"unlocked_rmeta_units": []
},
{
"i": 11,
"name": "rawpointer",
"version": "0.2.1",
"mode": "todo",
"target": "",
"start": 4.44,
"duration": 0.2,
"rmeta_time": 0.17,
"unlocked_units": [],
"unlocked_rmeta_units": [
23
]
},
{
"i": 12,
"name": "either",
"version": "1.5.3",
"mode": "todo",
"target": "",
"start": 4.65,
"duration": 0.76,
"rmeta_time": 0.73,
"unlocked_units": [],
"unlocked_rmeta_units": [
24
]
},
{
"i": 13,
"name": "defmac",
"version": "0.2.1",
"mode": "todo",
"target": "",
"start": 5.21,
"duration": 0.13,
"rmeta_time": 0.1,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 14,
"name": "crossbeam-utils",
"version": "0.6.6",
"mode": "todo",
"target": "",
"start": 5.34,
"duration": 6.86,
"rmeta_time": 1.4,
"unlocked_units": [],
"unlocked_rmeta_units": [
31
]
},
{
"i": 15,
"name": "semver",
"version": "0.9.0",
"mode": "todo",
"target": "",
"start": 5.41,
"duration": 6.16,
"rmeta_time": 1.41,
"unlocked_units": [],
"unlocked_rmeta_units": [
33
]
},
{
"i": 16,
"name": "libc",
"version": "0.2.62",
"mode": "run-custom-build",
"target": " custom-build (run)",
"start": 6.72,
"duration": 0.03,
"rmeta_time": 0.03,
"unlocked_units": [
32
],
"unlocked_rmeta_units": []
},
{
"i": 17,
"name": "arrayvec",
"version": "0.4.11",
"mode": "run-custom-build",
"target": " custom-build (run)",
"start": 6.75,
"duration": 0.21,
"rmeta_time": 0.21,
"unlocked_units": [
34
],
"unlocked_rmeta_units": []
},
{
"i": 18,
"name": "rayon-core",
"version": "1.6.0",
"mode": "run-custom-build",
"target": " custom-build (run)",
"start": 6.96,
"duration": 0.0,
"rmeta_time": 0.0,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 19,
"name": "rand_core",
"version": "0.3.1",
"mode": "todo",
"target": "",
"start": 6.96,
"duration": 0.15,
"rmeta_time": 0.12,
"unlocked_units": [],
"unlocked_rmeta_units": [
35,
37,
36
]
},
{
"i": 20,
"name": "rand_jitter",
"version": "0.1.4",
"mode": "todo",
"target": "",
"start": 7.12,
"duration": 1.45,
"rmeta_time": 0.54,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 21,
"name": "ndarray",
"version": "0.12.1",
"mode": "run-custom-build",
"target": " custom-build (run)",
"start": 7.55,
"duration": 0.0,
"rmeta_time": 0.0,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 22,
"name": "ndarray",
"version": "0.12.1",
"mode": "run-custom-build",
"target": " custom-build (run)",
"start": 7.55,
"duration": 0.01,
"rmeta_time": 0.01,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 23,
"name": "matrixmultiply",
"version": "0.2.3",
"mode": "todo",
"target": "",
"start": 7.56,
"duration": 11.34,
"rmeta_time": 2.41,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 24,
"name": "itertools",
"version": "0.8.0",
"mode": "todo",
"target": "",
"start": 8.57,
"duration": 5.99,
"rmeta_time": 5.86,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 25,
"name": "rand_pcg",
"version": "0.1.2",
"mode": "todo",
"target": " custom-build",
"start": 11.58,
"duration": 0.84,
"rmeta_time": 0.84,
"unlocked_units": [
38
],
"unlocked_rmeta_units": []
},
{
"i": 26,
"name": "num-traits",
"version": "0.2.8",
"mode": "todo",
"target": " custom-build",
"start": 12.2,
"duration": 1.19,
"rmeta_time": 1.19,
"unlocked_units": [
40
],
"unlocked_rmeta_units": []
},
{
"i": 27,
"name": "rand_chacha",
"version": "0.1.1",
"mode": "todo",
"target": " custom-build",
"start": 12.42,
"duration": 0.78,
"rmeta_time": 0.78,
"unlocked_units": [
39
],
"unlocked_rmeta_units": []
},
{
"i": 28,
"name": "rand",
"version": "0.6.5",
"mode": "todo",
"target": " custom-build",
"start": 13.2,
"duration": 1.06,
"rmeta_time": 1.06,
"unlocked_units": [
41
],
"unlocked_rmeta_units": []
},
{
"i": 29,
"name": "num-complex",
"version": "0.2.3",
"mode": "todo",
"target": " custom-build",
"start": 13.39,
"duration": 1.32,
"rmeta_time": 1.32,
"unlocked_units": [
42
],
"unlocked_rmeta_units": []
},
{
"i": 30,
"name": "num-integer",
"version": "0.1.41",
"mode": "todo",
"target": " custom-build",
"start": 14.26,
"duration": 1.01,
"rmeta_time": 1.01,
"unlocked_units": [
43
],
"unlocked_rmeta_units": []
},
{
"i": 31,
"name": "crossbeam-queue",
"version": "0.1.2",
"mode": "todo",
"target": "",
"start": 14.56,
"duration": 0.83,
"rmeta_time": 0.77,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 32,
"name": "libc",
"version": "0.2.62",
"mode": "todo",
"target": "",
"start": 14.71,
"duration": 3.98,
"rmeta_time": 3.28,
"unlocked_units": [],
"unlocked_rmeta_units": [
45,
44
]
},
{
"i": 33,
"name": "rustc_version",
"version": "0.2.3",
"mode": "todo",
"target": "",
"start": 15.27,
"duration": 4.77,
"rmeta_time": 0.74,
"unlocked_units": [
49
],
"unlocked_rmeta_units": []
},
{
"i": 34,
"name": "arrayvec",
"version": "0.4.11",
"mode": "todo",
"target": "",
"start": 15.39,
"duration": 2.02,
"rmeta_time": 1.98,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 35,
"name": "rand_xorshift",
"version": "0.1.1",
"mode": "todo",
"target": "",
"start": 17.4,
"duration": 0.86,
"rmeta_time": 0.4,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 36,
"name": "rand_isaac",
"version": "0.1.1",
"mode": "todo",
"target": "",
"start": 18.27,
"duration": 2.91,
"rmeta_time": 0.76,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 37,
"name": "rand_hc",
"version": "0.1.0",
"mode": "todo",
"target": "",
"start": 18.69,
"duration": 3.0,
"rmeta_time": 0.67,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 38,
"name": "rand_pcg",
"version": "0.1.2",
"mode": "run-custom-build",
"target": " custom-build (run)",
"start": 18.9,
"duration": 0.19,
"rmeta_time": 0.19,
"unlocked_units": [
46
],
"unlocked_rmeta_units": []
},
{
"i": 39,
"name": "rand_chacha",
"version": "0.1.1",
"mode": "run-custom-build",
"target": " custom-build (run)",
"start": 19.09,
"duration": 0.18,
"rmeta_time": 0.18,
"unlocked_units": [
47
],
"unlocked_rmeta_units": []
},
{
"i": 40,
"name": "num-traits",
"version": "0.2.8",
"mode": "run-custom-build",
"target": " custom-build (run)",
"start": 19.28,
"duration": 0.39,
"rmeta_time": 0.39,
"unlocked_units": [
48
],
"unlocked_rmeta_units": []
},
{
"i": 41,
"name": "rand",
"version": "0.6.5",
"mode": "run-custom-build",
"target": " custom-build (run)",
"start": 19.66,
"duration": 0.16,
"rmeta_time": 0.16,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 42,
"name": "num-complex",
"version": "0.2.3",
"mode": "run-custom-build",
"target": " custom-build (run)",
"start": 19.83,
"duration": 0.29,
"rmeta_time": 0.29,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 43,
"name": "num-integer",
"version": "0.1.41",
"mode": "run-custom-build",
"target": " custom-build (run)",
"start": 20.05,
"duration": 0.26,
"rmeta_time": 0.26,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 44,
"name": "num_cpus",
"version": "1.10.1",
"mode": "todo",
"target": "",
"start": 20.12,
"duration": 5.48,
"rmeta_time": 0.35,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 45,
"name": "rand_os",
"version": "0.1.3",
"mode": "todo",
"target": "",
"start": 20.31,
"duration": 2.57,
"rmeta_time": 0.5,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 46,
"name": "rand_pcg",
"version": "0.1.2",
"mode": "todo",
"target": "",
"start": 21.17,
"duration": 0.74,
"rmeta_time": 0.42,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 47,
"name": "rand_chacha",
"version": "0.1.1",
"mode": "todo",
"target": "",
"start": 21.69,
"duration": 1.5,
"rmeta_time": 0.61,
"unlocked_units": [],
"unlocked_rmeta_units": [
50
]
},
{
"i": 48,
"name": "num-traits",
"version": "0.2.8",
"mode": "todo",
"target": "",
"start": 21.92,
"duration": 6.59,
"rmeta_time": 4.98,
"unlocked_units": [],
"unlocked_rmeta_units": [
56,
57,
55
]
},
{
"i": 49,
"name": "memoffset",
"version": "0.5.1",
"mode": "todo",
"target": " custom-build",
"start": 22.88,
"duration": 1.61,
"rmeta_time": 1.61,
"unlocked_units": [
51
],
"unlocked_rmeta_units": []
},
{
"i": 50,
"name": "rand",
"version": "0.6.5",
"mode": "todo",
"target": "",
"start": 23.19,
"duration": 11.75,
"rmeta_time": 6.27,
"unlocked_units": [],
"unlocked_rmeta_units": [
59
]
},
{
"i": 51,
"name": "memoffset",
"version": "0.5.1",
"mode": "run-custom-build",
"target": " custom-build (run)",
"start": 24.49,
"duration": 0.14,
"rmeta_time": 0.14,
"unlocked_units": [
52
],
"unlocked_rmeta_units": []
},
{
"i": 52,
"name": "memoffset",
"version": "0.5.1",
"mode": "todo",
"target": "",
"start": 24.64,
"duration": 0.11,
"rmeta_time": 0.09,
"unlocked_units": [],
"unlocked_rmeta_units": [
53
]
},
{
"i": 53,
"name": "crossbeam-epoch",
"version": "0.7.2",
"mode": "todo",
"target": "",
"start": 24.75,
"duration": 4.83,
"rmeta_time": 1.34,
"unlocked_units": [],
"unlocked_rmeta_units": [
54
]
},
{
"i": 54,
"name": "crossbeam-deque",
"version": "0.7.1",
"mode": "todo",
"target": "",
"start": 26.09,
"duration": 1.13,
"rmeta_time": 1.07,
"unlocked_units": [],
"unlocked_rmeta_units": [
58
]
},
{
"i": 55,
"name": "num-complex",
"version": "0.2.3",
"mode": "todo",
"target": "",
"start": 27.22,
"duration": 5.11,
"rmeta_time": 3.86,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 56,
"name": "num-integer",
"version": "0.1.41",
"mode": "todo",
"target": "",
"start": 28.51,
"duration": 3.5,
"rmeta_time": 1.54,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 57,
"name": "approx",
"version": "0.3.2",
"mode": "todo",
"target": "",
"start": 29.58,
"duration": 0.71,
"rmeta_time": 0.68,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 58,
"name": "rayon-core",
"version": "1.6.0",
"mode": "todo",
"target": "",
"start": 30.29,
"duration": 8.82,
"rmeta_time": 1.97,
"unlocked_units": [],
"unlocked_rmeta_units": [
60
]
},
{
"i": 59,
"name": "quickcheck",
"version": "0.8.5",
"mode": "todo",
"target": "",
"start": 32.02,
"duration": 9.92,
"rmeta_time": 3.91,
"unlocked_units": [],
"unlocked_rmeta_units": []
},
{
"i": 60,
"name": "rayon",
"version": "1.2.0",
"mode": "todo",
"target": "",
"start": 32.34,
"duration": 13.67,
"rmeta_time": 12.23,
"unlocked_units": [],
"unlocked_rmeta_units": [
61
]
},
{
"i": 61,
"name": "ndarray",
"version": "0.12.1",
"mode": "todo",
"target": "",
"start": 44.57,
"duration": 25.38,
"rmeta_time": 24.28,
"unlocked_units": [
62
],
"unlocked_rmeta_units": []
},
{
"i": 62,
"name": "ndarray",
"version": "0.12.1",
"mode": "todo",
"target": " bench \"par_rayon\" (test)",
"start": 69.95,
"duration": 6.89,
"rmeta_time": 6.89,
"unlocked_units": [],
"unlocked_rmeta_units": []
}
];
const CONCURRENCY_DATA = [
{
"t": 0.357564186,
"active": 1,
"waiting": 13,
"inactive": 49
},
{
"t": 0.358156752,
"active": 4,
"waiting": 10,
"inactive": 49
},
{
"t": 0.359465115,
"active": 4,
"waiting": 10,
"inactive": 49
},
{
"t": 0.360028265,
"active": 4,
"waiting": 10,
"inactive": 49
},
{
"t": 0.441712283,
"active": 4,
"waiting": 10,
"inactive": 49
},
{
"t": 0.465074049,
"active": 4,
"waiting": 9,
"inactive": 49
},
{
"t": 0.465377996,
"active": 4,
"waiting": 9,
"inactive": 49
},
{
"t": 0.586102964,
"active": 4,
"waiting": 9,
"inactive": 49
},
{
"t": 0.613793116,
"active": 4,
"waiting": 8,
"inactive": 49
},
{
"t": 0.614424087,
"active": 4,
"waiting": 8,
"inactive": 49
},
{
"t": 0.86743988,
"active": 4,
"waiting": 9,
"inactive": 48
},
{
"t": 0.894792136,
"active": 4,
"waiting": 8,
"inactive": 48
},
{
"t": 0.895048494,
"active": 4,
"waiting": 8,
"inactive": 48
},
{
"t": 1.099723167,
"active": 4,
"waiting": 9,
"inactive": 47
},
{
"t": 1.62169914,
"active": 4,
"waiting": 9,
"inactive": 47
},
{
"t": 3.070548156,
"active": 4,
"waiting": 9,
"inactive": 47
},
{
"t": 3.070943683,
"active": 4,
"waiting": 9,
"inactive": 46
},
{
"t": 3.071386603,
"active": 4,
"waiting": 9,
"inactive": 46
},
{
"t": 3.298237679,
"active": 4,
"waiting": 9,
"inactive": 46
},
{
"t": 3.3332160809999998,
"active": 4,
"waiting": 8,
"inactive": 46
},
{
"t": 3.333541356,
"active": 4,
"waiting": 8,
"inactive": 46
},
{
"t": 3.425362596,
"active": 4,
"waiting": 8,
"inactive": 46
},
{
"t": 3.42581206,
"active": 4,
"waiting": 8,
"inactive": 45
},
{
"t": 3.426041885,
"active": 4,
"waiting": 8,
"inactive": 45
},
{
"t": 3.860842404,
"active": 4,
"waiting": 8,
"inactive": 45
},
{
"t": 3.861313313,
"active": 4,
"waiting": 8,
"inactive": 44
},
{
"t": 3.861604648,
"active": 4,
"waiting": 8,
"inactive": 44
},
{
"t": 4.321712747,
"active": 4,
"waiting": 10,
"inactive": 42
},
{
"t": 4.443685457,
"active": 4,
"waiting": 10,
"inactive": 42
},
{
"t": 4.4441119669999996,
"active": 4,
"waiting": 11,
"inactive": 40
},
{
"t": 4.444377541,
"active": 4,
"waiting": 11,
"inactive": 40
},
{
"t": 4.618374702,
"active": 4,
"waiting": 12,
"inactive": 39
},
{
"t": 4.646855667,
"active": 4,
"waiting": 11,
"inactive": 39
},
{
"t": 4.647285921,
"active": 4,
"waiting": 11,
"inactive": 39
},
{
"t": 5.205963798,
"active": 4,
"waiting": 10,
"inactive": 39
},
{
"t": 5.206681963,
"active": 4,
"waiting": 10,
"inactive": 39
},
{
"t": 5.310045644,
"active": 4,
"waiting": 10,
"inactive": 39
},
{
"t": 5.340200498,
"active": 4,
"waiting": 9,
"inactive": 39
},
{
"t": 5.340433704,
"active": 4,
"waiting": 9,
"inactive": 39
},
{
"t": 5.378679856,
"active": 4,
"waiting": 10,
"inactive": 38
},
{
"t": 5.4125761390000005,
"active": 4,
"waiting": 9,
"inactive": 38
},
{
"t": 5.412822625,
"active": 4,
"waiting": 9,
"inactive": 38
},
{
"t": 6.719278714,
"active": 4,
"waiting": 14,
"inactive": 32
},
{
"t": 6.7196038609999995,
"active": 4,
"waiting": 14,
"inactive": 32
},
{
"t": 6.73861463,
"active": 4,
"waiting": 15,
"inactive": 31
},
{
"t": 6.744871322,
"active": 4,
"waiting": 15,
"inactive": 31
},
{
"t": 6.745214252,
"active": 4,
"waiting": 15,
"inactive": 30
},
{
"t": 6.745561261,
"active": 4,
"waiting": 15,
"inactive": 30
},
{
"t": 6.826525859,
"active": 4,
"waiting": 16,
"inactive": 29
},
{
"t": 6.958679958,
"active": 4,
"waiting": 16,
"inactive": 29
},
{
"t": 6.959068436,
"active": 4,
"waiting": 16,
"inactive": 28
},
{
"t": 6.959404067,
"active": 4,
"waiting": 16,
"inactive": 28
},
{
"t": 6.9636563460000005,
"active": 4,
"waiting": 16,
"inactive": 28
},
{
"t": 6.964067127,
"active": 4,
"waiting": 15,
"inactive": 28
},
{
"t": 6.964729491,
"active": 4,
"waiting": 15,
"inactive": 28
},
{
"t": 7.086527955,
"active": 4,
"waiting": 18,
"inactive": 25
},
{
"t": 7.119745373,
"active": 4,
"waiting": 17,
"inactive": 25
},
{
"t": 7.120139838,
"active": 4,
"waiting": 17,
"inactive": 25
},
{
"t": 7.546795267,
"active": 4,
"waiting": 16,
"inactive": 25
},
{
"t": 7.547049229,
"active": 4,
"waiting": 16,
"inactive": 25
},
{
"t": 7.551605542,
"active": 4,
"waiting": 16,
"inactive": 25
},
{
"t": 7.551898995,
"active": 4,
"waiting": 15,
"inactive": 25
},
{
"t": 7.552317721,
"active": 4,
"waiting": 15,
"inactive": 25
},
{
"t": 7.557411299,
"active": 4,
"waiting": 15,
"inactive": 25
},
{
"t": 7.558093608,
"active": 4,
"waiting": 14,
"inactive": 25
},
{
"t": 7.558182386,
"active": 4,
"waiting": 14,
"inactive": 25
},
{
"t": 7.664771408,
"active": 4,
"waiting": 14,
"inactive": 25
},
{
"t": 8.567497342,
"active": 4,
"waiting": 13,
"inactive": 25
},
{
"t": 8.567732953,
"active": 4,
"waiting": 13,
"inactive": 25
},
{
"t": 9.970249168,
"active": 4,
"waiting": 13,
"inactive": 25
},
{
"t": 11.577823903,
"active": 4,
"waiting": 12,
"inactive": 25
},
{
"t": 11.578280229,
"active": 4,
"waiting": 12,
"inactive": 25
},
{
"t": 12.198719619,
"active": 4,
"waiting": 11,
"inactive": 25
},
{
"t": 12.199014666,
"active": 4,
"waiting": 11,
"inactive": 25
},
{
"t": 12.422879835,
"active": 4,
"waiting": 11,
"inactive": 25
},
{
"t": 12.423338667,
"active": 4,
"waiting": 11,
"inactive": 24
},
{
"t": 12.423741557,
"active": 4,
"waiting": 11,
"inactive": 24
},
{
"t": 13.200527867,
"active": 4,
"waiting": 11,
"inactive": 24
},
{
"t": 13.20088265,
"active": 4,
"waiting": 11,
"inactive": 23
},
{
"t": 13.20108778,
"active": 4,
"waiting": 11,
"inactive": 23
},
{
"t": 13.393229654,
"active": 4,
"waiting": 11,
"inactive": 23
},
{
"t": 13.393652909,
"active": 4,
"waiting": 11,
"inactive": 22
},
{
"t": 13.393933521,
"active": 4,
"waiting": 11,
"inactive": 22
},
{
"t": 14.257863028,
"active": 4,
"waiting": 11,
"inactive": 22
},
{
"t": 14.258241561,
"active": 4,
"waiting": 11,
"inactive": 21
},
{
"t": 14.258592529,
"active": 4,
"waiting": 11,
"inactive": 21
},
{
"t": 14.425359152,
"active": 4,
"waiting": 11,
"inactive": 21
},
{
"t": 14.555339153,
"active": 4,
"waiting": 10,
"inactive": 21
},
{
"t": 14.555708401,
"active": 4,
"waiting": 10,
"inactive": 21
},
{
"t": 14.709437238,
"active": 4,
"waiting": 10,
"inactive": 21
},
{
"t": 14.709792228,
"active": 4,
"waiting": 10,
"inactive": 20
},
{
"t": 14.71037838,
"active": 4,
"waiting": 10,
"inactive": 20
},
{
"t": 15.272039407,
"active": 4,
"waiting": 10,
"inactive": 20
},
{
"t": 15.272499896,
"active": 4,
"waiting": 10,
"inactive": 19
},
{
"t": 15.272956292,
"active": 4,
"waiting": 10,
"inactive": 19
},
{
"t": 15.326659537,
"active": 4,
"waiting": 10,
"inactive": 19
},
{
"t": 15.388086582,
"active": 4,
"waiting": 9,
"inactive": 19
},
{
"t": 15.388432178,
"active": 4,
"waiting": 9,
"inactive": 19
},
{
"t": 16.009091749,
"active": 4,
"waiting": 9,
"inactive": 19
},
{
"t": 17.372174344,
"active": 4,
"waiting": 9,
"inactive": 19
},
{
"t": 17.403935258,
"active": 4,
"waiting": 8,
"inactive": 19
},
{
"t": 17.404158047,
"active": 4,
"waiting": 8,
"inactive": 19
},
{
"t": 17.806125661,
"active": 4,
"waiting": 8,
"inactive": 19
},
{
"t": 17.988911146,
"active": 4,
"waiting": 10,
"inactive": 17
},
{
"t": 18.263787377,
"active": 4,
"waiting": 9,
"inactive": 17
},
{
"t": 18.265213549,
"active": 4,
"waiting": 9,
"inactive": 17
},
{
"t": 18.688360099,
"active": 4,
"waiting": 8,
"inactive": 17
},
{
"t": 18.688664135,
"active": 4,
"waiting": 8,
"inactive": 17
},
{
"t": 18.896088126,
"active": 4,
"waiting": 7,
"inactive": 17
},
{
"t": 18.896839822,
"active": 4,
"waiting": 7,
"inactive": 17
},
{
"t": 19.023091418,
"active": 4,
"waiting": 7,
"inactive": 17
},
{
"t": 19.089329856,
"active": 4,
"waiting": 7,
"inactive": 17
},
{
"t": 19.08961318,
"active": 4,
"waiting": 7,
"inactive": 16
},
{
"t": 19.089876626,
"active": 4,
"waiting": 7,
"inactive": 16
},
{
"t": 19.274844571,
"active": 4,
"waiting": 7,
"inactive": 16
},
{
"t": 19.275094684,
"active": 4,
"waiting": 7,
"inactive": 15
},
{
"t": 19.275747461,
"active": 4,
"waiting": 7,
"inactive": 15
},
{
"t": 19.358164559,
"active": 4,
"waiting": 7,
"inactive": 15
},
{
"t": 19.663392909,
"active": 4,
"waiting": 7,
"inactive": 15
},
{
"t": 19.663680519,
"active": 4,
"waiting": 7,
"inactive": 14
},
{
"t": 19.664003532,
"active": 4,
"waiting": 7,
"inactive": 14
},
{
"t": 19.828135172,
"active": 4,
"waiting": 7,
"inactive": 14
},
{
"t": 19.828457175,
"active": 4,
"waiting": 6,
"inactive": 14
},
{
"t": 19.828671846,
"active": 4,
"waiting": 6,
"inactive": 14
},
{
"t": 20.047814652,
"active": 4,
"waiting": 6,
"inactive": 13
},
{
"t": 20.04812681,
"active": 4,
"waiting": 6,
"inactive": 13
},
{
"t": 20.119711672,
"active": 4,
"waiting": 6,
"inactive": 13
},
{
"t": 20.120198085,
"active": 4,
"waiting": 5,
"inactive": 13
},
{
"t": 20.12042062,
"active": 4,
"waiting": 5,
"inactive": 13
},
{
"t": 20.312475223,
"active": 4,
"waiting": 5,
"inactive": 13
},
{
"t": 20.312923607,
"active": 4,
"waiting": 4,
"inactive": 13
},
{
"t": 20.313649724,
"active": 4,
"waiting": 4,
"inactive": 13
},
{
"t": 20.466203527,
"active": 4,
"waiting": 4,
"inactive": 13
},
{
"t": 20.816797208,
"active": 4,
"waiting": 4,
"inactive": 13
},
{
"t": 21.174066413,
"active": 4,
"waiting": 3,
"inactive": 13
},
{
"t": 21.174469664,
"active": 4,
"waiting": 3,
"inactive": 13
},
{
"t": 21.598241266,
"active": 4,
"waiting": 3,
"inactive": 13
},
{
"t": 21.691285155,
"active": 4,
"waiting": 2,
"inactive": 13
},
{
"t": 21.691650592,
"active": 4,
"waiting": 2,
"inactive": 13
},
{
"t": 21.915976713,
"active": 4,
"waiting": 1,
"inactive": 13
},
{
"t": 21.91649631,
"active": 4,
"waiting": 1,
"inactive": 13
},
{
"t": 22.304901855,
"active": 4,
"waiting": 2,
"inactive": 12
},
{
"t": 22.88409821,
"active": 4,
"waiting": 1,
"inactive": 12
},
{
"t": 22.884437739,
"active": 4,
"waiting": 1,
"inactive": 12
},
{
"t": 23.18864798,
"active": 4,
"waiting": 0,
"inactive": 12
},
{
"t": 23.188993813,
"active": 4,
"waiting": 0,
"inactive": 12
},
{
"t": 24.493543229,
"active": 4,
"waiting": 0,
"inactive": 12
},
{
"t": 24.493863702,
"active": 4,
"waiting": 0,
"inactive": 11
},
{
"t": 24.494125391,
"active": 4,
"waiting": 0,
"inactive": 11
},
{
"t": 24.636197335,
"active": 4,
"waiting": 0,
"inactive": 11
},
{
"t": 24.636592408,
"active": 4,
"waiting": 0,
"inactive": 10
},
{
"t": 24.637026284,
"active": 4,
"waiting": 0,
"inactive": 10
},
{
"t": 24.727783151,
"active": 4,
"waiting": 1,
"inactive": 9
},
{
"t": 24.750483328,
"active": 4,
"waiting": 0,
"inactive": 9
},
{
"t": 24.75088389,
"active": 4,
"waiting": 0,
"inactive": 9
},
{
"t": 25.603589124,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.603727588,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.603767494,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.603827067,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.603885356,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.603913729,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.60394228,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.603965608,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.603984968,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604006242,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604025812,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604044617,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604063363,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604101935,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604122414,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604161154,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604183767,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604204918,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604229753,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604251926,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604274095,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604294808,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604316209,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604336875,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604357895,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.60437968,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604401144,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604422586,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.6044439,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604465364,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604485953,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604507408,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.60452952,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604549949,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.60457135,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604591979,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604612378,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604632262,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604652654,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.60467334,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604693642,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604718504,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604793932,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604858272,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604882088,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604903436,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604925260999998,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604946351,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.60496809,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.604989113,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 25.605007852,
"active": 3,
"waiting": 0,
"inactive": 9
},
{
"t": 26.089301532,
"active": 3,
"waiting": 1,
"inactive": 8
},
{
"t": 26.08963936,
"active": 4,
"waiting": 0,
"inactive": 8
},
{
"t": 26.089905119,
"active": 4,
"waiting": 0,
"inactive": 8
},
{
"t": 26.901247667,
"active": 4,
"waiting": 3,
"inactive": 5
},
{
"t": 27.157990605,
"active": 4,
"waiting": 4,
"inactive": 4
},
{
"t": 27.223369183,
"active": 4,
"waiting": 3,
"inactive": 4
},
{
"t": 27.22364343,
"active": 4,
"waiting": 3,
"inactive": 4
},
{
"t": 28.508940917,
"active": 4,
"waiting": 2,
"inactive": 4
},
{
"t": 28.509244419,
"active": 4,
"waiting": 2,
"inactive": 4
},
{
"t": 29.454382889,
"active": 4,
"waiting": 3,
"inactive": 3
},
{
"t": 29.581908868,
"active": 4,
"waiting": 2,
"inactive": 3
},
{
"t": 29.582155767,
"active": 4,
"waiting": 2,
"inactive": 3
},
{
"t": 30.053931256,
"active": 4,
"waiting": 2,
"inactive": 3
},
{
"t": 30.258516965,
"active": 4,
"waiting": 2,
"inactive": 3
},
{
"t": 30.288157601,
"active": 4,
"waiting": 1,
"inactive": 3
},
{
"t": 30.288633163,
"active": 4,
"waiting": 1,
"inactive": 3
},
{
"t": 31.081051066,
"active": 4,
"waiting": 1,
"inactive": 3
},
{
"t": 32.013757955,
"active": 4,
"waiting": 0,
"inactive": 3
},
{
"t": 32.016187793,
"active": 4,
"waiting": 0,
"inactive": 3
},
{
"t": 32.259567605,
"active": 4,
"waiting": 1,
"inactive": 2
},
{
"t": 32.335589168,
"active": 4,
"waiting": 0,
"inactive": 2
},
{
"t": 32.336294255,
"active": 4,
"waiting": 0,
"inactive": 2
},
{
"t": 34.940430761,
"active": 3,
"waiting": 0,
"inactive": 2
},
{
"t": 35.929526106,
"active": 3,
"waiting": 0,
"inactive": 2
},
{
"t": 36.585840173,
"active": 3,
"waiting": 0,
"inactive": 2
},
{
"t": 36.585910527,
"active": 3,
"waiting": 0,
"inactive": 2
},
{
"t": 36.586002545,
"active": 3,
"waiting": 0,
"inactive": 2
},
{
"t": 36.586110388,
"active": 3,
"waiting": 0,
"inactive": 2
},
{
"t": 36.586275158,
"active": 3,
"waiting": 0,
"inactive": 2
},
{
"t": 36.586332843,
"active": 3,
"waiting": 0,
"inactive": 2
},
{
"t": 39.107880682,
"active": 2,
"waiting": 0,
"inactive": 2
},
{
"t": 41.940954514,
"active": 1,
"waiting": 0,
"inactive": 2
},
{
"t": 44.571163083,
"active": 1,
"waiting": 1,
"inactive": 1
},
{
"t": 44.571362875,
"active": 2,
"waiting": 0,
"inactive": 1
},
{
"t": 44.571850226,
"active": 2,
"waiting": 0,
"inactive": 1
},
{
"t": 46.007270616,
"active": 1,
"waiting": 0,
"inactive": 1
},
{
"t": 68.850437899,
"active": 1,
"waiting": 0,
"inactive": 1
},
{
"t": 69.947525877,
"active": 1,
"waiting": 0,
"inactive": 0
},
{
"t": 69.947943693,
"active": 1,
"waiting": 0,
"inactive": 0
},
{
"t": 76.84235846199999,
"active": 1,
"waiting": 0,
"inactive": 0
},
{
"t": 76.842597153,
"active": 0,
"waiting": 0,
"inactive": 0
}
];
// Position of the vertical axis.
const X_LINE = 50;
// General-use margin size.
const MARGIN = 5;
// Position of the horizontal axis, relative to the bottom.
const Y_LINE = 35;
// Minimum distance between time tick labels.
const MIN_TICK_DIST = 50;
// Radius for rounded rectangle corners.
const RADIUS = 3;
// Height of unit boxes.
const BOX_HEIGHT = 25;
// Distance between Y tick marks on the unit graph.
const Y_TICK_DIST = BOX_HEIGHT + 2;
// Rects used for mouseover detection.
// Objects of {x, y, x2, y2, i} where `i` is the index into UNIT_DATA.
let HIT_BOXES = [];
// Index into UNIT_DATA of the last unit hovered over by mouse.
let LAST_HOVER = null;
// Key is unit index, value is {x, y, width, rmeta_x} of the box.
let UNIT_COORDS = {};
// Map of unit index to the index it was unlocked by.
let REVERSE_UNIT_DEPS = {};
let REVERSE_UNIT_RMETA_DEPS = {};
for (let n=0; n<UNIT_DATA.length; n++) {
let unit = UNIT_DATA[n];
for (let unlocked of unit.unlocked_units) {
REVERSE_UNIT_DEPS[unlocked] = n;
}
for (let unlocked of unit.unlocked_rmeta_units) {
REVERSE_UNIT_RMETA_DEPS[unlocked] = n;
}
}
function render_pipeline_graph() {
if (UNIT_DATA.length == 0) {
return;
}
let g = document.getElementById('pipeline-graph');
HIT_BOXES.length = 0;
g.onmousemove = pipeline_mousemove;
const min_time = document.getElementById('min-unit-time').valueAsNumber;
const units = UNIT_DATA.filter(unit => unit.duration >= min_time);
const graph_height = Y_TICK_DIST * units.length;
const {ctx, width, height} = draw_graph_axes('pipeline-graph', graph_height);
const container = document.getElementById('pipeline-container');
container.style.width = width;
container.style.height = height;
const PX_PER_SEC = document.getElementById('scale').valueAsNumber;
// Canvas for hover highlights. This is a separate layer to improve performance.
const linectx = setup_canvas('pipeline-graph-lines', width, height);
linectx.clearRect(0, 0, width, height);
// Draw Y tick marks.
for (let n=1; n<units.length; n++) {
const y = graph_height - (n * Y_TICK_DIST);
ctx.beginPath();
ctx.moveTo(X_LINE, y);
ctx.lineTo(X_LINE-5, y);
ctx.stroke();
}
// Draw Y labels.
ctx.textAlign = 'end';
for (let n=0; n<units.length; n++) {
let y = MARGIN + (Y_TICK_DIST * (n + 1)) - 13;
ctx.fillText(n+1, X_LINE-4, y);
}
// Draw the graph.
ctx.save();
ctx.translate(X_LINE, MARGIN);
// Compute x,y coordinate of each block.
UNIT_COORDS = {};
for (i=0; i<units.length; i++) {
let unit = units[i];
let y = i * Y_TICK_DIST + 1;
let x = PX_PER_SEC * unit.start;
let rmeta_x = null;
if (unit.rmeta_time != null) {
rmeta_x = x + PX_PER_SEC * unit.rmeta_time;
}
let width = Math.max(PX_PER_SEC * unit.duration, 1.0);
UNIT_COORDS[unit.i] = {x, y, width, rmeta_x};
}
// Draw the blocks.
for (i=0; i<units.length; i++) {
let unit = units[i];
let {x, y, width, rmeta_x} = UNIT_COORDS[unit.i];
HIT_BOXES.push({x: X_LINE+x, y:MARGIN+y, x2: X_LINE+x+width, y2: MARGIN+y+BOX_HEIGHT, i: unit.i});
ctx.beginPath();
ctx.fillStyle = unit.mode == 'run-custom-build' ? '#f0b165' : '#95cce8';
roundedRect(ctx, x, y, width, BOX_HEIGHT, RADIUS);
ctx.fill();
if (unit.rmeta_time != null) {
ctx.beginPath();
ctx.fillStyle = '#aa95e8';
let ctime = unit.duration - unit.rmeta_time;
roundedRect(ctx, rmeta_x, y, PX_PER_SEC * ctime, BOX_HEIGHT, RADIUS);
ctx.fill();
}
ctx.fillStyle = "#000";
ctx.textAlign = 'start';
ctx.textBaseline = 'hanging';
ctx.font = '14px sans-serif';
ctx.fillText(`${unit.name}${unit.target} ${unit.duration}s`, x + 5.0, y + BOX_HEIGHT / 2 - 6);
draw_dep_lines(ctx, unit.i, false);
}
ctx.restore();
}
// Draws lines from the given unit to the units it unlocks.
function draw_dep_lines(ctx, unit_idx, highlighted) {
const unit = UNIT_DATA[unit_idx];
const {x, y, rmeta_x} = UNIT_COORDS[unit_idx];
ctx.save();
for (const unlocked of unit.unlocked_units) {
draw_one_dep_line(ctx, x, y, unlocked, highlighted);
}
for (const unlocked of unit.unlocked_rmeta_units) {
draw_one_dep_line(ctx, rmeta_x, y, unlocked, highlighted);
}
ctx.restore();
}
function draw_one_dep_line(ctx, from_x, from_y, to_unit, highlighted) {
if (to_unit in UNIT_COORDS) {
let {x: u_x, y: u_y} = UNIT_COORDS[to_unit];
ctx.strokeStyle = highlighted ? '#000' : '#ddd';
ctx.setLineDash([2]);
ctx.beginPath();
ctx.moveTo(from_x, from_y+BOX_HEIGHT/2);
ctx.lineTo(from_x-5, from_y+BOX_HEIGHT/2);
ctx.lineTo(from_x-5, u_y+BOX_HEIGHT/2);
ctx.lineTo(u_x, u_y+BOX_HEIGHT/2);
ctx.stroke();
}
}
function render_timing_graph() {
if (CONCURRENCY_DATA.length == 0) {
return;
}
const HEIGHT = 400;
const AXIS_HEIGHT = HEIGHT - MARGIN - Y_LINE;
const TOP_MARGIN = 10;
const GRAPH_HEIGHT = AXIS_HEIGHT - TOP_MARGIN;
const {graph_width, ctx} = draw_graph_axes('timing-graph', AXIS_HEIGHT);
// Draw Y tick marks and labels.
let max_v = 0;
for (c of CONCURRENCY_DATA) {
max_v = Math.max(max_v, c.active, c.waiting, c.inactive);
}
let [step, top] = split_ticks(max_v, GRAPH_HEIGHT / MIN_TICK_DIST);
let num_ticks = top / step;
let tick_dist = GRAPH_HEIGHT / num_ticks;
ctx.textAlign = 'end';
for (n=0; n<num_ticks; n++) {
let y = HEIGHT - Y_LINE - ((n + 1) * tick_dist);
ctx.beginPath();
ctx.moveTo(X_LINE, y);
ctx.lineTo(X_LINE-5, y);
ctx.stroke();
ctx.fillText((n+1) * step, X_LINE-10, y+5);
}
// Label the Y axis.
let label_y = (HEIGHT - Y_LINE) / 2;
ctx.save();
ctx.translate(15, label_y);
ctx.rotate(3*Math.PI/2);
ctx.textAlign = 'center';
ctx.fillText('# Units', 0, 0);
ctx.restore();
// Draw the graph.
ctx.save();
ctx.translate(X_LINE, MARGIN);
function coord(t, v) {
return {
x: graph_width * (t/DURATION),
y: TOP_MARGIN + GRAPH_HEIGHT * (1.0 - (v / max_v))
};
}
function draw_line(style, key) {
let first = CONCURRENCY_DATA[0];
let last = coord(first.t, key(first));
ctx.strokeStyle = style;
ctx.beginPath();
ctx.moveTo(last.x, last.y);
for (let i=1; i<CONCURRENCY_DATA.length; i++) {
let c = CONCURRENCY_DATA[i];
let {x, y} = coord(c.t, key(c));
ctx.lineTo(x, last.y);
ctx.lineTo(x, y);
last = {x, y};
}
ctx.stroke();
}
draw_line('blue', function(c) {return c.inactive;});
draw_line('red', function(c) {return c.waiting;});
draw_line('green', function(c) {return c.active;});
// Draw a legend.
ctx.restore();
ctx.save();
ctx.translate(graph_width-120, MARGIN);
// background
ctx.fillStyle = '#fff';
ctx.strokeStyle = '#000';
ctx.lineWidth = 1;
ctx.textBaseline = 'middle'
ctx.textAlign = 'start';
ctx.beginPath();
ctx.rect(0, 0, 120, 62);
ctx.stroke();
ctx.fill();
ctx.fillStyle = '#000'
ctx.beginPath();
ctx.lineWidth = 2;
ctx.strokeStyle = 'red';
ctx.moveTo(5, 10);
ctx.lineTo(50, 10);
ctx.stroke();
ctx.fillText('Waiting', 54, 11);
ctx.beginPath();
ctx.strokeStyle = 'blue';
ctx.moveTo(5, 30);
ctx.lineTo(50, 30);
ctx.stroke();
ctx.fillText('Inactive', 54, 31);
ctx.beginPath();
ctx.strokeStyle = 'green';
ctx.moveTo(5, 50);
ctx.lineTo(50, 50);
ctx.stroke();
ctx.fillText('Active', 54, 51);
ctx.restore();
}
function setup_canvas(id, width, height) {
let g = document.getElementById(id);
let dpr = window.devicePixelRatio || 1;
g.width = width * dpr;
g.height = height * dpr;
g.style.width = width;
g.style.height = height;
let ctx = g.getContext('2d');
ctx.scale(dpr, dpr);
return ctx;
}
function draw_graph_axes(id, graph_height) {
const PX_PER_SEC = document.getElementById('scale').valueAsNumber;
const graph_width = PX_PER_SEC * DURATION;
const width = graph_width + X_LINE + 30;
const height = graph_height + MARGIN + Y_LINE;
let ctx = setup_canvas(id, width, height);
ctx.fillStyle = '#f7f7f7';
ctx.fillRect(0, 0, width, height);
ctx.lineWidth = 2;
ctx.font = '16px sans-serif';
ctx.textAlign = 'center';
// Draw main axes.
ctx.beginPath();
ctx.moveTo(X_LINE, MARGIN);
ctx.lineTo(X_LINE, graph_height + MARGIN);
ctx.lineTo(X_LINE+graph_width+20, graph_height + MARGIN);
ctx.stroke();
// Draw X tick marks.
const tick_width = graph_width - 10;
const [step, top] = split_ticks(DURATION, tick_width / MIN_TICK_DIST);
const num_ticks = top / step;
const tick_dist = tick_width / num_ticks;
ctx.fillStyle = '#303030';
for (let n=0; n<num_ticks; n++) {
const x = X_LINE + ((n + 1) * tick_dist);
ctx.beginPath();
ctx.moveTo(x, height-Y_LINE);
ctx.lineTo(x, height-Y_LINE+5);
ctx.stroke();
ctx.fillText(`${(n+1) * step}s`, x, height - Y_LINE + 20);
}
// Draw vertical lines.
ctx.strokeStyle = '#e6e6e6';
ctx.setLineDash([2, 4]);
for (n=0; n<num_ticks; n++) {
const x = X_LINE + ((n + 1) * tick_dist);
ctx.beginPath();
ctx.moveTo(x, MARGIN);
ctx.lineTo(x, MARGIN+graph_height);
ctx.stroke();
}
ctx.strokeStyle = '#000';
ctx.setLineDash([]);
return {width, height, graph_width, graph_height, ctx};
}
function round_up(n, step) {
if (n % step == 0) {
return n;
} else {
return (step - n % step) + n;
}
}
// Determine the `(step, max_value)` of the number of ticks along an axis.
function split_ticks(n, max_ticks) {
if (n <= max_ticks) {
return [1, n];
} else if (n <= max_ticks * 2) {
return [2, round_up(n, 2)];
} else if (n <= max_ticks * 4) {
return [4, round_up(n, 4)];
} else if (n <= max_ticks * 5) {
return [5, round_up(n, 5)];
} else {
let step = 10;
while (true) {
let top = round_up(n, step);
if (top <= max_ticks * step) {
return [step, top];
}
step += 10;
}
}
}
function codegen_time(unit) {
if (unit.rmeta_time == null) {
return null;
}
let ctime = unit.duration - unit.rmeta_time;
return [unit.rmeta_time, ctime];
}
function roundedRect(ctx, x, y, width, height, r) {
r = Math.min(r, width, height);
ctx.beginPath();
ctx.moveTo(x+r, y);
ctx.lineTo(x+width-r, y);
ctx.arc(x+width-r, y+r, r, 3*Math.PI/2, 0);
ctx.lineTo(x+width, y+height-r);
ctx.arc(x+width-r, y+height-r, r, 0, Math.PI/2);
ctx.lineTo(x+r, y+height);
ctx.arc(x+r, y+height-r, r, Math.PI/2, Math.PI);
ctx.lineTo(x, y-r);
ctx.arc(x+r, y+r, r, Math.PI, 3*Math.PI/2);
ctx.closePath();
}
function pipeline_mouse_hit(event) {
// This brute-force method can be optimized if needed.
for (let box of HIT_BOXES) {
if (event.offsetX >= box.x && event.offsetX <= box.x2 &&
event.offsetY >= box.y && event.offsetY <= box.y2) {
return box;
}
}
}
function pipeline_mousemove(event) {
// Highlight dependency lines on mouse hover.
let box = pipeline_mouse_hit(event);
if (box) {
if (box.i != LAST_HOVER) {
LAST_HOVER = box.i;
let g = document.getElementById('pipeline-graph-lines');
let ctx = g.getContext('2d');
ctx.clearRect(0, 0, g.width, g.height);
ctx.save();
ctx.translate(X_LINE, MARGIN);
ctx.lineWidth = 2;
draw_dep_lines(ctx, box.i, true);
if (box.i in REVERSE_UNIT_DEPS) {
const dep_unit = REVERSE_UNIT_DEPS[box.i];
if (dep_unit in UNIT_COORDS) {
const {x, y, rmeta_x} = UNIT_COORDS[dep_unit];
draw_one_dep_line(ctx, x, y, box.i, true);
}
}
if (box.i in REVERSE_UNIT_RMETA_DEPS) {
const dep_unit = REVERSE_UNIT_RMETA_DEPS[box.i];
if (dep_unit in UNIT_COORDS) {
const {x, y, rmeta_x} = UNIT_COORDS[dep_unit];
draw_one_dep_line(ctx, rmeta_x, y, box.i, true);
}
}
ctx.restore();
}
}
}
render_pipeline_graph();
render_timing_graph();
// Set up and handle controls.
{
const range = document.getElementById('min-unit-time');
const time_output = document.getElementById('min-unit-time-output');
time_output.innerHTML = `${range.value}s`;
range.oninput = event => {
time_output.innerHTML = `${range.value}s`;
render_pipeline_graph();
};
const scale = document.getElementById('scale');
const scale_output = document.getElementById('scale-output');
scale_output.innerHTML = `${scale.value}`;
scale.oninput = event => {
scale_output.innerHTML = `${scale.value}`;
render_pipeline_graph();
render_timing_graph();
};
}
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment