xref: /aosp_15_r20/external/AFLplusplus/benchmark/benchmark.ipynb (revision 08b48e0b10e97b33e7b60c5b6e2243bd915777f2)
1*08b48e0bSAndroid Build Coastguard Worker{
2*08b48e0bSAndroid Build Coastguard Worker "cells": [
3*08b48e0bSAndroid Build Coastguard Worker  {
4*08b48e0bSAndroid Build Coastguard Worker   "cell_type": "code",
5*08b48e0bSAndroid Build Coastguard Worker   "execution_count": 142,
6*08b48e0bSAndroid Build Coastguard Worker   "metadata": {},
7*08b48e0bSAndroid Build Coastguard Worker   "outputs": [],
8*08b48e0bSAndroid Build Coastguard Worker   "source": [
9*08b48e0bSAndroid Build Coastguard Worker    "# benchmark.ipynb\n",
10*08b48e0bSAndroid Build Coastguard Worker    "# Part of the aflplusplus project, requires an ipynb (Jupyter) editor or viewer.\n",
11*08b48e0bSAndroid Build Coastguard Worker    "# Author: Chris Ball <[email protected]>\n",
12*08b48e0bSAndroid Build Coastguard Worker    "import json\n",
13*08b48e0bSAndroid Build Coastguard Worker    "import pandas as pd\n",
14*08b48e0bSAndroid Build Coastguard Worker    "with open(\"benchmark-results.jsonl\") as f:\n",
15*08b48e0bSAndroid Build Coastguard Worker    "    lines = f.read().splitlines()\n",
16*08b48e0bSAndroid Build Coastguard Worker    "json_lines = [json.loads(line) for line in lines]\n"
17*08b48e0bSAndroid Build Coastguard Worker   ]
18*08b48e0bSAndroid Build Coastguard Worker  },
19*08b48e0bSAndroid Build Coastguard Worker  {
20*08b48e0bSAndroid Build Coastguard Worker   "cell_type": "markdown",
21*08b48e0bSAndroid Build Coastguard Worker   "metadata": {},
22*08b48e0bSAndroid Build Coastguard Worker   "source": [
23*08b48e0bSAndroid Build Coastguard Worker    "### Translate the JSON Lines entries into a single pandas DataFrame\n",
24*08b48e0bSAndroid Build Coastguard Worker    "\n",
25*08b48e0bSAndroid Build Coastguard Worker    "We have JSON Lines in [benchmark-results.jsonl](benchmark-results.jsonl) that look like this:"
26*08b48e0bSAndroid Build Coastguard Worker   ]
27*08b48e0bSAndroid Build Coastguard Worker  },
28*08b48e0bSAndroid Build Coastguard Worker  {
29*08b48e0bSAndroid Build Coastguard Worker   "cell_type": "code",
30*08b48e0bSAndroid Build Coastguard Worker   "execution_count": 143,
31*08b48e0bSAndroid Build Coastguard Worker   "metadata": {},
32*08b48e0bSAndroid Build Coastguard Worker   "outputs": [
33*08b48e0bSAndroid Build Coastguard Worker    {
34*08b48e0bSAndroid Build Coastguard Worker     "name": "stdout",
35*08b48e0bSAndroid Build Coastguard Worker     "output_type": "stream",
36*08b48e0bSAndroid Build Coastguard Worker     "text": [
37*08b48e0bSAndroid Build Coastguard Worker      "{\n",
38*08b48e0bSAndroid Build Coastguard Worker      "  \"config\": {\n",
39*08b48e0bSAndroid Build Coastguard Worker      "    \"afl_persistent_config\": true,\n",
40*08b48e0bSAndroid Build Coastguard Worker      "    \"afl_system_config\": true,\n",
41*08b48e0bSAndroid Build Coastguard Worker      "    \"afl_version\": \"++4.09a\",\n",
42*08b48e0bSAndroid Build Coastguard Worker      "    \"comment\": \"i9-9900k, 16GB DDR4-3000, Arch Linux\",\n",
43*08b48e0bSAndroid Build Coastguard Worker      "    \"compiler\": \"clang version 16.0.6\",\n",
44*08b48e0bSAndroid Build Coastguard Worker      "    \"target_arch\": \"x86_64-pc-linux-gnu\"\n",
45*08b48e0bSAndroid Build Coastguard Worker      "  },\n",
46*08b48e0bSAndroid Build Coastguard Worker      "  \"hardware\": {\n",
47*08b48e0bSAndroid Build Coastguard Worker      "    \"cpu_fastest_core_mhz\": 4788.77,\n",
48*08b48e0bSAndroid Build Coastguard Worker      "    \"cpu_model\": \"Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz\",\n",
49*08b48e0bSAndroid Build Coastguard Worker      "    \"cpu_threads\": 16\n",
50*08b48e0bSAndroid Build Coastguard Worker      "  },\n",
51*08b48e0bSAndroid Build Coastguard Worker      "  \"targets\": {\n",
52*08b48e0bSAndroid Build Coastguard Worker      "    \"test-instr\": {\n",
53*08b48e0bSAndroid Build Coastguard Worker      "      \"singlecore\": {\n",
54*08b48e0bSAndroid Build Coastguard Worker      "        \"execs_per_sec\": 9845.64,\n",
55*08b48e0bSAndroid Build Coastguard Worker      "        \"execs_total\": 98545,\n",
56*08b48e0bSAndroid Build Coastguard Worker      "        \"fuzzers_used\": 1\n",
57*08b48e0bSAndroid Build Coastguard Worker      "      }\n",
58*08b48e0bSAndroid Build Coastguard Worker      "    }\n",
59*08b48e0bSAndroid Build Coastguard Worker      "  }\n",
60*08b48e0bSAndroid Build Coastguard Worker      "}\n"
61*08b48e0bSAndroid Build Coastguard Worker     ]
62*08b48e0bSAndroid Build Coastguard Worker    }
63*08b48e0bSAndroid Build Coastguard Worker   ],
64*08b48e0bSAndroid Build Coastguard Worker   "source": [
65*08b48e0bSAndroid Build Coastguard Worker    "print(json.dumps(json.loads(lines[0]), indent=2))"
66*08b48e0bSAndroid Build Coastguard Worker   ]
67*08b48e0bSAndroid Build Coastguard Worker  },
68*08b48e0bSAndroid Build Coastguard Worker  {
69*08b48e0bSAndroid Build Coastguard Worker   "cell_type": "markdown",
70*08b48e0bSAndroid Build Coastguard Worker   "metadata": {},
71*08b48e0bSAndroid Build Coastguard Worker   "source": [
72*08b48e0bSAndroid Build Coastguard Worker    "The [pd.json_normalize()](https://pandas.pydata.org/docs/reference/api/pandas.json_normalize.html]) method translates this into a flat table that we can perform queries against:"
73*08b48e0bSAndroid Build Coastguard Worker   ]
74*08b48e0bSAndroid Build Coastguard Worker  },
75*08b48e0bSAndroid Build Coastguard Worker  {
76*08b48e0bSAndroid Build Coastguard Worker   "cell_type": "code",
77*08b48e0bSAndroid Build Coastguard Worker   "execution_count": 144,
78*08b48e0bSAndroid Build Coastguard Worker   "metadata": {},
79*08b48e0bSAndroid Build Coastguard Worker   "outputs": [
80*08b48e0bSAndroid Build Coastguard Worker    {
81*08b48e0bSAndroid Build Coastguard Worker     "data": {
82*08b48e0bSAndroid Build Coastguard Worker      "text/html": [
83*08b48e0bSAndroid Build Coastguard Worker       "<div>\n",
84*08b48e0bSAndroid Build Coastguard Worker       "<style scoped>\n",
85*08b48e0bSAndroid Build Coastguard Worker       "    .dataframe tbody tr th:only-of-type {\n",
86*08b48e0bSAndroid Build Coastguard Worker       "        vertical-align: middle;\n",
87*08b48e0bSAndroid Build Coastguard Worker       "    }\n",
88*08b48e0bSAndroid Build Coastguard Worker       "\n",
89*08b48e0bSAndroid Build Coastguard Worker       "    .dataframe tbody tr th {\n",
90*08b48e0bSAndroid Build Coastguard Worker       "        vertical-align: top;\n",
91*08b48e0bSAndroid Build Coastguard Worker       "    }\n",
92*08b48e0bSAndroid Build Coastguard Worker       "\n",
93*08b48e0bSAndroid Build Coastguard Worker       "    .dataframe thead th {\n",
94*08b48e0bSAndroid Build Coastguard Worker       "        text-align: right;\n",
95*08b48e0bSAndroid Build Coastguard Worker       "    }\n",
96*08b48e0bSAndroid Build Coastguard Worker       "</style>\n",
97*08b48e0bSAndroid Build Coastguard Worker       "<table border=\"1\" class=\"dataframe\">\n",
98*08b48e0bSAndroid Build Coastguard Worker       "  <thead>\n",
99*08b48e0bSAndroid Build Coastguard Worker       "    <tr style=\"text-align: right;\">\n",
100*08b48e0bSAndroid Build Coastguard Worker       "      <th></th>\n",
101*08b48e0bSAndroid Build Coastguard Worker       "      <th>config.afl_persistent_config</th>\n",
102*08b48e0bSAndroid Build Coastguard Worker       "      <th>config.afl_system_config</th>\n",
103*08b48e0bSAndroid Build Coastguard Worker       "      <th>config.afl_version</th>\n",
104*08b48e0bSAndroid Build Coastguard Worker       "      <th>config.comment</th>\n",
105*08b48e0bSAndroid Build Coastguard Worker       "      <th>config.compiler</th>\n",
106*08b48e0bSAndroid Build Coastguard Worker       "      <th>config.target_arch</th>\n",
107*08b48e0bSAndroid Build Coastguard Worker       "      <th>hardware.cpu_fastest_core_mhz</th>\n",
108*08b48e0bSAndroid Build Coastguard Worker       "      <th>hardware.cpu_model</th>\n",
109*08b48e0bSAndroid Build Coastguard Worker       "      <th>hardware.cpu_threads</th>\n",
110*08b48e0bSAndroid Build Coastguard Worker       "      <th>targets.test-instr.singlecore.execs_per_sec</th>\n",
111*08b48e0bSAndroid Build Coastguard Worker       "      <th>...</th>\n",
112*08b48e0bSAndroid Build Coastguard Worker       "      <th>targets.test-instr.singlecore.fuzzers_used</th>\n",
113*08b48e0bSAndroid Build Coastguard Worker       "      <th>targets.test-instr-persist-shmem.singlecore.execs_per_sec</th>\n",
114*08b48e0bSAndroid Build Coastguard Worker       "      <th>targets.test-instr-persist-shmem.singlecore.execs_total</th>\n",
115*08b48e0bSAndroid Build Coastguard Worker       "      <th>targets.test-instr-persist-shmem.singlecore.fuzzers_used</th>\n",
116*08b48e0bSAndroid Build Coastguard Worker       "      <th>targets.test-instr-persist-shmem.multicore.execs_per_sec</th>\n",
117*08b48e0bSAndroid Build Coastguard Worker       "      <th>targets.test-instr-persist-shmem.multicore.execs_total</th>\n",
118*08b48e0bSAndroid Build Coastguard Worker       "      <th>targets.test-instr-persist-shmem.multicore.fuzzers_used</th>\n",
119*08b48e0bSAndroid Build Coastguard Worker       "      <th>targets.test-instr.multicore.execs_per_sec</th>\n",
120*08b48e0bSAndroid Build Coastguard Worker       "      <th>targets.test-instr.multicore.execs_total</th>\n",
121*08b48e0bSAndroid Build Coastguard Worker       "      <th>targets.test-instr.multicore.fuzzers_used</th>\n",
122*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
123*08b48e0bSAndroid Build Coastguard Worker       "  </thead>\n",
124*08b48e0bSAndroid Build Coastguard Worker       "  <tbody>\n",
125*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
126*08b48e0bSAndroid Build Coastguard Worker       "      <th>0</th>\n",
127*08b48e0bSAndroid Build Coastguard Worker       "      <td>True</td>\n",
128*08b48e0bSAndroid Build Coastguard Worker       "      <td>True</td>\n",
129*08b48e0bSAndroid Build Coastguard Worker       "      <td>++4.09a</td>\n",
130*08b48e0bSAndroid Build Coastguard Worker       "      <td>i9-9900k, 16GB DDR4-3000, Arch Linux</td>\n",
131*08b48e0bSAndroid Build Coastguard Worker       "      <td>clang version 16.0.6</td>\n",
132*08b48e0bSAndroid Build Coastguard Worker       "      <td>x86_64-pc-linux-gnu</td>\n",
133*08b48e0bSAndroid Build Coastguard Worker       "      <td>4788.770</td>\n",
134*08b48e0bSAndroid Build Coastguard Worker       "      <td>Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz</td>\n",
135*08b48e0bSAndroid Build Coastguard Worker       "      <td>16</td>\n",
136*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
137*08b48e0bSAndroid Build Coastguard Worker       "      <td>...</td>\n",
138*08b48e0bSAndroid Build Coastguard Worker       "      <td>1.0</td>\n",
139*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
140*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
141*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
142*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
143*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
144*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
145*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
146*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
147*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
148*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
149*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
150*08b48e0bSAndroid Build Coastguard Worker       "      <th>1</th>\n",
151*08b48e0bSAndroid Build Coastguard Worker       "      <td>True</td>\n",
152*08b48e0bSAndroid Build Coastguard Worker       "      <td>True</td>\n",
153*08b48e0bSAndroid Build Coastguard Worker       "      <td>++4.09a</td>\n",
154*08b48e0bSAndroid Build Coastguard Worker       "      <td>i9-9900k, 16GB DDR4-3000, Arch Linux</td>\n",
155*08b48e0bSAndroid Build Coastguard Worker       "      <td>clang version 16.0.6</td>\n",
156*08b48e0bSAndroid Build Coastguard Worker       "      <td>x86_64-pc-linux-gnu</td>\n",
157*08b48e0bSAndroid Build Coastguard Worker       "      <td>4989.281</td>\n",
158*08b48e0bSAndroid Build Coastguard Worker       "      <td>Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz</td>\n",
159*08b48e0bSAndroid Build Coastguard Worker       "      <td>16</td>\n",
160*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
161*08b48e0bSAndroid Build Coastguard Worker       "      <td>...</td>\n",
162*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
163*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
164*08b48e0bSAndroid Build Coastguard Worker       "      <td>1257330.0</td>\n",
165*08b48e0bSAndroid Build Coastguard Worker       "      <td>1.0</td>\n",
166*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
167*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
168*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
169*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
170*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
171*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
172*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
173*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
174*08b48e0bSAndroid Build Coastguard Worker       "      <th>2</th>\n",
175*08b48e0bSAndroid Build Coastguard Worker       "      <td>True</td>\n",
176*08b48e0bSAndroid Build Coastguard Worker       "      <td>True</td>\n",
177*08b48e0bSAndroid Build Coastguard Worker       "      <td>++4.09a</td>\n",
178*08b48e0bSAndroid Build Coastguard Worker       "      <td>i9-9900k, 16GB DDR4-3000, Arch Linux</td>\n",
179*08b48e0bSAndroid Build Coastguard Worker       "      <td>clang version 16.0.6</td>\n",
180*08b48e0bSAndroid Build Coastguard Worker       "      <td>x86_64-pc-linux-gnu</td>\n",
181*08b48e0bSAndroid Build Coastguard Worker       "      <td>4799.415</td>\n",
182*08b48e0bSAndroid Build Coastguard Worker       "      <td>Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz</td>\n",
183*08b48e0bSAndroid Build Coastguard Worker       "      <td>16</td>\n",
184*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
185*08b48e0bSAndroid Build Coastguard Worker       "      <td>...</td>\n",
186*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
187*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
188*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
189*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
190*08b48e0bSAndroid Build Coastguard Worker       "      <td>120293.77</td>\n",
191*08b48e0bSAndroid Build Coastguard Worker       "      <td>1203058.0</td>\n",
192*08b48e0bSAndroid Build Coastguard Worker       "      <td>1.0</td>\n",
193*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
194*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
195*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
196*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
197*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
198*08b48e0bSAndroid Build Coastguard Worker       "      <th>3</th>\n",
199*08b48e0bSAndroid Build Coastguard Worker       "      <td>True</td>\n",
200*08b48e0bSAndroid Build Coastguard Worker       "      <td>True</td>\n",
201*08b48e0bSAndroid Build Coastguard Worker       "      <td>++4.09a</td>\n",
202*08b48e0bSAndroid Build Coastguard Worker       "      <td>i9-9900k, 16GB DDR4-3000, Arch Linux</td>\n",
203*08b48e0bSAndroid Build Coastguard Worker       "      <td>clang version 16.0.6</td>\n",
204*08b48e0bSAndroid Build Coastguard Worker       "      <td>x86_64-pc-linux-gnu</td>\n",
205*08b48e0bSAndroid Build Coastguard Worker       "      <td>4703.293</td>\n",
206*08b48e0bSAndroid Build Coastguard Worker       "      <td>Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz</td>\n",
207*08b48e0bSAndroid Build Coastguard Worker       "      <td>16</td>\n",
208*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
209*08b48e0bSAndroid Build Coastguard Worker       "      <td>...</td>\n",
210*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
211*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
212*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
213*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
214*08b48e0bSAndroid Build Coastguard Worker       "      <td>231429.96</td>\n",
215*08b48e0bSAndroid Build Coastguard Worker       "      <td>2314531.0</td>\n",
216*08b48e0bSAndroid Build Coastguard Worker       "      <td>2.0</td>\n",
217*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
218*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
219*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
220*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
221*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
222*08b48e0bSAndroid Build Coastguard Worker       "      <th>4</th>\n",
223*08b48e0bSAndroid Build Coastguard Worker       "      <td>True</td>\n",
224*08b48e0bSAndroid Build Coastguard Worker       "      <td>True</td>\n",
225*08b48e0bSAndroid Build Coastguard Worker       "      <td>++4.09a</td>\n",
226*08b48e0bSAndroid Build Coastguard Worker       "      <td>i9-9900k, 16GB DDR4-3000, Arch Linux</td>\n",
227*08b48e0bSAndroid Build Coastguard Worker       "      <td>clang version 16.0.6</td>\n",
228*08b48e0bSAndroid Build Coastguard Worker       "      <td>x86_64-pc-linux-gnu</td>\n",
229*08b48e0bSAndroid Build Coastguard Worker       "      <td>4800.375</td>\n",
230*08b48e0bSAndroid Build Coastguard Worker       "      <td>Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz</td>\n",
231*08b48e0bSAndroid Build Coastguard Worker       "      <td>16</td>\n",
232*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
233*08b48e0bSAndroid Build Coastguard Worker       "      <td>...</td>\n",
234*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
235*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
236*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
237*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
238*08b48e0bSAndroid Build Coastguard Worker       "      <td>346759.33</td>\n",
239*08b48e0bSAndroid Build Coastguard Worker       "      <td>3468290.0</td>\n",
240*08b48e0bSAndroid Build Coastguard Worker       "      <td>3.0</td>\n",
241*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
242*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
243*08b48e0bSAndroid Build Coastguard Worker       "      <td>NaN</td>\n",
244*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
245*08b48e0bSAndroid Build Coastguard Worker       "  </tbody>\n",
246*08b48e0bSAndroid Build Coastguard Worker       "</table>\n",
247*08b48e0bSAndroid Build Coastguard Worker       "<p>5 rows × 21 columns</p>\n",
248*08b48e0bSAndroid Build Coastguard Worker       "</div>"
249*08b48e0bSAndroid Build Coastguard Worker      ],
250*08b48e0bSAndroid Build Coastguard Worker      "text/plain": [
251*08b48e0bSAndroid Build Coastguard Worker       "   config.afl_persistent_config  config.afl_system_config config.afl_version  \\\n",
252*08b48e0bSAndroid Build Coastguard Worker       "0                          True                      True            ++4.09a   \n",
253*08b48e0bSAndroid Build Coastguard Worker       "1                          True                      True            ++4.09a   \n",
254*08b48e0bSAndroid Build Coastguard Worker       "2                          True                      True            ++4.09a   \n",
255*08b48e0bSAndroid Build Coastguard Worker       "3                          True                      True            ++4.09a   \n",
256*08b48e0bSAndroid Build Coastguard Worker       "4                          True                      True            ++4.09a   \n",
257*08b48e0bSAndroid Build Coastguard Worker       "\n",
258*08b48e0bSAndroid Build Coastguard Worker       "                         config.comment       config.compiler  \\\n",
259*08b48e0bSAndroid Build Coastguard Worker       "0  i9-9900k, 16GB DDR4-3000, Arch Linux  clang version 16.0.6   \n",
260*08b48e0bSAndroid Build Coastguard Worker       "1  i9-9900k, 16GB DDR4-3000, Arch Linux  clang version 16.0.6   \n",
261*08b48e0bSAndroid Build Coastguard Worker       "2  i9-9900k, 16GB DDR4-3000, Arch Linux  clang version 16.0.6   \n",
262*08b48e0bSAndroid Build Coastguard Worker       "3  i9-9900k, 16GB DDR4-3000, Arch Linux  clang version 16.0.6   \n",
263*08b48e0bSAndroid Build Coastguard Worker       "4  i9-9900k, 16GB DDR4-3000, Arch Linux  clang version 16.0.6   \n",
264*08b48e0bSAndroid Build Coastguard Worker       "\n",
265*08b48e0bSAndroid Build Coastguard Worker       "    config.target_arch  hardware.cpu_fastest_core_mhz  \\\n",
266*08b48e0bSAndroid Build Coastguard Worker       "0  x86_64-pc-linux-gnu                       4788.770   \n",
267*08b48e0bSAndroid Build Coastguard Worker       "1  x86_64-pc-linux-gnu                       4989.281   \n",
268*08b48e0bSAndroid Build Coastguard Worker       "2  x86_64-pc-linux-gnu                       4799.415   \n",
269*08b48e0bSAndroid Build Coastguard Worker       "3  x86_64-pc-linux-gnu                       4703.293   \n",
270*08b48e0bSAndroid Build Coastguard Worker       "4  x86_64-pc-linux-gnu                       4800.375   \n",
271*08b48e0bSAndroid Build Coastguard Worker       "\n",
272*08b48e0bSAndroid Build Coastguard Worker       "                         hardware.cpu_model  hardware.cpu_threads  \\\n",
273*08b48e0bSAndroid Build Coastguard Worker       "0  Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz                    16   \n",
274*08b48e0bSAndroid Build Coastguard Worker       "1  Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz                    16   \n",
275*08b48e0bSAndroid Build Coastguard Worker       "2  Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz                    16   \n",
276*08b48e0bSAndroid Build Coastguard Worker       "3  Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz                    16   \n",
277*08b48e0bSAndroid Build Coastguard Worker       "4  Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz                    16   \n",
278*08b48e0bSAndroid Build Coastguard Worker       "\n",
279*08b48e0bSAndroid Build Coastguard Worker       "   targets.test-instr.singlecore.execs_per_sec  ...  \\\n",
280*08b48e0bSAndroid Build Coastguard Worker       "0                                      9845.64  ...   \n",
281*08b48e0bSAndroid Build Coastguard Worker       "1                                          NaN  ...   \n",
282*08b48e0bSAndroid Build Coastguard Worker       "2                                          NaN  ...   \n",
283*08b48e0bSAndroid Build Coastguard Worker       "3                                          NaN  ...   \n",
284*08b48e0bSAndroid Build Coastguard Worker       "4                                          NaN  ...   \n",
285*08b48e0bSAndroid Build Coastguard Worker       "\n",
286*08b48e0bSAndroid Build Coastguard Worker       "   targets.test-instr.singlecore.fuzzers_used  \\\n",
287*08b48e0bSAndroid Build Coastguard Worker       "0                                         1.0   \n",
288*08b48e0bSAndroid Build Coastguard Worker       "1                                         NaN   \n",
289*08b48e0bSAndroid Build Coastguard Worker       "2                                         NaN   \n",
290*08b48e0bSAndroid Build Coastguard Worker       "3                                         NaN   \n",
291*08b48e0bSAndroid Build Coastguard Worker       "4                                         NaN   \n",
292*08b48e0bSAndroid Build Coastguard Worker       "\n",
293*08b48e0bSAndroid Build Coastguard Worker       "   targets.test-instr-persist-shmem.singlecore.execs_per_sec  \\\n",
294*08b48e0bSAndroid Build Coastguard Worker       "0                                                NaN           \n",
295*08b48e0bSAndroid Build Coastguard Worker       "1                                          125682.73           \n",
296*08b48e0bSAndroid Build Coastguard Worker       "2                                                NaN           \n",
297*08b48e0bSAndroid Build Coastguard Worker       "3                                                NaN           \n",
298*08b48e0bSAndroid Build Coastguard Worker       "4                                                NaN           \n",
299*08b48e0bSAndroid Build Coastguard Worker       "\n",
300*08b48e0bSAndroid Build Coastguard Worker       "   targets.test-instr-persist-shmem.singlecore.execs_total  \\\n",
301*08b48e0bSAndroid Build Coastguard Worker       "0                                                NaN         \n",
302*08b48e0bSAndroid Build Coastguard Worker       "1                                          1257330.0         \n",
303*08b48e0bSAndroid Build Coastguard Worker       "2                                                NaN         \n",
304*08b48e0bSAndroid Build Coastguard Worker       "3                                                NaN         \n",
305*08b48e0bSAndroid Build Coastguard Worker       "4                                                NaN         \n",
306*08b48e0bSAndroid Build Coastguard Worker       "\n",
307*08b48e0bSAndroid Build Coastguard Worker       "   targets.test-instr-persist-shmem.singlecore.fuzzers_used  \\\n",
308*08b48e0bSAndroid Build Coastguard Worker       "0                                                NaN          \n",
309*08b48e0bSAndroid Build Coastguard Worker       "1                                                1.0          \n",
310*08b48e0bSAndroid Build Coastguard Worker       "2                                                NaN          \n",
311*08b48e0bSAndroid Build Coastguard Worker       "3                                                NaN          \n",
312*08b48e0bSAndroid Build Coastguard Worker       "4                                                NaN          \n",
313*08b48e0bSAndroid Build Coastguard Worker       "\n",
314*08b48e0bSAndroid Build Coastguard Worker       "   targets.test-instr-persist-shmem.multicore.execs_per_sec  \\\n",
315*08b48e0bSAndroid Build Coastguard Worker       "0                                                NaN          \n",
316*08b48e0bSAndroid Build Coastguard Worker       "1                                                NaN          \n",
317*08b48e0bSAndroid Build Coastguard Worker       "2                                          120293.77          \n",
318*08b48e0bSAndroid Build Coastguard Worker       "3                                          231429.96          \n",
319*08b48e0bSAndroid Build Coastguard Worker       "4                                          346759.33          \n",
320*08b48e0bSAndroid Build Coastguard Worker       "\n",
321*08b48e0bSAndroid Build Coastguard Worker       "   targets.test-instr-persist-shmem.multicore.execs_total  \\\n",
322*08b48e0bSAndroid Build Coastguard Worker       "0                                                NaN        \n",
323*08b48e0bSAndroid Build Coastguard Worker       "1                                                NaN        \n",
324*08b48e0bSAndroid Build Coastguard Worker       "2                                          1203058.0        \n",
325*08b48e0bSAndroid Build Coastguard Worker       "3                                          2314531.0        \n",
326*08b48e0bSAndroid Build Coastguard Worker       "4                                          3468290.0        \n",
327*08b48e0bSAndroid Build Coastguard Worker       "\n",
328*08b48e0bSAndroid Build Coastguard Worker       "   targets.test-instr-persist-shmem.multicore.fuzzers_used  \\\n",
329*08b48e0bSAndroid Build Coastguard Worker       "0                                                NaN         \n",
330*08b48e0bSAndroid Build Coastguard Worker       "1                                                NaN         \n",
331*08b48e0bSAndroid Build Coastguard Worker       "2                                                1.0         \n",
332*08b48e0bSAndroid Build Coastguard Worker       "3                                                2.0         \n",
333*08b48e0bSAndroid Build Coastguard Worker       "4                                                3.0         \n",
334*08b48e0bSAndroid Build Coastguard Worker       "\n",
335*08b48e0bSAndroid Build Coastguard Worker       "   targets.test-instr.multicore.execs_per_sec  \\\n",
336*08b48e0bSAndroid Build Coastguard Worker       "0                                         NaN   \n",
337*08b48e0bSAndroid Build Coastguard Worker       "1                                         NaN   \n",
338*08b48e0bSAndroid Build Coastguard Worker       "2                                         NaN   \n",
339*08b48e0bSAndroid Build Coastguard Worker       "3                                         NaN   \n",
340*08b48e0bSAndroid Build Coastguard Worker       "4                                         NaN   \n",
341*08b48e0bSAndroid Build Coastguard Worker       "\n",
342*08b48e0bSAndroid Build Coastguard Worker       "   targets.test-instr.multicore.execs_total  \\\n",
343*08b48e0bSAndroid Build Coastguard Worker       "0                                       NaN   \n",
344*08b48e0bSAndroid Build Coastguard Worker       "1                                       NaN   \n",
345*08b48e0bSAndroid Build Coastguard Worker       "2                                       NaN   \n",
346*08b48e0bSAndroid Build Coastguard Worker       "3                                       NaN   \n",
347*08b48e0bSAndroid Build Coastguard Worker       "4                                       NaN   \n",
348*08b48e0bSAndroid Build Coastguard Worker       "\n",
349*08b48e0bSAndroid Build Coastguard Worker       "   targets.test-instr.multicore.fuzzers_used  \n",
350*08b48e0bSAndroid Build Coastguard Worker       "0                                        NaN  \n",
351*08b48e0bSAndroid Build Coastguard Worker       "1                                        NaN  \n",
352*08b48e0bSAndroid Build Coastguard Worker       "2                                        NaN  \n",
353*08b48e0bSAndroid Build Coastguard Worker       "3                                        NaN  \n",
354*08b48e0bSAndroid Build Coastguard Worker       "4                                        NaN  \n",
355*08b48e0bSAndroid Build Coastguard Worker       "\n",
356*08b48e0bSAndroid Build Coastguard Worker       "[5 rows x 21 columns]"
357*08b48e0bSAndroid Build Coastguard Worker      ]
358*08b48e0bSAndroid Build Coastguard Worker     },
359*08b48e0bSAndroid Build Coastguard Worker     "execution_count": 144,
360*08b48e0bSAndroid Build Coastguard Worker     "metadata": {},
361*08b48e0bSAndroid Build Coastguard Worker     "output_type": "execute_result"
362*08b48e0bSAndroid Build Coastguard Worker    }
363*08b48e0bSAndroid Build Coastguard Worker   ],
364*08b48e0bSAndroid Build Coastguard Worker   "source": [
365*08b48e0bSAndroid Build Coastguard Worker    "\n",
366*08b48e0bSAndroid Build Coastguard Worker    "df = pd.json_normalize(json_lines)\n",
367*08b48e0bSAndroid Build Coastguard Worker    "df.head()"
368*08b48e0bSAndroid Build Coastguard Worker   ]
369*08b48e0bSAndroid Build Coastguard Worker  },
370*08b48e0bSAndroid Build Coastguard Worker  {
371*08b48e0bSAndroid Build Coastguard Worker   "cell_type": "markdown",
372*08b48e0bSAndroid Build Coastguard Worker   "metadata": {},
373*08b48e0bSAndroid Build Coastguard Worker   "source": [
374*08b48e0bSAndroid Build Coastguard Worker    "### Graph prep\n",
375*08b48e0bSAndroid Build Coastguard Worker    "\n",
376*08b48e0bSAndroid Build Coastguard Worker    "We're looking for a line graph showing lines for each fuzz target, in both singlecore and multicore modes, in each config setting -- where the x-axis is number of cores, and the y-axis is execs_per_sec.\n",
377*08b48e0bSAndroid Build Coastguard Worker    "\n",
378*08b48e0bSAndroid Build Coastguard Worker    "First, a quick check that the number of rows matched what we'd intuitively expect:"
379*08b48e0bSAndroid Build Coastguard Worker   ]
380*08b48e0bSAndroid Build Coastguard Worker  },
381*08b48e0bSAndroid Build Coastguard Worker  {
382*08b48e0bSAndroid Build Coastguard Worker   "cell_type": "code",
383*08b48e0bSAndroid Build Coastguard Worker   "execution_count": 145,
384*08b48e0bSAndroid Build Coastguard Worker   "metadata": {},
385*08b48e0bSAndroid Build Coastguard Worker   "outputs": [],
386*08b48e0bSAndroid Build Coastguard Worker   "source": [
387*08b48e0bSAndroid Build Coastguard Worker    "i7 = df.query(\"`config.comment` == 'i9-9900k, 16GB DDR4-3000, Arch Linux'\")\n",
388*08b48e0bSAndroid Build Coastguard Worker    "assert len(i7) == 185"
389*08b48e0bSAndroid Build Coastguard Worker   ]
390*08b48e0bSAndroid Build Coastguard Worker  },
391*08b48e0bSAndroid Build Coastguard Worker  {
392*08b48e0bSAndroid Build Coastguard Worker   "cell_type": "code",
393*08b48e0bSAndroid Build Coastguard Worker   "execution_count": 146,
394*08b48e0bSAndroid Build Coastguard Worker   "metadata": {},
395*08b48e0bSAndroid Build Coastguard Worker   "outputs": [],
396*08b48e0bSAndroid Build Coastguard Worker   "source": [
397*08b48e0bSAndroid Build Coastguard Worker    "def build_graphdf_from_query(query: pd.DataFrame):\n",
398*08b48e0bSAndroid Build Coastguard Worker    "    \"\"\"Build a table suitable for graphing from a subset of the dataframe.\"\"\"\n",
399*08b48e0bSAndroid Build Coastguard Worker    "    graphdata = []\n",
400*08b48e0bSAndroid Build Coastguard Worker    "    max_fuzzers = int(query[[\"targets.test-instr-persist-shmem.multicore.fuzzers_used\", \"targets.test-instr.multicore.fuzzers_used\"]].max(axis=1).max(axis=0))\n",
401*08b48e0bSAndroid Build Coastguard Worker    "    for _, row in query.iterrows():\n",
402*08b48e0bSAndroid Build Coastguard Worker    "        for target in [\"test-instr-persist-shmem\", \"test-instr\"]:\n",
403*08b48e0bSAndroid Build Coastguard Worker    "            for mode in [\"multicore\", \"singlecore\"]:\n",
404*08b48e0bSAndroid Build Coastguard Worker    "                label = \"\"\n",
405*08b48e0bSAndroid Build Coastguard Worker    "                if not row[f\"targets.{target}.{mode}.execs_per_sec\"] > 0:\n",
406*08b48e0bSAndroid Build Coastguard Worker    "                    continue\n",
407*08b48e0bSAndroid Build Coastguard Worker    "                execs_per_sec         = row[f\"targets.{target}.{mode}.execs_per_sec\"]\n",
408*08b48e0bSAndroid Build Coastguard Worker    "                parallel_fuzzers      = row[f\"targets.{target}.{mode}.fuzzers_used\"]\n",
409*08b48e0bSAndroid Build Coastguard Worker    "                afl_persistent_config = row[\"config.afl_persistent_config\"]\n",
410*08b48e0bSAndroid Build Coastguard Worker    "                afl_system_config     = row[\"config.afl_system_config\"]\n",
411*08b48e0bSAndroid Build Coastguard Worker    "                if target == \"test-instr-persist-shmem\":\n",
412*08b48e0bSAndroid Build Coastguard Worker    "                    label += \"shmem\"\n",
413*08b48e0bSAndroid Build Coastguard Worker    "                else:\n",
414*08b48e0bSAndroid Build Coastguard Worker    "                    label += \"base\"\n",
415*08b48e0bSAndroid Build Coastguard Worker    "                if mode == \"multicore\":\n",
416*08b48e0bSAndroid Build Coastguard Worker    "                    label += \"-multicore\"\n",
417*08b48e0bSAndroid Build Coastguard Worker    "                else:\n",
418*08b48e0bSAndroid Build Coastguard Worker    "                    label += \"-singlecore\"\n",
419*08b48e0bSAndroid Build Coastguard Worker    "                if afl_persistent_config:\n",
420*08b48e0bSAndroid Build Coastguard Worker    "                    label += \"+persist-conf\"\n",
421*08b48e0bSAndroid Build Coastguard Worker    "                if afl_system_config:\n",
422*08b48e0bSAndroid Build Coastguard Worker    "                    label += \"+system-conf\"\n",
423*08b48e0bSAndroid Build Coastguard Worker    "    \n",
424*08b48e0bSAndroid Build Coastguard Worker    "                if label == \"shmem-multicore+persist-conf+system-conf\":\n",
425*08b48e0bSAndroid Build Coastguard Worker    "                    graphdata.append({\"execs_per_sec\": execs_per_sec, \"parallel_fuzzers\": parallel_fuzzers, \"afl_persistent_config\": afl_persistent_config, \"afl_system_config\": afl_system_config, \"label\": \"Multicore: Persistent mode/shared memory + kernel config\"})\n",
426*08b48e0bSAndroid Build Coastguard Worker    "                if label == \"shmem-multicore\":\n",
427*08b48e0bSAndroid Build Coastguard Worker    "                    graphdata.append({\"execs_per_sec\": execs_per_sec, \"parallel_fuzzers\": parallel_fuzzers, \"afl_persistent_config\": afl_persistent_config, \"afl_system_config\": afl_system_config, \"label\": \"Multicore: Persistent mode/shared memory without kernel config\"})\n",
428*08b48e0bSAndroid Build Coastguard Worker    "                if label == \"base-multicore+persist-conf+system-conf\":\n",
429*08b48e0bSAndroid Build Coastguard Worker    "                    graphdata.append({\"execs_per_sec\": execs_per_sec, \"parallel_fuzzers\": parallel_fuzzers, \"afl_persistent_config\": afl_persistent_config, \"afl_system_config\": afl_system_config, \"label\": \"Multicore: Non-persistent mode + kernel config\"})\n",
430*08b48e0bSAndroid Build Coastguard Worker    "                if label == \"shmem-singlecore+persist-conf+system-conf\":\n",
431*08b48e0bSAndroid Build Coastguard Worker    "                    for i in range(1, max_fuzzers + 1):\n",
432*08b48e0bSAndroid Build Coastguard Worker    "                        graphdata.append({\"execs_per_sec\": execs_per_sec, \"parallel_fuzzers\": float(i), \"afl_persistent_config\": afl_persistent_config, \"afl_system_config\": afl_system_config, \"label\": \"Singlecore: Persistent mode/shared memory + kernel config\"})\n",
433*08b48e0bSAndroid Build Coastguard Worker    "                if label == \"base-singlecore+persist-conf+system-conf\":\n",
434*08b48e0bSAndroid Build Coastguard Worker    "                    for i in range(1, max_fuzzers + 1):\n",
435*08b48e0bSAndroid Build Coastguard Worker    "                        graphdata.append({\"execs_per_sec\": execs_per_sec, \"parallel_fuzzers\": float(i), \"afl_persistent_config\": afl_persistent_config, \"afl_system_config\": afl_system_config, \"label\": \"Singlecore: Non-persistent mode + kernel config\"})\n",
436*08b48e0bSAndroid Build Coastguard Worker    "    return pd.DataFrame.from_records(graphdata).sort_values(\"label\", ascending=False)\n",
437*08b48e0bSAndroid Build Coastguard Worker    "\n",
438*08b48e0bSAndroid Build Coastguard Worker    "graphdf = build_graphdf_from_query(i7)"
439*08b48e0bSAndroid Build Coastguard Worker   ]
440*08b48e0bSAndroid Build Coastguard Worker  },
441*08b48e0bSAndroid Build Coastguard Worker  {
442*08b48e0bSAndroid Build Coastguard Worker   "cell_type": "code",
443*08b48e0bSAndroid Build Coastguard Worker   "execution_count": 147,
444*08b48e0bSAndroid Build Coastguard Worker   "metadata": {},
445*08b48e0bSAndroid Build Coastguard Worker   "outputs": [
446*08b48e0bSAndroid Build Coastguard Worker    {
447*08b48e0bSAndroid Build Coastguard Worker     "data": {
448*08b48e0bSAndroid Build Coastguard Worker      "image/svg+xml": [
449*08b48e0bSAndroid Build Coastguard Worker       "<svg class=\"main-svg\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"1200\" height=\"400\" style=\"\" viewBox=\"0 0 1200 400\"><rect x=\"0\" y=\"0\" width=\"1200\" height=\"400\" style=\"fill: rgb(255, 255, 255); fill-opacity: 1;\"/><defs id=\"defs-9d6f0e\"><g class=\"clips\"><clipPath id=\"clip9d6f0exyplot\" class=\"plotclip\"><rect width=\"707\" height=\"220\"/></clipPath><clipPath class=\"axesclip\" id=\"clip9d6f0ex\"><rect x=\"80\" y=\"0\" width=\"707\" height=\"400\"/></clipPath><clipPath class=\"axesclip\" id=\"clip9d6f0ey\"><rect x=\"0\" y=\"100\" width=\"1200\" height=\"220\"/></clipPath><clipPath class=\"axesclip\" id=\"clip9d6f0exy\"><rect x=\"80\" y=\"100\" width=\"707\" height=\"220\"/></clipPath></g><g class=\"gradients\"/><g class=\"patterns\"/></defs><g class=\"bglayer\"><rect class=\"bg\" x=\"80\" y=\"100\" width=\"707\" height=\"220\" style=\"fill: rgb(229, 236, 246); fill-opacity: 1; stroke-width: 0;\"/></g><g class=\"layer-below\"><g class=\"imagelayer\"/><g class=\"shapelayer\"/></g><g class=\"cartesianlayer\"><g class=\"subplot xy\"><g class=\"layer-subplot\"><g class=\"shapelayer\"/><g class=\"imagelayer\"/></g><g class=\"minor-gridlayer\"><g class=\"x\"/><g class=\"y\"/></g><g class=\"gridlayer\"><g class=\"x\"><path class=\"xgrid crisp\" transform=\"translate(100.2,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(120.4,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(140.6,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(160.8,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(181,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(201.2,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(221.4,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(241.6,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(261.8,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(282,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(302.2,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(322.4,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(342.6,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(362.8,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(383,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(403.2,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(423.4,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(443.6,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(463.8,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(484,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(504.2,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(524.4,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(544.6,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(564.8,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(585,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(605.2,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(625.4,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(645.6,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(665.8,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(686,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(706.2,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(726.4,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(746.6,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(766.8,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/></g><g class=\"y\"><path class=\"ygrid crisp\" transform=\"translate(0,309)\" d=\"M80,0h707\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"ygrid crisp\" transform=\"translate(0,269.4)\" d=\"M80,0h707\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"ygrid crisp\" transform=\"translate(0,229.8)\" d=\"M80,0h707\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"ygrid crisp\" transform=\"translate(0,190.2)\" d=\"M80,0h707\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"ygrid crisp\" transform=\"translate(0,150.6)\" d=\"M80,0h707\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"ygrid crisp\" transform=\"translate(0,111)\" d=\"M80,0h707\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/></g></g><g class=\"zerolinelayer\"><path class=\"yzl zl crisp\" transform=\"translate(0,310.68)\" d=\"M80,0h707\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 2px;\"/></g><path class=\"xlines-below\"/><path class=\"ylines-below\"/><g class=\"overlines-below\"/><g class=\"xaxislayer-below\"/><g class=\"yaxislayer-below\"/><g class=\"overaxes-below\"/><g class=\"plot\" transform=\"translate(80,100)\" clip-path=\"url(#clip9d6f0exyplot)\"><g class=\"scatterlayer mlayer\"><g class=\"trace scatter traceff0d16\" style=\"stroke-miterlimit: 2; opacity: 1;\"><g class=\"fills\"/><g class=\"errorbars\"/><g class=\"lines\"><path class=\"js-line\" d=\"M0,208.85L80.8,202.77L101,201.36L141.4,198.59L161.6,198L323.2,193.39L343.4,193.43L464.6,193.88L484.8,193.92L707,194.3\" style=\"vector-effect: none; fill: none; stroke: rgb(99, 110, 250); stroke-opacity: 1; stroke-width: 2px; opacity: 1;\"/></g><g class=\"points\"/><g class=\"text\"/></g><g class=\"trace scatter tracef305d6\" style=\"stroke-miterlimit: 2; opacity: 1;\"><g class=\"fills\"/><g class=\"errorbars\"/><g class=\"lines\"><path class=\"js-line\" d=\"M0,190.13L101,94.86L121.2,77L141.4,58.03L161.6,47.37L202,37L222.2,30.79L242.4,25.2L262.6,20.96L303,11L323.2,16.78L343.4,12.45L363.6,13.25L383.8,14.21L404,16.48L424.2,20.66L444.4,15.41L464.6,15.27L484.8,22.42L505,19.96L525.2,22.91L545.4,20.22L565.6,20.92L585.8,29.86L606,19.39L626.2,19.56L646.4,23.9L666.6,21.39L686.8,32.77L707,24.08\" style=\"vector-effect: none; fill: none; stroke: rgb(239, 85, 59); stroke-opacity: 1; stroke-width: 2px; opacity: 1;\"/></g><g class=\"points\"/><g class=\"text\"/></g><g class=\"trace scatter tracef64091\" style=\"stroke-miterlimit: 2; opacity: 1;\"><g class=\"fills\"/><g class=\"errorbars\"/><g class=\"lines\"><path class=\"js-line\" d=\"M0,195.2L40.4,165.81L60.6,152.75L141.4,97.63L161.6,93.7L303,66.53L323.2,66.65L383.8,65.9L404,66.5L444.4,66.49L464.6,67.67L505,67.82L525.2,69.28L565.6,69.56L585.8,70.99L626.2,71.86L646.4,73.11L666.6,71.31L686.8,71.91L707,71.07\" style=\"vector-effect: none; fill: none; stroke: rgb(0, 204, 150); stroke-opacity: 1; stroke-width: 2px; opacity: 1;\"/></g><g class=\"points\"/><g class=\"text\"/></g><g class=\"trace scatter trace642013\" style=\"stroke-miterlimit: 2; opacity: 1;\"><g class=\"fills\"/><g class=\"errorbars\"/><g class=\"lines\"><path class=\"js-line\" d=\"M0,209L707,209\" style=\"vector-effect: none; fill: none; stroke: rgb(171, 99, 250); stroke-opacity: 1; stroke-width: 2px; opacity: 1;\"/></g><g class=\"points\"/><g class=\"text\"/></g><g class=\"trace scatter traceff0076\" style=\"stroke-miterlimit: 2; opacity: 1;\"><g class=\"fills\"/><g class=\"errorbars\"/><g class=\"lines\"><path class=\"js-line\" d=\"M0,189.21L707,189.21\" style=\"vector-effect: none; fill: none; stroke: rgb(255, 161, 90); stroke-opacity: 1; stroke-width: 2px; opacity: 1;\"/></g><g class=\"points\"/><g class=\"text\"/></g></g></g><g class=\"overplot\"/><path class=\"xlines-above crisp\" d=\"M0,0\" style=\"fill: none;\"/><path class=\"ylines-above crisp\" d=\"M0,0\" style=\"fill: none;\"/><g class=\"overlines-above\"/><g class=\"xaxislayer-above\"><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" transform=\"translate(80,0)\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\">1</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(100.2,0)\">2</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(120.4,0)\">3</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(140.6,0)\">4</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(160.8,0)\">5</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(181,0)\">6</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(201.2,0)\">7</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(221.4,0)\">8</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(241.6,0)\">9</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(261.8,0)\">10</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(282,0)\">11</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(302.2,0)\">12</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(322.4,0)\">13</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(342.6,0)\">14</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(362.8,0)\">15</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(383,0)\">16</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(403.2,0)\">17</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(423.4,0)\">18</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(443.6,0)\">19</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(463.8,0)\">20</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(484,0)\">21</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(504.2,0)\">22</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(524.4,0)\">23</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(544.6,0)\">24</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(564.8,0)\">25</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(585,0)\">26</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(605.2,0)\">27</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(625.4,0)\">28</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(645.6,0)\">29</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(665.8,0)\">30</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(686,0)\">31</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(706.2,0)\">32</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(726.4,0)\">33</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(746.6,0)\">34</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(766.8,0)\">35</text></g><g class=\"xtick\"><text text-anchor=\"middle\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(787,0)\">36</text></g></g><g class=\"yaxislayer-above\"><g class=\"ytick\"><text text-anchor=\"end\" x=\"79\" y=\"4.199999999999999\" transform=\"translate(0,309)\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\">1x</text></g><g class=\"ytick\"><text text-anchor=\"end\" x=\"79\" y=\"4.199999999999999\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(0,269.4)\">25x</text></g><g class=\"ytick\"><text text-anchor=\"end\" x=\"79\" y=\"4.199999999999999\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(0,229.8)\">48x</text></g><g class=\"ytick\"><text text-anchor=\"end\" x=\"79\" y=\"4.199999999999999\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(0,190.2)\">72x</text></g><g class=\"ytick\"><text text-anchor=\"end\" x=\"79\" y=\"4.199999999999999\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(0,150.6)\">95x</text></g><g class=\"ytick\"><text text-anchor=\"end\" x=\"79\" y=\"4.199999999999999\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(0,111)\">119x</text></g></g><g class=\"overaxes-above\"/></g></g><g class=\"polarlayer\"/><g class=\"smithlayer\"/><g class=\"ternarylayer\"/><g class=\"geolayer\"/><g class=\"funnelarealayer\"/><g class=\"pielayer\"/><g class=\"iciclelayer\"/><g class=\"treemaplayer\"/><g class=\"sunburstlayer\"/><g class=\"glimages\"/><defs id=\"topdefs-9d6f0e\"><g class=\"clips\"/><clipPath id=\"legend9d6f0e\"><rect width=\"387\" height=\"124\" x=\"0\" y=\"0\"/></clipPath></defs><g class=\"layer-above\"><g class=\"imagelayer\"/><g class=\"shapelayer\"/></g><g class=\"infolayer\"><g class=\"legend\" pointer-events=\"all\" transform=\"translate(801.14,100)\"><rect class=\"bg\" shape-rendering=\"crispEdges\" width=\"387\" height=\"124\" x=\"0\" y=\"0\" style=\"stroke: rgb(68, 68, 68); stroke-opacity: 1; fill: rgb(255, 255, 255); fill-opacity: 1; stroke-width: 0px;\"/><g class=\"scrollbox\" transform=\"\" clip-path=\"url(#legend9d6f0e)\"><text class=\"legendtitletext\" text-anchor=\"start\" x=\"2\" y=\"18.2\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 14px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre;\">Configuration</text><g class=\"groups\" transform=\"\"><g class=\"traces\" transform=\"translate(0,32.7)\" style=\"opacity: 1;\"><text class=\"legendtext\" text-anchor=\"start\" x=\"40\" y=\"4.680000000000001\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre;\">Multicore: Non-persistent mode + kernel config</text><g class=\"layers\" style=\"opacity: 1;\"><g class=\"legendfill\"/><g class=\"legendlines\"><path class=\"js-line\" d=\"M5,0h30\" style=\"fill: none; stroke: rgb(99, 110, 250); stroke-opacity: 1; stroke-width: 2px;\"/></g><g class=\"legendsymbols\"><g class=\"legendpoints\"/></g></g><rect class=\"legendtoggle\" x=\"0\" y=\"-9.5\" width=\"381.484375\" height=\"19\" style=\"fill: rgb(0, 0, 0); fill-opacity: 0;\"/></g></g><g class=\"groups\" transform=\"\"><g class=\"traces\" transform=\"translate(0,51.7)\" style=\"opacity: 1;\"><text class=\"legendtext\" text-anchor=\"start\" x=\"40\" y=\"4.680000000000001\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre;\">Multicore: Persistent mode/shared memory + kernel config</text><g class=\"layers\" style=\"opacity: 1;\"><g class=\"legendfill\"/><g class=\"legendlines\"><path class=\"js-line\" d=\"M5,0h30\" style=\"fill: none; stroke: rgb(239, 85, 59); stroke-opacity: 1; stroke-width: 2px;\"/></g><g class=\"legendsymbols\"><g class=\"legendpoints\"/></g></g><rect class=\"legendtoggle\" x=\"0\" y=\"-9.5\" width=\"381.484375\" height=\"19\" style=\"fill: rgb(0, 0, 0); fill-opacity: 0;\"/></g></g><g class=\"groups\" transform=\"\"><g class=\"traces\" transform=\"translate(0,70.7)\" style=\"opacity: 1;\"><text class=\"legendtext\" text-anchor=\"start\" x=\"40\" y=\"4.680000000000001\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre;\">Multicore: Persistent mode/shared memory without kernel config</text><g class=\"layers\" style=\"opacity: 1;\"><g class=\"legendfill\"/><g class=\"legendlines\"><path class=\"js-line\" d=\"M5,0h30\" style=\"fill: none; stroke: rgb(0, 204, 150); stroke-opacity: 1; stroke-width: 2px;\"/></g><g class=\"legendsymbols\"><g class=\"legendpoints\"/></g></g><rect class=\"legendtoggle\" x=\"0\" y=\"-9.5\" width=\"381.484375\" height=\"19\" style=\"fill: rgb(0, 0, 0); fill-opacity: 0;\"/></g></g><g class=\"groups\" transform=\"\"><g class=\"traces\" transform=\"translate(0,89.7)\" style=\"opacity: 1;\"><text class=\"legendtext\" text-anchor=\"start\" x=\"40\" y=\"4.680000000000001\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre;\">Singlecore: Non-persistent mode + kernel config</text><g class=\"layers\" style=\"opacity: 1;\"><g class=\"legendfill\"/><g class=\"legendlines\"><path class=\"js-line\" d=\"M5,0h30\" style=\"fill: none; stroke: rgb(171, 99, 250); stroke-opacity: 1; stroke-width: 2px;\"/></g><g class=\"legendsymbols\"><g class=\"legendpoints\"/></g></g><rect class=\"legendtoggle\" x=\"0\" y=\"-9.5\" width=\"381.484375\" height=\"19\" style=\"fill: rgb(0, 0, 0); fill-opacity: 0;\"/></g></g><g class=\"groups\" transform=\"\"><g class=\"traces\" transform=\"translate(0,108.7)\" style=\"opacity: 1;\"><text class=\"legendtext\" text-anchor=\"start\" x=\"40\" y=\"4.680000000000001\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre;\">Singlecore: Persistent mode/shared memory + kernel config</text><g class=\"layers\" style=\"opacity: 1;\"><g class=\"legendfill\"/><g class=\"legendlines\"><path class=\"js-line\" d=\"M5,0h30\" style=\"fill: none; stroke: rgb(255, 161, 90); stroke-opacity: 1; stroke-width: 2px;\"/></g><g class=\"legendsymbols\"><g class=\"legendpoints\"/></g></g><rect class=\"legendtoggle\" x=\"0\" y=\"-9.5\" width=\"381.484375\" height=\"19\" style=\"fill: rgb(0, 0, 0); fill-opacity: 0;\"/></g></g></g><rect class=\"scrollbar\" rx=\"20\" ry=\"3\" width=\"0\" height=\"0\" x=\"0\" y=\"0\" style=\"fill: rgb(128, 139, 164); fill-opacity: 1;\"/></g><g class=\"g-gtitle\"><text class=\"gtitle\" x=\"60\" y=\"50\" text-anchor=\"start\" dy=\"0em\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 17px; fill: rgb(42, 63, 95); opacity: 1; font-weight: normal; white-space: pre;\">Fuzzer performance</text></g><g class=\"g-xtitle\"><text class=\"xtitle\" x=\"433.5\" y=\"360.3\" text-anchor=\"middle\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 14px; fill: rgb(42, 63, 95); opacity: 1; font-weight: normal; white-space: pre;\">Number of parallel fuzzers</text></g><g class=\"g-ytitle\"><text class=\"ytitle\" transform=\"rotate(-90,29.559375000000003,210)\" x=\"29.559375000000003\" y=\"210\" text-anchor=\"middle\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 14px; fill: rgb(42, 63, 95); opacity: 1; font-weight: normal; white-space: pre;\">Fuzz target executions per second</text></g></g></svg>"
450*08b48e0bSAndroid Build Coastguard Worker      ]
451*08b48e0bSAndroid Build Coastguard Worker     },
452*08b48e0bSAndroid Build Coastguard Worker     "metadata": {},
453*08b48e0bSAndroid Build Coastguard Worker     "output_type": "display_data"
454*08b48e0bSAndroid Build Coastguard Worker    }
455*08b48e0bSAndroid Build Coastguard Worker   ],
456*08b48e0bSAndroid Build Coastguard Worker   "source": [
457*08b48e0bSAndroid Build Coastguard Worker    "import numpy as np\n",
458*08b48e0bSAndroid Build Coastguard Worker    "pd.options.plotting.backend = \"plotly\"\n",
459*08b48e0bSAndroid Build Coastguard Worker    "\n",
460*08b48e0bSAndroid Build Coastguard Worker    "# Right now our table has absolute values of execs per sec, but it's more useful\n",
461*08b48e0bSAndroid Build Coastguard Worker    "# to show relative perf (vs 1.0x baseline)\n",
462*08b48e0bSAndroid Build Coastguard Worker    "pivotdf = graphdf.pivot(index=\"parallel_fuzzers\", columns=\"label\", values=\"execs_per_sec\")\n",
463*08b48e0bSAndroid Build Coastguard Worker    "fig = pivotdf.plot(\n",
464*08b48e0bSAndroid Build Coastguard Worker    "    title=\"Fuzzer performance\",\n",
465*08b48e0bSAndroid Build Coastguard Worker    "    labels={\n",
466*08b48e0bSAndroid Build Coastguard Worker    "        \"label\": \"Configuration\",\n",
467*08b48e0bSAndroid Build Coastguard Worker    "        \"parallel_fuzzers\": \"Number of parallel fuzzers\",\n",
468*08b48e0bSAndroid Build Coastguard Worker    "        \"value\": \"Fuzz target executions per second\"\n",
469*08b48e0bSAndroid Build Coastguard Worker    "    }\n",
470*08b48e0bSAndroid Build Coastguard Worker    ")\n",
471*08b48e0bSAndroid Build Coastguard Worker    "\n",
472*08b48e0bSAndroid Build Coastguard Worker    "# Compute tick values and their labels for the primary Y-axis\n",
473*08b48e0bSAndroid Build Coastguard Worker    "tickvals = np.linspace(graphdf['execs_per_sec'].min(), graphdf['execs_per_sec'].max(), 6)\n",
474*08b48e0bSAndroid Build Coastguard Worker    "ticktext = [f\"{val:.0f}x\" for val in tickvals / graphdf['execs_per_sec'].min()]\n",
475*08b48e0bSAndroid Build Coastguard Worker    "# Update the primary Y-axis with custom tick labels\n",
476*08b48e0bSAndroid Build Coastguard Worker    "fig.update_yaxes(tickvals=tickvals, ticktext=ticktext)\n",
477*08b48e0bSAndroid Build Coastguard Worker    "fig.update_xaxes(tickvals=list(range(1,36+1)))\n",
478*08b48e0bSAndroid Build Coastguard Worker    "fig.update_layout(width=1200, height=400)\n",
479*08b48e0bSAndroid Build Coastguard Worker    "fig.show(\"svg\")\n"
480*08b48e0bSAndroid Build Coastguard Worker   ]
481*08b48e0bSAndroid Build Coastguard Worker  },
482*08b48e0bSAndroid Build Coastguard Worker  {
483*08b48e0bSAndroid Build Coastguard Worker   "cell_type": "markdown",
484*08b48e0bSAndroid Build Coastguard Worker   "metadata": {},
485*08b48e0bSAndroid Build Coastguard Worker   "source": [
486*08b48e0bSAndroid Build Coastguard Worker    "Here's what the table that produced this graph looks like:"
487*08b48e0bSAndroid Build Coastguard Worker   ]
488*08b48e0bSAndroid Build Coastguard Worker  },
489*08b48e0bSAndroid Build Coastguard Worker  {
490*08b48e0bSAndroid Build Coastguard Worker   "cell_type": "code",
491*08b48e0bSAndroid Build Coastguard Worker   "execution_count": 148,
492*08b48e0bSAndroid Build Coastguard Worker   "metadata": {},
493*08b48e0bSAndroid Build Coastguard Worker   "outputs": [
494*08b48e0bSAndroid Build Coastguard Worker    {
495*08b48e0bSAndroid Build Coastguard Worker     "data": {
496*08b48e0bSAndroid Build Coastguard Worker      "text/html": [
497*08b48e0bSAndroid Build Coastguard Worker       "<div>\n",
498*08b48e0bSAndroid Build Coastguard Worker       "<style scoped>\n",
499*08b48e0bSAndroid Build Coastguard Worker       "    .dataframe tbody tr th:only-of-type {\n",
500*08b48e0bSAndroid Build Coastguard Worker       "        vertical-align: middle;\n",
501*08b48e0bSAndroid Build Coastguard Worker       "    }\n",
502*08b48e0bSAndroid Build Coastguard Worker       "\n",
503*08b48e0bSAndroid Build Coastguard Worker       "    .dataframe tbody tr th {\n",
504*08b48e0bSAndroid Build Coastguard Worker       "        vertical-align: top;\n",
505*08b48e0bSAndroid Build Coastguard Worker       "    }\n",
506*08b48e0bSAndroid Build Coastguard Worker       "\n",
507*08b48e0bSAndroid Build Coastguard Worker       "    .dataframe thead th {\n",
508*08b48e0bSAndroid Build Coastguard Worker       "        text-align: right;\n",
509*08b48e0bSAndroid Build Coastguard Worker       "    }\n",
510*08b48e0bSAndroid Build Coastguard Worker       "</style>\n",
511*08b48e0bSAndroid Build Coastguard Worker       "<table border=\"1\" class=\"dataframe\">\n",
512*08b48e0bSAndroid Build Coastguard Worker       "  <thead>\n",
513*08b48e0bSAndroid Build Coastguard Worker       "    <tr style=\"text-align: right;\">\n",
514*08b48e0bSAndroid Build Coastguard Worker       "      <th>label</th>\n",
515*08b48e0bSAndroid Build Coastguard Worker       "      <th>Multicore: Non-persistent mode + kernel config</th>\n",
516*08b48e0bSAndroid Build Coastguard Worker       "      <th>Multicore: Persistent mode/shared memory + kernel config</th>\n",
517*08b48e0bSAndroid Build Coastguard Worker       "      <th>Multicore: Persistent mode/shared memory without kernel config</th>\n",
518*08b48e0bSAndroid Build Coastguard Worker       "      <th>Singlecore: Non-persistent mode + kernel config</th>\n",
519*08b48e0bSAndroid Build Coastguard Worker       "      <th>Singlecore: Persistent mode/shared memory + kernel config</th>\n",
520*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
521*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
522*08b48e0bSAndroid Build Coastguard Worker       "      <th>parallel_fuzzers</th>\n",
523*08b48e0bSAndroid Build Coastguard Worker       "      <th></th>\n",
524*08b48e0bSAndroid Build Coastguard Worker       "      <th></th>\n",
525*08b48e0bSAndroid Build Coastguard Worker       "      <th></th>\n",
526*08b48e0bSAndroid Build Coastguard Worker       "      <th></th>\n",
527*08b48e0bSAndroid Build Coastguard Worker       "      <th></th>\n",
528*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
529*08b48e0bSAndroid Build Coastguard Worker       "  </thead>\n",
530*08b48e0bSAndroid Build Coastguard Worker       "  <tbody>\n",
531*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
532*08b48e0bSAndroid Build Coastguard Worker       "      <th>1.0</th>\n",
533*08b48e0bSAndroid Build Coastguard Worker       "      <td>10714.79</td>\n",
534*08b48e0bSAndroid Build Coastguard Worker       "      <td>120293.77</td>\n",
535*08b48e0bSAndroid Build Coastguard Worker       "      <td>90641.62</td>\n",
536*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
537*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
538*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
539*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
540*08b48e0bSAndroid Build Coastguard Worker       "      <th>2.0</th>\n",
541*08b48e0bSAndroid Build Coastguard Worker       "      <td>20493.07</td>\n",
542*08b48e0bSAndroid Build Coastguard Worker       "      <td>231429.96</td>\n",
543*08b48e0bSAndroid Build Coastguard Worker       "      <td>178184.19</td>\n",
544*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
545*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
546*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
547*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
548*08b48e0bSAndroid Build Coastguard Worker       "      <th>3.0</th>\n",
549*08b48e0bSAndroid Build Coastguard Worker       "      <td>29660.06</td>\n",
550*08b48e0bSAndroid Build Coastguard Worker       "      <td>346759.33</td>\n",
551*08b48e0bSAndroid Build Coastguard Worker       "      <td>262652.86</td>\n",
552*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
553*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
554*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
555*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
556*08b48e0bSAndroid Build Coastguard Worker       "      <th>4.0</th>\n",
557*08b48e0bSAndroid Build Coastguard Worker       "      <td>37875.57</td>\n",
558*08b48e0bSAndroid Build Coastguard Worker       "      <td>455340.06</td>\n",
559*08b48e0bSAndroid Build Coastguard Worker       "      <td>339119.32</td>\n",
560*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
561*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
562*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
563*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
564*08b48e0bSAndroid Build Coastguard Worker       "      <th>5.0</th>\n",
565*08b48e0bSAndroid Build Coastguard Worker       "      <td>46326.75</td>\n",
566*08b48e0bSAndroid Build Coastguard Worker       "      <td>568405.15</td>\n",
567*08b48e0bSAndroid Build Coastguard Worker       "      <td>420239.94</td>\n",
568*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
569*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
570*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
571*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
572*08b48e0bSAndroid Build Coastguard Worker       "      <th>6.0</th>\n",
573*08b48e0bSAndroid Build Coastguard Worker       "      <td>54595.48</td>\n",
574*08b48e0bSAndroid Build Coastguard Worker       "      <td>678030.96</td>\n",
575*08b48e0bSAndroid Build Coastguard Worker       "      <td>498062.02</td>\n",
576*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
577*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
578*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
579*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
580*08b48e0bSAndroid Build Coastguard Worker       "      <th>7.0</th>\n",
581*08b48e0bSAndroid Build Coastguard Worker       "      <td>62720.98</td>\n",
582*08b48e0bSAndroid Build Coastguard Worker       "      <td>782585.04</td>\n",
583*08b48e0bSAndroid Build Coastguard Worker       "      <td>578495.44</td>\n",
584*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
585*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
586*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
587*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
588*08b48e0bSAndroid Build Coastguard Worker       "      <th>8.0</th>\n",
589*08b48e0bSAndroid Build Coastguard Worker       "      <td>70777.99</td>\n",
590*08b48e0bSAndroid Build Coastguard Worker       "      <td>893618.35</td>\n",
591*08b48e0bSAndroid Build Coastguard Worker       "      <td>661836.22</td>\n",
592*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
593*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
594*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
595*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
596*08b48e0bSAndroid Build Coastguard Worker       "      <th>9.0</th>\n",
597*08b48e0bSAndroid Build Coastguard Worker       "      <td>74236.02</td>\n",
598*08b48e0bSAndroid Build Coastguard Worker       "      <td>956026.15</td>\n",
599*08b48e0bSAndroid Build Coastguard Worker       "      <td>684808.49</td>\n",
600*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
601*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
602*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
603*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
604*08b48e0bSAndroid Build Coastguard Worker       "      <th>10.0</th>\n",
605*08b48e0bSAndroid Build Coastguard Worker       "      <td>78134.94</td>\n",
606*08b48e0bSAndroid Build Coastguard Worker       "      <td>984942.13</td>\n",
607*08b48e0bSAndroid Build Coastguard Worker       "      <td>707094.65</td>\n",
608*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
609*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
610*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
611*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
612*08b48e0bSAndroid Build Coastguard Worker       "      <th>11.0</th>\n",
613*08b48e0bSAndroid Build Coastguard Worker       "      <td>81886.33</td>\n",
614*08b48e0bSAndroid Build Coastguard Worker       "      <td>1016758.62</td>\n",
615*08b48e0bSAndroid Build Coastguard Worker       "      <td>732106.17</td>\n",
616*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
617*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
618*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
619*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
620*08b48e0bSAndroid Build Coastguard Worker       "      <th>12.0</th>\n",
621*08b48e0bSAndroid Build Coastguard Worker       "      <td>85923.44</td>\n",
622*08b48e0bSAndroid Build Coastguard Worker       "      <td>1053087.90</td>\n",
623*08b48e0bSAndroid Build Coastguard Worker       "      <td>752910.17</td>\n",
624*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
625*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
626*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
627*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
628*08b48e0bSAndroid Build Coastguard Worker       "      <th>13.0</th>\n",
629*08b48e0bSAndroid Build Coastguard Worker       "      <td>89696.95</td>\n",
630*08b48e0bSAndroid Build Coastguard Worker       "      <td>1085797.87</td>\n",
631*08b48e0bSAndroid Build Coastguard Worker       "      <td>776179.85</td>\n",
632*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
633*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
634*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
635*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
636*08b48e0bSAndroid Build Coastguard Worker       "      <th>14.0</th>\n",
637*08b48e0bSAndroid Build Coastguard Worker       "      <td>93540.52</td>\n",
638*08b48e0bSAndroid Build Coastguard Worker       "      <td>1110640.20</td>\n",
639*08b48e0bSAndroid Build Coastguard Worker       "      <td>797520.58</td>\n",
640*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
641*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
642*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
643*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
644*08b48e0bSAndroid Build Coastguard Worker       "      <th>15.0</th>\n",
645*08b48e0bSAndroid Build Coastguard Worker       "      <td>97641.51</td>\n",
646*08b48e0bSAndroid Build Coastguard Worker       "      <td>1138984.22</td>\n",
647*08b48e0bSAndroid Build Coastguard Worker       "      <td>822235.41</td>\n",
648*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
649*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
650*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
651*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
652*08b48e0bSAndroid Build Coastguard Worker       "      <th>16.0</th>\n",
653*08b48e0bSAndroid Build Coastguard Worker       "      <td>101692.65</td>\n",
654*08b48e0bSAndroid Build Coastguard Worker       "      <td>1168943.19</td>\n",
655*08b48e0bSAndroid Build Coastguard Worker       "      <td>843897.51</td>\n",
656*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
657*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
658*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
659*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
660*08b48e0bSAndroid Build Coastguard Worker       "      <th>17.0</th>\n",
661*08b48e0bSAndroid Build Coastguard Worker       "      <td>101236.75</td>\n",
662*08b48e0bSAndroid Build Coastguard Worker       "      <td>1135093.91</td>\n",
663*08b48e0bSAndroid Build Coastguard Worker       "      <td>843177.15</td>\n",
664*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
665*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
666*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
667*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
668*08b48e0bSAndroid Build Coastguard Worker       "      <th>18.0</th>\n",
669*08b48e0bSAndroid Build Coastguard Worker       "      <td>101006.28</td>\n",
670*08b48e0bSAndroid Build Coastguard Worker       "      <td>1160430.45</td>\n",
671*08b48e0bSAndroid Build Coastguard Worker       "      <td>844779.09</td>\n",
672*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
673*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
674*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
675*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
676*08b48e0bSAndroid Build Coastguard Worker       "      <th>19.0</th>\n",
677*08b48e0bSAndroid Build Coastguard Worker       "      <td>99952.26</td>\n",
678*08b48e0bSAndroid Build Coastguard Worker       "      <td>1155769.97</td>\n",
679*08b48e0bSAndroid Build Coastguard Worker       "      <td>846060.74</td>\n",
680*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
681*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
682*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
683*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
684*08b48e0bSAndroid Build Coastguard Worker       "      <th>20.0</th>\n",
685*08b48e0bSAndroid Build Coastguard Worker       "      <td>99798.64</td>\n",
686*08b48e0bSAndroid Build Coastguard Worker       "      <td>1150156.26</td>\n",
687*08b48e0bSAndroid Build Coastguard Worker       "      <td>847556.23</td>\n",
688*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
689*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
690*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
691*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
692*08b48e0bSAndroid Build Coastguard Worker       "      <th>21.0</th>\n",
693*08b48e0bSAndroid Build Coastguard Worker       "      <td>99018.86</td>\n",
694*08b48e0bSAndroid Build Coastguard Worker       "      <td>1136873.58</td>\n",
695*08b48e0bSAndroid Build Coastguard Worker       "      <td>844022.97</td>\n",
696*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
697*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
698*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
699*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
700*08b48e0bSAndroid Build Coastguard Worker       "      <th>22.0</th>\n",
701*08b48e0bSAndroid Build Coastguard Worker       "      <td>98600.87</td>\n",
702*08b48e0bSAndroid Build Coastguard Worker       "      <td>1112404.25</td>\n",
703*08b48e0bSAndroid Build Coastguard Worker       "      <td>845818.70</td>\n",
704*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
705*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
706*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
707*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
708*08b48e0bSAndroid Build Coastguard Worker       "      <th>23.0</th>\n",
709*08b48e0bSAndroid Build Coastguard Worker       "      <td>98634.02</td>\n",
710*08b48e0bSAndroid Build Coastguard Worker       "      <td>1143131.72</td>\n",
711*08b48e0bSAndroid Build Coastguard Worker       "      <td>844118.27</td>\n",
712*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
713*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
714*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
715*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
716*08b48e0bSAndroid Build Coastguard Worker       "      <th>24.0</th>\n",
717*08b48e0bSAndroid Build Coastguard Worker       "      <td>98352.90</td>\n",
718*08b48e0bSAndroid Build Coastguard Worker       "      <td>1143931.38</td>\n",
719*08b48e0bSAndroid Build Coastguard Worker       "      <td>837189.02</td>\n",
720*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
721*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
722*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
723*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
724*08b48e0bSAndroid Build Coastguard Worker       "      <th>25.0</th>\n",
725*08b48e0bSAndroid Build Coastguard Worker       "      <td>98118.63</td>\n",
726*08b48e0bSAndroid Build Coastguard Worker       "      <td>1102090.61</td>\n",
727*08b48e0bSAndroid Build Coastguard Worker       "      <td>834712.31</td>\n",
728*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
729*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
730*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
731*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
732*08b48e0bSAndroid Build Coastguard Worker       "      <th>26.0</th>\n",
733*08b48e0bSAndroid Build Coastguard Worker       "      <td>97752.45</td>\n",
734*08b48e0bSAndroid Build Coastguard Worker       "      <td>1116518.70</td>\n",
735*08b48e0bSAndroid Build Coastguard Worker       "      <td>836344.12</td>\n",
736*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
737*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
738*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
739*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
740*08b48e0bSAndroid Build Coastguard Worker       "      <th>27.0</th>\n",
741*08b48e0bSAndroid Build Coastguard Worker       "      <td>97864.07</td>\n",
742*08b48e0bSAndroid Build Coastguard Worker       "      <td>1099224.19</td>\n",
743*08b48e0bSAndroid Build Coastguard Worker       "      <td>827784.91</td>\n",
744*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
745*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
746*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
747*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
748*08b48e0bSAndroid Build Coastguard Worker       "      <th>28.0</th>\n",
749*08b48e0bSAndroid Build Coastguard Worker       "      <td>97821.80</td>\n",
750*08b48e0bSAndroid Build Coastguard Worker       "      <td>1114945.37</td>\n",
751*08b48e0bSAndroid Build Coastguard Worker       "      <td>828641.27</td>\n",
752*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
753*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
754*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
755*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
756*08b48e0bSAndroid Build Coastguard Worker       "      <th>29.0</th>\n",
757*08b48e0bSAndroid Build Coastguard Worker       "      <td>97564.87</td>\n",
758*08b48e0bSAndroid Build Coastguard Worker       "      <td>1110889.91</td>\n",
759*08b48e0bSAndroid Build Coastguard Worker       "      <td>826123.67</td>\n",
760*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
761*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
762*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
763*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
764*08b48e0bSAndroid Build Coastguard Worker       "      <th>30.0</th>\n",
765*08b48e0bSAndroid Build Coastguard Worker       "      <td>98508.10</td>\n",
766*08b48e0bSAndroid Build Coastguard Worker       "      <td>1058548.28</td>\n",
767*08b48e0bSAndroid Build Coastguard Worker       "      <td>817765.77</td>\n",
768*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
769*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
770*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
771*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
772*08b48e0bSAndroid Build Coastguard Worker       "      <th>31.0</th>\n",
773*08b48e0bSAndroid Build Coastguard Worker       "      <td>98238.96</td>\n",
774*08b48e0bSAndroid Build Coastguard Worker       "      <td>1119804.85</td>\n",
775*08b48e0bSAndroid Build Coastguard Worker       "      <td>816556.66</td>\n",
776*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
777*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
778*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
779*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
780*08b48e0bSAndroid Build Coastguard Worker       "      <th>32.0</th>\n",
781*08b48e0bSAndroid Build Coastguard Worker       "      <td>98363.93</td>\n",
782*08b48e0bSAndroid Build Coastguard Worker       "      <td>1118828.99</td>\n",
783*08b48e0bSAndroid Build Coastguard Worker       "      <td>812661.77</td>\n",
784*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
785*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
786*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
787*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
788*08b48e0bSAndroid Build Coastguard Worker       "      <th>33.0</th>\n",
789*08b48e0bSAndroid Build Coastguard Worker       "      <td>96758.69</td>\n",
790*08b48e0bSAndroid Build Coastguard Worker       "      <td>1093426.61</td>\n",
791*08b48e0bSAndroid Build Coastguard Worker       "      <td>805352.16</td>\n",
792*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
793*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
794*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
795*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
796*08b48e0bSAndroid Build Coastguard Worker       "      <th>34.0</th>\n",
797*08b48e0bSAndroid Build Coastguard Worker       "      <td>96327.00</td>\n",
798*08b48e0bSAndroid Build Coastguard Worker       "      <td>1108123.59</td>\n",
799*08b48e0bSAndroid Build Coastguard Worker       "      <td>815888.26</td>\n",
800*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
801*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
802*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
803*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
804*08b48e0bSAndroid Build Coastguard Worker       "      <th>35.0</th>\n",
805*08b48e0bSAndroid Build Coastguard Worker       "      <td>95913.98</td>\n",
806*08b48e0bSAndroid Build Coastguard Worker       "      <td>1041486.52</td>\n",
807*08b48e0bSAndroid Build Coastguard Worker       "      <td>812348.56</td>\n",
808*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
809*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
810*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
811*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
812*08b48e0bSAndroid Build Coastguard Worker       "      <th>36.0</th>\n",
813*08b48e0bSAndroid Build Coastguard Worker       "      <td>95871.39</td>\n",
814*08b48e0bSAndroid Build Coastguard Worker       "      <td>1092395.61</td>\n",
815*08b48e0bSAndroid Build Coastguard Worker       "      <td>817278.03</td>\n",
816*08b48e0bSAndroid Build Coastguard Worker       "      <td>9845.64</td>\n",
817*08b48e0bSAndroid Build Coastguard Worker       "      <td>125682.73</td>\n",
818*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
819*08b48e0bSAndroid Build Coastguard Worker       "  </tbody>\n",
820*08b48e0bSAndroid Build Coastguard Worker       "</table>\n",
821*08b48e0bSAndroid Build Coastguard Worker       "</div>"
822*08b48e0bSAndroid Build Coastguard Worker      ],
823*08b48e0bSAndroid Build Coastguard Worker      "text/plain": [
824*08b48e0bSAndroid Build Coastguard Worker       "label             Multicore: Non-persistent mode + kernel config  \\\n",
825*08b48e0bSAndroid Build Coastguard Worker       "parallel_fuzzers                                                   \n",
826*08b48e0bSAndroid Build Coastguard Worker       "1.0                                                     10714.79   \n",
827*08b48e0bSAndroid Build Coastguard Worker       "2.0                                                     20493.07   \n",
828*08b48e0bSAndroid Build Coastguard Worker       "3.0                                                     29660.06   \n",
829*08b48e0bSAndroid Build Coastguard Worker       "4.0                                                     37875.57   \n",
830*08b48e0bSAndroid Build Coastguard Worker       "5.0                                                     46326.75   \n",
831*08b48e0bSAndroid Build Coastguard Worker       "6.0                                                     54595.48   \n",
832*08b48e0bSAndroid Build Coastguard Worker       "7.0                                                     62720.98   \n",
833*08b48e0bSAndroid Build Coastguard Worker       "8.0                                                     70777.99   \n",
834*08b48e0bSAndroid Build Coastguard Worker       "9.0                                                     74236.02   \n",
835*08b48e0bSAndroid Build Coastguard Worker       "10.0                                                    78134.94   \n",
836*08b48e0bSAndroid Build Coastguard Worker       "11.0                                                    81886.33   \n",
837*08b48e0bSAndroid Build Coastguard Worker       "12.0                                                    85923.44   \n",
838*08b48e0bSAndroid Build Coastguard Worker       "13.0                                                    89696.95   \n",
839*08b48e0bSAndroid Build Coastguard Worker       "14.0                                                    93540.52   \n",
840*08b48e0bSAndroid Build Coastguard Worker       "15.0                                                    97641.51   \n",
841*08b48e0bSAndroid Build Coastguard Worker       "16.0                                                   101692.65   \n",
842*08b48e0bSAndroid Build Coastguard Worker       "17.0                                                   101236.75   \n",
843*08b48e0bSAndroid Build Coastguard Worker       "18.0                                                   101006.28   \n",
844*08b48e0bSAndroid Build Coastguard Worker       "19.0                                                    99952.26   \n",
845*08b48e0bSAndroid Build Coastguard Worker       "20.0                                                    99798.64   \n",
846*08b48e0bSAndroid Build Coastguard Worker       "21.0                                                    99018.86   \n",
847*08b48e0bSAndroid Build Coastguard Worker       "22.0                                                    98600.87   \n",
848*08b48e0bSAndroid Build Coastguard Worker       "23.0                                                    98634.02   \n",
849*08b48e0bSAndroid Build Coastguard Worker       "24.0                                                    98352.90   \n",
850*08b48e0bSAndroid Build Coastguard Worker       "25.0                                                    98118.63   \n",
851*08b48e0bSAndroid Build Coastguard Worker       "26.0                                                    97752.45   \n",
852*08b48e0bSAndroid Build Coastguard Worker       "27.0                                                    97864.07   \n",
853*08b48e0bSAndroid Build Coastguard Worker       "28.0                                                    97821.80   \n",
854*08b48e0bSAndroid Build Coastguard Worker       "29.0                                                    97564.87   \n",
855*08b48e0bSAndroid Build Coastguard Worker       "30.0                                                    98508.10   \n",
856*08b48e0bSAndroid Build Coastguard Worker       "31.0                                                    98238.96   \n",
857*08b48e0bSAndroid Build Coastguard Worker       "32.0                                                    98363.93   \n",
858*08b48e0bSAndroid Build Coastguard Worker       "33.0                                                    96758.69   \n",
859*08b48e0bSAndroid Build Coastguard Worker       "34.0                                                    96327.00   \n",
860*08b48e0bSAndroid Build Coastguard Worker       "35.0                                                    95913.98   \n",
861*08b48e0bSAndroid Build Coastguard Worker       "36.0                                                    95871.39   \n",
862*08b48e0bSAndroid Build Coastguard Worker       "\n",
863*08b48e0bSAndroid Build Coastguard Worker       "label             Multicore: Persistent mode/shared memory + kernel config  \\\n",
864*08b48e0bSAndroid Build Coastguard Worker       "parallel_fuzzers                                                             \n",
865*08b48e0bSAndroid Build Coastguard Worker       "1.0                                                       120293.77          \n",
866*08b48e0bSAndroid Build Coastguard Worker       "2.0                                                       231429.96          \n",
867*08b48e0bSAndroid Build Coastguard Worker       "3.0                                                       346759.33          \n",
868*08b48e0bSAndroid Build Coastguard Worker       "4.0                                                       455340.06          \n",
869*08b48e0bSAndroid Build Coastguard Worker       "5.0                                                       568405.15          \n",
870*08b48e0bSAndroid Build Coastguard Worker       "6.0                                                       678030.96          \n",
871*08b48e0bSAndroid Build Coastguard Worker       "7.0                                                       782585.04          \n",
872*08b48e0bSAndroid Build Coastguard Worker       "8.0                                                       893618.35          \n",
873*08b48e0bSAndroid Build Coastguard Worker       "9.0                                                       956026.15          \n",
874*08b48e0bSAndroid Build Coastguard Worker       "10.0                                                      984942.13          \n",
875*08b48e0bSAndroid Build Coastguard Worker       "11.0                                                     1016758.62          \n",
876*08b48e0bSAndroid Build Coastguard Worker       "12.0                                                     1053087.90          \n",
877*08b48e0bSAndroid Build Coastguard Worker       "13.0                                                     1085797.87          \n",
878*08b48e0bSAndroid Build Coastguard Worker       "14.0                                                     1110640.20          \n",
879*08b48e0bSAndroid Build Coastguard Worker       "15.0                                                     1138984.22          \n",
880*08b48e0bSAndroid Build Coastguard Worker       "16.0                                                     1168943.19          \n",
881*08b48e0bSAndroid Build Coastguard Worker       "17.0                                                     1135093.91          \n",
882*08b48e0bSAndroid Build Coastguard Worker       "18.0                                                     1160430.45          \n",
883*08b48e0bSAndroid Build Coastguard Worker       "19.0                                                     1155769.97          \n",
884*08b48e0bSAndroid Build Coastguard Worker       "20.0                                                     1150156.26          \n",
885*08b48e0bSAndroid Build Coastguard Worker       "21.0                                                     1136873.58          \n",
886*08b48e0bSAndroid Build Coastguard Worker       "22.0                                                     1112404.25          \n",
887*08b48e0bSAndroid Build Coastguard Worker       "23.0                                                     1143131.72          \n",
888*08b48e0bSAndroid Build Coastguard Worker       "24.0                                                     1143931.38          \n",
889*08b48e0bSAndroid Build Coastguard Worker       "25.0                                                     1102090.61          \n",
890*08b48e0bSAndroid Build Coastguard Worker       "26.0                                                     1116518.70          \n",
891*08b48e0bSAndroid Build Coastguard Worker       "27.0                                                     1099224.19          \n",
892*08b48e0bSAndroid Build Coastguard Worker       "28.0                                                     1114945.37          \n",
893*08b48e0bSAndroid Build Coastguard Worker       "29.0                                                     1110889.91          \n",
894*08b48e0bSAndroid Build Coastguard Worker       "30.0                                                     1058548.28          \n",
895*08b48e0bSAndroid Build Coastguard Worker       "31.0                                                     1119804.85          \n",
896*08b48e0bSAndroid Build Coastguard Worker       "32.0                                                     1118828.99          \n",
897*08b48e0bSAndroid Build Coastguard Worker       "33.0                                                     1093426.61          \n",
898*08b48e0bSAndroid Build Coastguard Worker       "34.0                                                     1108123.59          \n",
899*08b48e0bSAndroid Build Coastguard Worker       "35.0                                                     1041486.52          \n",
900*08b48e0bSAndroid Build Coastguard Worker       "36.0                                                     1092395.61          \n",
901*08b48e0bSAndroid Build Coastguard Worker       "\n",
902*08b48e0bSAndroid Build Coastguard Worker       "label             Multicore: Persistent mode/shared memory without kernel config  \\\n",
903*08b48e0bSAndroid Build Coastguard Worker       "parallel_fuzzers                                                                   \n",
904*08b48e0bSAndroid Build Coastguard Worker       "1.0                                                        90641.62                \n",
905*08b48e0bSAndroid Build Coastguard Worker       "2.0                                                       178184.19                \n",
906*08b48e0bSAndroid Build Coastguard Worker       "3.0                                                       262652.86                \n",
907*08b48e0bSAndroid Build Coastguard Worker       "4.0                                                       339119.32                \n",
908*08b48e0bSAndroid Build Coastguard Worker       "5.0                                                       420239.94                \n",
909*08b48e0bSAndroid Build Coastguard Worker       "6.0                                                       498062.02                \n",
910*08b48e0bSAndroid Build Coastguard Worker       "7.0                                                       578495.44                \n",
911*08b48e0bSAndroid Build Coastguard Worker       "8.0                                                       661836.22                \n",
912*08b48e0bSAndroid Build Coastguard Worker       "9.0                                                       684808.49                \n",
913*08b48e0bSAndroid Build Coastguard Worker       "10.0                                                      707094.65                \n",
914*08b48e0bSAndroid Build Coastguard Worker       "11.0                                                      732106.17                \n",
915*08b48e0bSAndroid Build Coastguard Worker       "12.0                                                      752910.17                \n",
916*08b48e0bSAndroid Build Coastguard Worker       "13.0                                                      776179.85                \n",
917*08b48e0bSAndroid Build Coastguard Worker       "14.0                                                      797520.58                \n",
918*08b48e0bSAndroid Build Coastguard Worker       "15.0                                                      822235.41                \n",
919*08b48e0bSAndroid Build Coastguard Worker       "16.0                                                      843897.51                \n",
920*08b48e0bSAndroid Build Coastguard Worker       "17.0                                                      843177.15                \n",
921*08b48e0bSAndroid Build Coastguard Worker       "18.0                                                      844779.09                \n",
922*08b48e0bSAndroid Build Coastguard Worker       "19.0                                                      846060.74                \n",
923*08b48e0bSAndroid Build Coastguard Worker       "20.0                                                      847556.23                \n",
924*08b48e0bSAndroid Build Coastguard Worker       "21.0                                                      844022.97                \n",
925*08b48e0bSAndroid Build Coastguard Worker       "22.0                                                      845818.70                \n",
926*08b48e0bSAndroid Build Coastguard Worker       "23.0                                                      844118.27                \n",
927*08b48e0bSAndroid Build Coastguard Worker       "24.0                                                      837189.02                \n",
928*08b48e0bSAndroid Build Coastguard Worker       "25.0                                                      834712.31                \n",
929*08b48e0bSAndroid Build Coastguard Worker       "26.0                                                      836344.12                \n",
930*08b48e0bSAndroid Build Coastguard Worker       "27.0                                                      827784.91                \n",
931*08b48e0bSAndroid Build Coastguard Worker       "28.0                                                      828641.27                \n",
932*08b48e0bSAndroid Build Coastguard Worker       "29.0                                                      826123.67                \n",
933*08b48e0bSAndroid Build Coastguard Worker       "30.0                                                      817765.77                \n",
934*08b48e0bSAndroid Build Coastguard Worker       "31.0                                                      816556.66                \n",
935*08b48e0bSAndroid Build Coastguard Worker       "32.0                                                      812661.77                \n",
936*08b48e0bSAndroid Build Coastguard Worker       "33.0                                                      805352.16                \n",
937*08b48e0bSAndroid Build Coastguard Worker       "34.0                                                      815888.26                \n",
938*08b48e0bSAndroid Build Coastguard Worker       "35.0                                                      812348.56                \n",
939*08b48e0bSAndroid Build Coastguard Worker       "36.0                                                      817278.03                \n",
940*08b48e0bSAndroid Build Coastguard Worker       "\n",
941*08b48e0bSAndroid Build Coastguard Worker       "label             Singlecore: Non-persistent mode + kernel config  \\\n",
942*08b48e0bSAndroid Build Coastguard Worker       "parallel_fuzzers                                                    \n",
943*08b48e0bSAndroid Build Coastguard Worker       "1.0                                                       9845.64   \n",
944*08b48e0bSAndroid Build Coastguard Worker       "2.0                                                       9845.64   \n",
945*08b48e0bSAndroid Build Coastguard Worker       "3.0                                                       9845.64   \n",
946*08b48e0bSAndroid Build Coastguard Worker       "4.0                                                       9845.64   \n",
947*08b48e0bSAndroid Build Coastguard Worker       "5.0                                                       9845.64   \n",
948*08b48e0bSAndroid Build Coastguard Worker       "6.0                                                       9845.64   \n",
949*08b48e0bSAndroid Build Coastguard Worker       "7.0                                                       9845.64   \n",
950*08b48e0bSAndroid Build Coastguard Worker       "8.0                                                       9845.64   \n",
951*08b48e0bSAndroid Build Coastguard Worker       "9.0                                                       9845.64   \n",
952*08b48e0bSAndroid Build Coastguard Worker       "10.0                                                      9845.64   \n",
953*08b48e0bSAndroid Build Coastguard Worker       "11.0                                                      9845.64   \n",
954*08b48e0bSAndroid Build Coastguard Worker       "12.0                                                      9845.64   \n",
955*08b48e0bSAndroid Build Coastguard Worker       "13.0                                                      9845.64   \n",
956*08b48e0bSAndroid Build Coastguard Worker       "14.0                                                      9845.64   \n",
957*08b48e0bSAndroid Build Coastguard Worker       "15.0                                                      9845.64   \n",
958*08b48e0bSAndroid Build Coastguard Worker       "16.0                                                      9845.64   \n",
959*08b48e0bSAndroid Build Coastguard Worker       "17.0                                                      9845.64   \n",
960*08b48e0bSAndroid Build Coastguard Worker       "18.0                                                      9845.64   \n",
961*08b48e0bSAndroid Build Coastguard Worker       "19.0                                                      9845.64   \n",
962*08b48e0bSAndroid Build Coastguard Worker       "20.0                                                      9845.64   \n",
963*08b48e0bSAndroid Build Coastguard Worker       "21.0                                                      9845.64   \n",
964*08b48e0bSAndroid Build Coastguard Worker       "22.0                                                      9845.64   \n",
965*08b48e0bSAndroid Build Coastguard Worker       "23.0                                                      9845.64   \n",
966*08b48e0bSAndroid Build Coastguard Worker       "24.0                                                      9845.64   \n",
967*08b48e0bSAndroid Build Coastguard Worker       "25.0                                                      9845.64   \n",
968*08b48e0bSAndroid Build Coastguard Worker       "26.0                                                      9845.64   \n",
969*08b48e0bSAndroid Build Coastguard Worker       "27.0                                                      9845.64   \n",
970*08b48e0bSAndroid Build Coastguard Worker       "28.0                                                      9845.64   \n",
971*08b48e0bSAndroid Build Coastguard Worker       "29.0                                                      9845.64   \n",
972*08b48e0bSAndroid Build Coastguard Worker       "30.0                                                      9845.64   \n",
973*08b48e0bSAndroid Build Coastguard Worker       "31.0                                                      9845.64   \n",
974*08b48e0bSAndroid Build Coastguard Worker       "32.0                                                      9845.64   \n",
975*08b48e0bSAndroid Build Coastguard Worker       "33.0                                                      9845.64   \n",
976*08b48e0bSAndroid Build Coastguard Worker       "34.0                                                      9845.64   \n",
977*08b48e0bSAndroid Build Coastguard Worker       "35.0                                                      9845.64   \n",
978*08b48e0bSAndroid Build Coastguard Worker       "36.0                                                      9845.64   \n",
979*08b48e0bSAndroid Build Coastguard Worker       "\n",
980*08b48e0bSAndroid Build Coastguard Worker       "label             Singlecore: Persistent mode/shared memory + kernel config  \n",
981*08b48e0bSAndroid Build Coastguard Worker       "parallel_fuzzers                                                             \n",
982*08b48e0bSAndroid Build Coastguard Worker       "1.0                                                       125682.73          \n",
983*08b48e0bSAndroid Build Coastguard Worker       "2.0                                                       125682.73          \n",
984*08b48e0bSAndroid Build Coastguard Worker       "3.0                                                       125682.73          \n",
985*08b48e0bSAndroid Build Coastguard Worker       "4.0                                                       125682.73          \n",
986*08b48e0bSAndroid Build Coastguard Worker       "5.0                                                       125682.73          \n",
987*08b48e0bSAndroid Build Coastguard Worker       "6.0                                                       125682.73          \n",
988*08b48e0bSAndroid Build Coastguard Worker       "7.0                                                       125682.73          \n",
989*08b48e0bSAndroid Build Coastguard Worker       "8.0                                                       125682.73          \n",
990*08b48e0bSAndroid Build Coastguard Worker       "9.0                                                       125682.73          \n",
991*08b48e0bSAndroid Build Coastguard Worker       "10.0                                                      125682.73          \n",
992*08b48e0bSAndroid Build Coastguard Worker       "11.0                                                      125682.73          \n",
993*08b48e0bSAndroid Build Coastguard Worker       "12.0                                                      125682.73          \n",
994*08b48e0bSAndroid Build Coastguard Worker       "13.0                                                      125682.73          \n",
995*08b48e0bSAndroid Build Coastguard Worker       "14.0                                                      125682.73          \n",
996*08b48e0bSAndroid Build Coastguard Worker       "15.0                                                      125682.73          \n",
997*08b48e0bSAndroid Build Coastguard Worker       "16.0                                                      125682.73          \n",
998*08b48e0bSAndroid Build Coastguard Worker       "17.0                                                      125682.73          \n",
999*08b48e0bSAndroid Build Coastguard Worker       "18.0                                                      125682.73          \n",
1000*08b48e0bSAndroid Build Coastguard Worker       "19.0                                                      125682.73          \n",
1001*08b48e0bSAndroid Build Coastguard Worker       "20.0                                                      125682.73          \n",
1002*08b48e0bSAndroid Build Coastguard Worker       "21.0                                                      125682.73          \n",
1003*08b48e0bSAndroid Build Coastguard Worker       "22.0                                                      125682.73          \n",
1004*08b48e0bSAndroid Build Coastguard Worker       "23.0                                                      125682.73          \n",
1005*08b48e0bSAndroid Build Coastguard Worker       "24.0                                                      125682.73          \n",
1006*08b48e0bSAndroid Build Coastguard Worker       "25.0                                                      125682.73          \n",
1007*08b48e0bSAndroid Build Coastguard Worker       "26.0                                                      125682.73          \n",
1008*08b48e0bSAndroid Build Coastguard Worker       "27.0                                                      125682.73          \n",
1009*08b48e0bSAndroid Build Coastguard Worker       "28.0                                                      125682.73          \n",
1010*08b48e0bSAndroid Build Coastguard Worker       "29.0                                                      125682.73          \n",
1011*08b48e0bSAndroid Build Coastguard Worker       "30.0                                                      125682.73          \n",
1012*08b48e0bSAndroid Build Coastguard Worker       "31.0                                                      125682.73          \n",
1013*08b48e0bSAndroid Build Coastguard Worker       "32.0                                                      125682.73          \n",
1014*08b48e0bSAndroid Build Coastguard Worker       "33.0                                                      125682.73          \n",
1015*08b48e0bSAndroid Build Coastguard Worker       "34.0                                                      125682.73          \n",
1016*08b48e0bSAndroid Build Coastguard Worker       "35.0                                                      125682.73          \n",
1017*08b48e0bSAndroid Build Coastguard Worker       "36.0                                                      125682.73          "
1018*08b48e0bSAndroid Build Coastguard Worker      ]
1019*08b48e0bSAndroid Build Coastguard Worker     },
1020*08b48e0bSAndroid Build Coastguard Worker     "execution_count": 148,
1021*08b48e0bSAndroid Build Coastguard Worker     "metadata": {},
1022*08b48e0bSAndroid Build Coastguard Worker     "output_type": "execute_result"
1023*08b48e0bSAndroid Build Coastguard Worker    }
1024*08b48e0bSAndroid Build Coastguard Worker   ],
1025*08b48e0bSAndroid Build Coastguard Worker   "source": [
1026*08b48e0bSAndroid Build Coastguard Worker    "pivotdf"
1027*08b48e0bSAndroid Build Coastguard Worker   ]
1028*08b48e0bSAndroid Build Coastguard Worker  },
1029*08b48e0bSAndroid Build Coastguard Worker  {
1030*08b48e0bSAndroid Build Coastguard Worker   "cell_type": "markdown",
1031*08b48e0bSAndroid Build Coastguard Worker   "metadata": {},
1032*08b48e0bSAndroid Build Coastguard Worker   "source": [
1033*08b48e0bSAndroid Build Coastguard Worker    "You can totally ignore the code cell directly below (unless you're curious).  It's just preparing Markdown for the block below it to render.  Jupyter Notebooks aren't able to use code variables inside Markdown blocks, so I have to do this instead."
1034*08b48e0bSAndroid Build Coastguard Worker   ]
1035*08b48e0bSAndroid Build Coastguard Worker  },
1036*08b48e0bSAndroid Build Coastguard Worker  {
1037*08b48e0bSAndroid Build Coastguard Worker   "cell_type": "code",
1038*08b48e0bSAndroid Build Coastguard Worker   "execution_count": 149,
1039*08b48e0bSAndroid Build Coastguard Worker   "metadata": {},
1040*08b48e0bSAndroid Build Coastguard Worker   "outputs": [
1041*08b48e0bSAndroid Build Coastguard Worker    {
1042*08b48e0bSAndroid Build Coastguard Worker     "data": {
1043*08b48e0bSAndroid Build Coastguard Worker      "text/markdown": [
1044*08b48e0bSAndroid Build Coastguard Worker       "\n",
1045*08b48e0bSAndroid Build Coastguard Worker       "### Line graph analysis\n",
1046*08b48e0bSAndroid Build Coastguard Worker       "Here are a few things that jump out from the graph above.  Let's start at the bottom of the graph.\n",
1047*08b48e0bSAndroid Build Coastguard Worker       "\n",
1048*08b48e0bSAndroid Build Coastguard Worker       "#### test-instr vs. test-instr-persist-shmem\n",
1049*08b48e0bSAndroid Build Coastguard Worker       "\n",
1050*08b48e0bSAndroid Build Coastguard Worker       "This graph is scaled so that the single-core, non-persistent-mode performance (9845 execs per second) is\n",
1051*08b48e0bSAndroid Build Coastguard Worker       "represented as **1.0x**.  If you build and run a fuzzer without creating a persistent mode harness for it, and without running fuzzers in parallel, this is the performance\n",
1052*08b48e0bSAndroid Build Coastguard Worker       "you get on this machine.\n",
1053*08b48e0bSAndroid Build Coastguard Worker       "\n",
1054*08b48e0bSAndroid Build Coastguard Worker       "#### Multicore test-instr\n",
1055*08b48e0bSAndroid Build Coastguard Worker       "\n",
1056*08b48e0bSAndroid Build Coastguard Worker       "By running as many parallel fuzzers are there are CPU threads, we can reach 101692 execs per second, which is **10.3x** that base speed.\n",
1057*08b48e0bSAndroid Build Coastguard Worker       "\n",
1058*08b48e0bSAndroid Build Coastguard Worker       "#### Persistent mode + shared memory\n",
1059*08b48e0bSAndroid Build Coastguard Worker       "\n",
1060*08b48e0bSAndroid Build Coastguard Worker       "##### Singlecore\n",
1061*08b48e0bSAndroid Build Coastguard Worker       "\n",
1062*08b48e0bSAndroid Build Coastguard Worker       "By modifying the harness to use persistent mode with shared memory as described [here](https://github.com/AFLplusplus/AFLplusplus/blob/stable/instrumentation/README.persistent_mode.md#4-persistent-mode),\n",
1063*08b48e0bSAndroid Build Coastguard Worker       "we end up with **12.8x** base speed.  So -- perhaps counter-intuively -- if you have a choice between switching to using multiple cores or rewriting\n",
1064*08b48e0bSAndroid Build Coastguard Worker       "the harness to use persistent mode on a single core, it is better (at least on this machine) to use persistent mode on a single core, than to use non-persistent mode on all cores.\n",
1065*08b48e0bSAndroid Build Coastguard Worker       "\n",
1066*08b48e0bSAndroid Build Coastguard Worker       "##### Multicore\n",
1067*08b48e0bSAndroid Build Coastguard Worker       "\n",
1068*08b48e0bSAndroid Build Coastguard Worker       "By scaling up that persistent mode with shared memory harness across cores, and with kernel mitigations still turned on (see next section), we get to\n",
1069*08b48e0bSAndroid Build Coastguard Worker       "**86.1x** base speed.\n",
1070*08b48e0bSAndroid Build Coastguard Worker       "\n",
1071*08b48e0bSAndroid Build Coastguard Worker       "#### Kernel config\n",
1072*08b48e0bSAndroid Build Coastguard Worker       "\n",
1073*08b48e0bSAndroid Build Coastguard Worker       "By \"kernel config\", I'm referring to booting the Linux kernel with `mitigations=off`, which is a meta-parameter for disabling *all* hardware vulnerability meltdowns (such as Spectre,\n",
1074*08b48e0bSAndroid Build Coastguard Worker       "Meltdown, Retbleed, etc) introduced in Linux v5.2.  Disabling these results in a `execs_per_sec` increase of 321386 execs -- the difference between\n",
1075*08b48e0bSAndroid Build Coastguard Worker       "118.7x (mitigations off) and 86.1x (mitigations on) base speed.  Turning on mitigations\n",
1076*08b48e0bSAndroid Build Coastguard Worker       "reduced the overall performance by 27%!\n",
1077*08b48e0bSAndroid Build Coastguard Worker       "\n",
1078*08b48e0bSAndroid Build Coastguard Worker       "One way to think about this is that the mitigations turn this 16-thread CPU into a 7-thread CPU, since the number of execs reached with 16 threads and mitigations on is around the same\n",
1079*08b48e0bSAndroid Build Coastguard Worker       "number of execs reached with 7 threads and mitigations off.\n",
1080*08b48e0bSAndroid Build Coastguard Worker       "\n",
1081*08b48e0bSAndroid Build Coastguard Worker       "Or if we want to think in terms of cores, then the average number of execs gained per core in the initial eight is 110474 execs per sec, but the loss due to\n",
1082*08b48e0bSAndroid Build Coastguard Worker       "mitigations is 321386 execs per sec, which is the averaged performance of 2.9 cores.\n",
1083*08b48e0bSAndroid Build Coastguard Worker       "\n",
1084*08b48e0bSAndroid Build Coastguard Worker       "With kernel mitigations turned off, we reach our highest available execs_per_sec speed on this machine, which is **118.7x** higher\n",
1085*08b48e0bSAndroid Build Coastguard Worker       "than where we started from.\n",
1086*08b48e0bSAndroid Build Coastguard Worker       "\n",
1087*08b48e0bSAndroid Build Coastguard Worker       "#### How many parallel fuzzers should we use on this machine?\n",
1088*08b48e0bSAndroid Build Coastguard Worker       "\n",
1089*08b48e0bSAndroid Build Coastguard Worker       "* Using >16 is worse than using 16.  Makes sense.\n",
1090*08b48e0bSAndroid Build Coastguard Worker       "* So, we should use the number of CPUs in /proc/cpuinfo (threads) to get the best performance.  But if we did halve the number of\n",
1091*08b48e0bSAndroid Build Coastguard Worker       "  fuzzers, we would surprisingly only lose 23%\n",
1092*08b48e0bSAndroid Build Coastguard Worker       "  of performance.  This could be a good tradeoff in terms of cost.\n"
1093*08b48e0bSAndroid Build Coastguard Worker      ],
1094*08b48e0bSAndroid Build Coastguard Worker      "text/plain": [
1095*08b48e0bSAndroid Build Coastguard Worker       "<IPython.core.display.Markdown object>"
1096*08b48e0bSAndroid Build Coastguard Worker      ]
1097*08b48e0bSAndroid Build Coastguard Worker     },
1098*08b48e0bSAndroid Build Coastguard Worker     "execution_count": 149,
1099*08b48e0bSAndroid Build Coastguard Worker     "metadata": {},
1100*08b48e0bSAndroid Build Coastguard Worker     "output_type": "execute_result"
1101*08b48e0bSAndroid Build Coastguard Worker    }
1102*08b48e0bSAndroid Build Coastguard Worker   ],
1103*08b48e0bSAndroid Build Coastguard Worker   "source": [
1104*08b48e0bSAndroid Build Coastguard Worker    "# (You can ignore reading this code cell.)\n",
1105*08b48e0bSAndroid Build Coastguard Worker    "from IPython.display import Markdown as md\n",
1106*08b48e0bSAndroid Build Coastguard Worker    "singlecore_base_execs = pivotdf.iloc[0][\"Singlecore: Non-persistent mode + kernel config\"]\n",
1107*08b48e0bSAndroid Build Coastguard Worker    "singlecore_persist_execs = pivotdf.iloc[0][\"Singlecore: Persistent mode/shared memory + kernel config\"]\n",
1108*08b48e0bSAndroid Build Coastguard Worker    "multicore_fuzzers_max_execs = int(pivotdf[\"Multicore: Persistent mode/shared memory + kernel config\"].idxmax())\n",
1109*08b48e0bSAndroid Build Coastguard Worker    "multicore_base_max_execs = pivotdf[\"Multicore: Non-persistent mode + kernel config\"].max()\n",
1110*08b48e0bSAndroid Build Coastguard Worker    "factor_for_execs = lambda execs: round(execs / singlecore_base_execs, 1)\n",
1111*08b48e0bSAndroid Build Coastguard Worker    "\n",
1112*08b48e0bSAndroid Build Coastguard Worker    "multicore_persistent_without_mitigations_label = \"Multicore: Persistent mode/shared memory + kernel config\"\n",
1113*08b48e0bSAndroid Build Coastguard Worker    "multicore_max_execs_mitigations_off = pivotdf[multicore_persistent_without_mitigations_label].max()\n",
1114*08b48e0bSAndroid Build Coastguard Worker    "multicore_max_execs_mitigations_off_only_cores = pivotdf.loc[multicore_fuzzers_max_execs / 2][multicore_persistent_without_mitigations_label]\n",
1115*08b48e0bSAndroid Build Coastguard Worker    "multicore_max_execs_mitigations_on = pivotdf[\"Multicore: Persistent mode/shared memory without kernel config\"].max()\n",
1116*08b48e0bSAndroid Build Coastguard Worker    "multicore_avg_gain_per_core = pivotdf.loc[pivotdf.index <= 8][\"Multicore: Persistent mode/shared memory + kernel config\"].diff().dropna().mean()\n",
1117*08b48e0bSAndroid Build Coastguard Worker    "mitigations_off_increase = int(multicore_max_execs_mitigations_off - multicore_max_execs_mitigations_on)\n",
1118*08b48e0bSAndroid Build Coastguard Worker    "\n",
1119*08b48e0bSAndroid Build Coastguard Worker    "md(f\"\"\"\n",
1120*08b48e0bSAndroid Build Coastguard Worker    "### Line graph analysis\n",
1121*08b48e0bSAndroid Build Coastguard Worker    "Here are a few things that jump out from the graph above.  Let's start at the bottom of the graph.\n",
1122*08b48e0bSAndroid Build Coastguard Worker    "\n",
1123*08b48e0bSAndroid Build Coastguard Worker    "#### test-instr vs. test-instr-persist-shmem\n",
1124*08b48e0bSAndroid Build Coastguard Worker    "\n",
1125*08b48e0bSAndroid Build Coastguard Worker    "This graph is scaled so that the single-core, non-persistent-mode performance ({int(singlecore_base_execs)} execs per second) is\n",
1126*08b48e0bSAndroid Build Coastguard Worker    "represented as **1.0x**.  If you build and run a fuzzer without creating a persistent mode harness for it, and without running fuzzers in parallel, this is the performance\n",
1127*08b48e0bSAndroid Build Coastguard Worker    "you get on this machine.\n",
1128*08b48e0bSAndroid Build Coastguard Worker    "\n",
1129*08b48e0bSAndroid Build Coastguard Worker    "#### Multicore test-instr\n",
1130*08b48e0bSAndroid Build Coastguard Worker    "\n",
1131*08b48e0bSAndroid Build Coastguard Worker    "By running as many parallel fuzzers are there are CPU threads, we can reach {int(multicore_base_max_execs)} execs per second, which is **{factor_for_execs(multicore_base_max_execs)}x** that base speed.\n",
1132*08b48e0bSAndroid Build Coastguard Worker    "\n",
1133*08b48e0bSAndroid Build Coastguard Worker    "#### Persistent mode + shared memory\n",
1134*08b48e0bSAndroid Build Coastguard Worker    "\n",
1135*08b48e0bSAndroid Build Coastguard Worker    "##### Singlecore\n",
1136*08b48e0bSAndroid Build Coastguard Worker    "\n",
1137*08b48e0bSAndroid Build Coastguard Worker    "By modifying the harness to use persistent mode with shared memory as described [here](https://github.com/AFLplusplus/AFLplusplus/blob/stable/instrumentation/README.persistent_mode.md#4-persistent-mode),\n",
1138*08b48e0bSAndroid Build Coastguard Worker    "we end up with **{factor_for_execs(singlecore_persist_execs)}x** base speed.  So -- perhaps counter-intuively -- if you have a choice between switching to using multiple cores or rewriting\n",
1139*08b48e0bSAndroid Build Coastguard Worker    "the harness to use persistent mode on a single core, it is better (at least on this machine) to use persistent mode on a single core, than to use non-persistent mode on all cores.\n",
1140*08b48e0bSAndroid Build Coastguard Worker    "\n",
1141*08b48e0bSAndroid Build Coastguard Worker    "##### Multicore\n",
1142*08b48e0bSAndroid Build Coastguard Worker    "\n",
1143*08b48e0bSAndroid Build Coastguard Worker    "By scaling up that persistent mode with shared memory harness across cores, and with kernel mitigations still turned on (see next section), we get to\n",
1144*08b48e0bSAndroid Build Coastguard Worker    "**{factor_for_execs(multicore_max_execs_mitigations_on)}x** base speed.\n",
1145*08b48e0bSAndroid Build Coastguard Worker    "\n",
1146*08b48e0bSAndroid Build Coastguard Worker    "#### Kernel config\n",
1147*08b48e0bSAndroid Build Coastguard Worker    "\n",
1148*08b48e0bSAndroid Build Coastguard Worker    "By \"kernel config\", I'm referring to booting the Linux kernel with `mitigations=off`, which is a meta-parameter for disabling *all* hardware vulnerability meltdowns (such as Spectre,\n",
1149*08b48e0bSAndroid Build Coastguard Worker    "Meltdown, Retbleed, etc) introduced in Linux v5.2.  Disabling these results in a `execs_per_sec` increase of {mitigations_off_increase} execs -- the difference between\n",
1150*08b48e0bSAndroid Build Coastguard Worker    "{factor_for_execs(multicore_max_execs_mitigations_off)}x (mitigations off) and {factor_for_execs(multicore_max_execs_mitigations_on)}x (mitigations on) base speed.  Turning on mitigations\n",
1151*08b48e0bSAndroid Build Coastguard Worker    "reduced the overall performance by {abs(round(((multicore_max_execs_mitigations_on - multicore_max_execs_mitigations_off) / multicore_max_execs_mitigations_off) * 100))}%!\n",
1152*08b48e0bSAndroid Build Coastguard Worker    "\n",
1153*08b48e0bSAndroid Build Coastguard Worker    "One way to think about this is that the mitigations turn this 16-thread CPU into a 7-thread CPU, since the number of execs reached with 16 threads and mitigations on is around the same\n",
1154*08b48e0bSAndroid Build Coastguard Worker    "number of execs reached with 7 threads and mitigations off.\n",
1155*08b48e0bSAndroid Build Coastguard Worker    "\n",
1156*08b48e0bSAndroid Build Coastguard Worker    "Or if we want to think in terms of cores, then the average number of execs gained per core in the initial eight is {int(multicore_avg_gain_per_core)} execs per sec, but the loss due to\n",
1157*08b48e0bSAndroid Build Coastguard Worker    "mitigations is {mitigations_off_increase} execs per sec, which is the averaged performance of {round(mitigations_off_increase / multicore_avg_gain_per_core, 1)} cores.\n",
1158*08b48e0bSAndroid Build Coastguard Worker    "\n",
1159*08b48e0bSAndroid Build Coastguard Worker    "With kernel mitigations turned off, we reach our highest available execs_per_sec speed on this machine, which is **{factor_for_execs(multicore_max_execs_mitigations_off)}x** higher\n",
1160*08b48e0bSAndroid Build Coastguard Worker    "than where we started from.\n",
1161*08b48e0bSAndroid Build Coastguard Worker    "\n",
1162*08b48e0bSAndroid Build Coastguard Worker    "#### How many parallel fuzzers should we use on this machine?\n",
1163*08b48e0bSAndroid Build Coastguard Worker    "\n",
1164*08b48e0bSAndroid Build Coastguard Worker    "* Using >16 is worse than using 16.  Makes sense.\n",
1165*08b48e0bSAndroid Build Coastguard Worker    "* So, we should use the number of CPUs in /proc/cpuinfo (threads) to get the best performance.  But if we did halve the number of\n",
1166*08b48e0bSAndroid Build Coastguard Worker    "  fuzzers, we would surprisingly only lose {abs(int(((multicore_max_execs_mitigations_off_only_cores - multicore_max_execs_mitigations_off) / multicore_max_execs_mitigations_off) * 100))}%\n",
1167*08b48e0bSAndroid Build Coastguard Worker    "  of performance.  This could be a good tradeoff in terms of cost.\n",
1168*08b48e0bSAndroid Build Coastguard Worker    "\"\"\")\n"
1169*08b48e0bSAndroid Build Coastguard Worker   ]
1170*08b48e0bSAndroid Build Coastguard Worker  },
1171*08b48e0bSAndroid Build Coastguard Worker  {
1172*08b48e0bSAndroid Build Coastguard Worker   "cell_type": "markdown",
1173*08b48e0bSAndroid Build Coastguard Worker   "metadata": {},
1174*08b48e0bSAndroid Build Coastguard Worker   "source": [
1175*08b48e0bSAndroid Build Coastguard Worker    "### Example with more cores\n",
1176*08b48e0bSAndroid Build Coastguard Worker    "\n",
1177*08b48e0bSAndroid Build Coastguard Worker    "While there was some nuance here, the answer was pretty straightforward -- use the number of CPU threads you have access to.  What if there were more threads?  Here the experiment is repeated on an AWS EC2 \"r6a.48xlarge\" spot instance with 192 vCPUs:"
1178*08b48e0bSAndroid Build Coastguard Worker   ]
1179*08b48e0bSAndroid Build Coastguard Worker  },
1180*08b48e0bSAndroid Build Coastguard Worker  {
1181*08b48e0bSAndroid Build Coastguard Worker   "cell_type": "code",
1182*08b48e0bSAndroid Build Coastguard Worker   "execution_count": 150,
1183*08b48e0bSAndroid Build Coastguard Worker   "metadata": {},
1184*08b48e0bSAndroid Build Coastguard Worker   "outputs": [
1185*08b48e0bSAndroid Build Coastguard Worker    {
1186*08b48e0bSAndroid Build Coastguard Worker     "data": {
1187*08b48e0bSAndroid Build Coastguard Worker      "text/html": [
1188*08b48e0bSAndroid Build Coastguard Worker       "<div>\n",
1189*08b48e0bSAndroid Build Coastguard Worker       "<style scoped>\n",
1190*08b48e0bSAndroid Build Coastguard Worker       "    .dataframe tbody tr th:only-of-type {\n",
1191*08b48e0bSAndroid Build Coastguard Worker       "        vertical-align: middle;\n",
1192*08b48e0bSAndroid Build Coastguard Worker       "    }\n",
1193*08b48e0bSAndroid Build Coastguard Worker       "\n",
1194*08b48e0bSAndroid Build Coastguard Worker       "    .dataframe tbody tr th {\n",
1195*08b48e0bSAndroid Build Coastguard Worker       "        vertical-align: top;\n",
1196*08b48e0bSAndroid Build Coastguard Worker       "    }\n",
1197*08b48e0bSAndroid Build Coastguard Worker       "\n",
1198*08b48e0bSAndroid Build Coastguard Worker       "    .dataframe thead th {\n",
1199*08b48e0bSAndroid Build Coastguard Worker       "        text-align: right;\n",
1200*08b48e0bSAndroid Build Coastguard Worker       "    }\n",
1201*08b48e0bSAndroid Build Coastguard Worker       "</style>\n",
1202*08b48e0bSAndroid Build Coastguard Worker       "<table border=\"1\" class=\"dataframe\">\n",
1203*08b48e0bSAndroid Build Coastguard Worker       "  <thead>\n",
1204*08b48e0bSAndroid Build Coastguard Worker       "    <tr style=\"text-align: right;\">\n",
1205*08b48e0bSAndroid Build Coastguard Worker       "      <th></th>\n",
1206*08b48e0bSAndroid Build Coastguard Worker       "      <th>config.afl_persistent_config</th>\n",
1207*08b48e0bSAndroid Build Coastguard Worker       "      <th>config.afl_system_config</th>\n",
1208*08b48e0bSAndroid Build Coastguard Worker       "      <th>config.afl_version</th>\n",
1209*08b48e0bSAndroid Build Coastguard Worker       "      <th>config.comment</th>\n",
1210*08b48e0bSAndroid Build Coastguard Worker       "      <th>config.compiler</th>\n",
1211*08b48e0bSAndroid Build Coastguard Worker       "      <th>config.target_arch</th>\n",
1212*08b48e0bSAndroid Build Coastguard Worker       "      <th>hardware.cpu_fastest_core_mhz</th>\n",
1213*08b48e0bSAndroid Build Coastguard Worker       "      <th>hardware.cpu_model</th>\n",
1214*08b48e0bSAndroid Build Coastguard Worker       "      <th>hardware.cpu_threads</th>\n",
1215*08b48e0bSAndroid Build Coastguard Worker       "      <th>targets.test-instr-persist-shmem.multicore.execs_per_sec</th>\n",
1216*08b48e0bSAndroid Build Coastguard Worker       "      <th>targets.test-instr-persist-shmem.multicore.execs_total</th>\n",
1217*08b48e0bSAndroid Build Coastguard Worker       "      <th>targets.test-instr-persist-shmem.multicore.fuzzers_used</th>\n",
1218*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
1219*08b48e0bSAndroid Build Coastguard Worker       "  </thead>\n",
1220*08b48e0bSAndroid Build Coastguard Worker       "  <tbody>\n",
1221*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
1222*08b48e0bSAndroid Build Coastguard Worker       "      <th>223</th>\n",
1223*08b48e0bSAndroid Build Coastguard Worker       "      <td>True</td>\n",
1224*08b48e0bSAndroid Build Coastguard Worker       "      <td>True</td>\n",
1225*08b48e0bSAndroid Build Coastguard Worker       "      <td>++4.09a</td>\n",
1226*08b48e0bSAndroid Build Coastguard Worker       "      <td>AWS EC2 r6a.48xlarge spot instance</td>\n",
1227*08b48e0bSAndroid Build Coastguard Worker       "      <td>clang version 15.0.7 (Amazon Linux 15.0.7-3.am...</td>\n",
1228*08b48e0bSAndroid Build Coastguard Worker       "      <td>x86_64-amazon-linux-gnu</td>\n",
1229*08b48e0bSAndroid Build Coastguard Worker       "      <td>3514.326</td>\n",
1230*08b48e0bSAndroid Build Coastguard Worker       "      <td>AMD EPYC 7R13 Processor</td>\n",
1231*08b48e0bSAndroid Build Coastguard Worker       "      <td>192</td>\n",
1232*08b48e0bSAndroid Build Coastguard Worker       "      <td>119469.35</td>\n",
1233*08b48e0bSAndroid Build Coastguard Worker       "      <td>1194813.0</td>\n",
1234*08b48e0bSAndroid Build Coastguard Worker       "      <td>1.0</td>\n",
1235*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
1236*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
1237*08b48e0bSAndroid Build Coastguard Worker       "      <th>224</th>\n",
1238*08b48e0bSAndroid Build Coastguard Worker       "      <td>True</td>\n",
1239*08b48e0bSAndroid Build Coastguard Worker       "      <td>True</td>\n",
1240*08b48e0bSAndroid Build Coastguard Worker       "      <td>++4.09a</td>\n",
1241*08b48e0bSAndroid Build Coastguard Worker       "      <td>AWS EC2 r6a.48xlarge spot instance</td>\n",
1242*08b48e0bSAndroid Build Coastguard Worker       "      <td>clang version 15.0.7 (Amazon Linux 15.0.7-3.am...</td>\n",
1243*08b48e0bSAndroid Build Coastguard Worker       "      <td>x86_64-amazon-linux-gnu</td>\n",
1244*08b48e0bSAndroid Build Coastguard Worker       "      <td>3599.748</td>\n",
1245*08b48e0bSAndroid Build Coastguard Worker       "      <td>AMD EPYC 7R13 Processor</td>\n",
1246*08b48e0bSAndroid Build Coastguard Worker       "      <td>192</td>\n",
1247*08b48e0bSAndroid Build Coastguard Worker       "      <td>237177.20</td>\n",
1248*08b48e0bSAndroid Build Coastguard Worker       "      <td>2372250.0</td>\n",
1249*08b48e0bSAndroid Build Coastguard Worker       "      <td>2.0</td>\n",
1250*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
1251*08b48e0bSAndroid Build Coastguard Worker       "  </tbody>\n",
1252*08b48e0bSAndroid Build Coastguard Worker       "</table>\n",
1253*08b48e0bSAndroid Build Coastguard Worker       "</div>"
1254*08b48e0bSAndroid Build Coastguard Worker      ],
1255*08b48e0bSAndroid Build Coastguard Worker      "text/plain": [
1256*08b48e0bSAndroid Build Coastguard Worker       "     config.afl_persistent_config  config.afl_system_config  \\\n",
1257*08b48e0bSAndroid Build Coastguard Worker       "223                          True                      True   \n",
1258*08b48e0bSAndroid Build Coastguard Worker       "224                          True                      True   \n",
1259*08b48e0bSAndroid Build Coastguard Worker       "\n",
1260*08b48e0bSAndroid Build Coastguard Worker       "    config.afl_version                      config.comment  \\\n",
1261*08b48e0bSAndroid Build Coastguard Worker       "223            ++4.09a  AWS EC2 r6a.48xlarge spot instance   \n",
1262*08b48e0bSAndroid Build Coastguard Worker       "224            ++4.09a  AWS EC2 r6a.48xlarge spot instance   \n",
1263*08b48e0bSAndroid Build Coastguard Worker       "\n",
1264*08b48e0bSAndroid Build Coastguard Worker       "                                       config.compiler  \\\n",
1265*08b48e0bSAndroid Build Coastguard Worker       "223  clang version 15.0.7 (Amazon Linux 15.0.7-3.am...   \n",
1266*08b48e0bSAndroid Build Coastguard Worker       "224  clang version 15.0.7 (Amazon Linux 15.0.7-3.am...   \n",
1267*08b48e0bSAndroid Build Coastguard Worker       "\n",
1268*08b48e0bSAndroid Build Coastguard Worker       "          config.target_arch  hardware.cpu_fastest_core_mhz  \\\n",
1269*08b48e0bSAndroid Build Coastguard Worker       "223  x86_64-amazon-linux-gnu                       3514.326   \n",
1270*08b48e0bSAndroid Build Coastguard Worker       "224  x86_64-amazon-linux-gnu                       3599.748   \n",
1271*08b48e0bSAndroid Build Coastguard Worker       "\n",
1272*08b48e0bSAndroid Build Coastguard Worker       "          hardware.cpu_model  hardware.cpu_threads  \\\n",
1273*08b48e0bSAndroid Build Coastguard Worker       "223  AMD EPYC 7R13 Processor                   192   \n",
1274*08b48e0bSAndroid Build Coastguard Worker       "224  AMD EPYC 7R13 Processor                   192   \n",
1275*08b48e0bSAndroid Build Coastguard Worker       "\n",
1276*08b48e0bSAndroid Build Coastguard Worker       "     targets.test-instr-persist-shmem.multicore.execs_per_sec  \\\n",
1277*08b48e0bSAndroid Build Coastguard Worker       "223                                          119469.35          \n",
1278*08b48e0bSAndroid Build Coastguard Worker       "224                                          237177.20          \n",
1279*08b48e0bSAndroid Build Coastguard Worker       "\n",
1280*08b48e0bSAndroid Build Coastguard Worker       "     targets.test-instr-persist-shmem.multicore.execs_total  \\\n",
1281*08b48e0bSAndroid Build Coastguard Worker       "223                                          1194813.0        \n",
1282*08b48e0bSAndroid Build Coastguard Worker       "224                                          2372250.0        \n",
1283*08b48e0bSAndroid Build Coastguard Worker       "\n",
1284*08b48e0bSAndroid Build Coastguard Worker       "     targets.test-instr-persist-shmem.multicore.fuzzers_used  \n",
1285*08b48e0bSAndroid Build Coastguard Worker       "223                                                1.0        \n",
1286*08b48e0bSAndroid Build Coastguard Worker       "224                                                2.0        "
1287*08b48e0bSAndroid Build Coastguard Worker      ]
1288*08b48e0bSAndroid Build Coastguard Worker     },
1289*08b48e0bSAndroid Build Coastguard Worker     "execution_count": 150,
1290*08b48e0bSAndroid Build Coastguard Worker     "metadata": {},
1291*08b48e0bSAndroid Build Coastguard Worker     "output_type": "execute_result"
1292*08b48e0bSAndroid Build Coastguard Worker    }
1293*08b48e0bSAndroid Build Coastguard Worker   ],
1294*08b48e0bSAndroid Build Coastguard Worker   "source": [
1295*08b48e0bSAndroid Build Coastguard Worker    "r6a = df.query(\"`config.comment` == 'AWS EC2 r6a.48xlarge spot instance'\")\n",
1296*08b48e0bSAndroid Build Coastguard Worker    "r6a.head(2).dropna(axis=1)"
1297*08b48e0bSAndroid Build Coastguard Worker   ]
1298*08b48e0bSAndroid Build Coastguard Worker  },
1299*08b48e0bSAndroid Build Coastguard Worker  {
1300*08b48e0bSAndroid Build Coastguard Worker   "cell_type": "code",
1301*08b48e0bSAndroid Build Coastguard Worker   "execution_count": 151,
1302*08b48e0bSAndroid Build Coastguard Worker   "metadata": {},
1303*08b48e0bSAndroid Build Coastguard Worker   "outputs": [
1304*08b48e0bSAndroid Build Coastguard Worker    {
1305*08b48e0bSAndroid Build Coastguard Worker     "data": {
1306*08b48e0bSAndroid Build Coastguard Worker      "text/html": [
1307*08b48e0bSAndroid Build Coastguard Worker       "<div>\n",
1308*08b48e0bSAndroid Build Coastguard Worker       "<style scoped>\n",
1309*08b48e0bSAndroid Build Coastguard Worker       "    .dataframe tbody tr th:only-of-type {\n",
1310*08b48e0bSAndroid Build Coastguard Worker       "        vertical-align: middle;\n",
1311*08b48e0bSAndroid Build Coastguard Worker       "    }\n",
1312*08b48e0bSAndroid Build Coastguard Worker       "\n",
1313*08b48e0bSAndroid Build Coastguard Worker       "    .dataframe tbody tr th {\n",
1314*08b48e0bSAndroid Build Coastguard Worker       "        vertical-align: top;\n",
1315*08b48e0bSAndroid Build Coastguard Worker       "    }\n",
1316*08b48e0bSAndroid Build Coastguard Worker       "\n",
1317*08b48e0bSAndroid Build Coastguard Worker       "    .dataframe thead th {\n",
1318*08b48e0bSAndroid Build Coastguard Worker       "        text-align: right;\n",
1319*08b48e0bSAndroid Build Coastguard Worker       "    }\n",
1320*08b48e0bSAndroid Build Coastguard Worker       "</style>\n",
1321*08b48e0bSAndroid Build Coastguard Worker       "<table border=\"1\" class=\"dataframe\">\n",
1322*08b48e0bSAndroid Build Coastguard Worker       "  <thead>\n",
1323*08b48e0bSAndroid Build Coastguard Worker       "    <tr style=\"text-align: right;\">\n",
1324*08b48e0bSAndroid Build Coastguard Worker       "      <th></th>\n",
1325*08b48e0bSAndroid Build Coastguard Worker       "      <th>execs_per_sec</th>\n",
1326*08b48e0bSAndroid Build Coastguard Worker       "      <th>parallel_fuzzers</th>\n",
1327*08b48e0bSAndroid Build Coastguard Worker       "      <th>afl_persistent_config</th>\n",
1328*08b48e0bSAndroid Build Coastguard Worker       "      <th>afl_system_config</th>\n",
1329*08b48e0bSAndroid Build Coastguard Worker       "      <th>label</th>\n",
1330*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
1331*08b48e0bSAndroid Build Coastguard Worker       "  </thead>\n",
1332*08b48e0bSAndroid Build Coastguard Worker       "  <tbody>\n",
1333*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
1334*08b48e0bSAndroid Build Coastguard Worker       "      <th>0</th>\n",
1335*08b48e0bSAndroid Build Coastguard Worker       "      <td>119469.35</td>\n",
1336*08b48e0bSAndroid Build Coastguard Worker       "      <td>1.0</td>\n",
1337*08b48e0bSAndroid Build Coastguard Worker       "      <td>True</td>\n",
1338*08b48e0bSAndroid Build Coastguard Worker       "      <td>True</td>\n",
1339*08b48e0bSAndroid Build Coastguard Worker       "      <td>Multicore: Persistent mode/shared memory + ker...</td>\n",
1340*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
1341*08b48e0bSAndroid Build Coastguard Worker       "    <tr>\n",
1342*08b48e0bSAndroid Build Coastguard Worker       "      <th>1</th>\n",
1343*08b48e0bSAndroid Build Coastguard Worker       "      <td>237177.20</td>\n",
1344*08b48e0bSAndroid Build Coastguard Worker       "      <td>2.0</td>\n",
1345*08b48e0bSAndroid Build Coastguard Worker       "      <td>True</td>\n",
1346*08b48e0bSAndroid Build Coastguard Worker       "      <td>True</td>\n",
1347*08b48e0bSAndroid Build Coastguard Worker       "      <td>Multicore: Persistent mode/shared memory + ker...</td>\n",
1348*08b48e0bSAndroid Build Coastguard Worker       "    </tr>\n",
1349*08b48e0bSAndroid Build Coastguard Worker       "  </tbody>\n",
1350*08b48e0bSAndroid Build Coastguard Worker       "</table>\n",
1351*08b48e0bSAndroid Build Coastguard Worker       "</div>"
1352*08b48e0bSAndroid Build Coastguard Worker      ],
1353*08b48e0bSAndroid Build Coastguard Worker      "text/plain": [
1354*08b48e0bSAndroid Build Coastguard Worker       "   execs_per_sec  parallel_fuzzers  afl_persistent_config  afl_system_config  \\\n",
1355*08b48e0bSAndroid Build Coastguard Worker       "0      119469.35               1.0                   True               True   \n",
1356*08b48e0bSAndroid Build Coastguard Worker       "1      237177.20               2.0                   True               True   \n",
1357*08b48e0bSAndroid Build Coastguard Worker       "\n",
1358*08b48e0bSAndroid Build Coastguard Worker       "                                               label  \n",
1359*08b48e0bSAndroid Build Coastguard Worker       "0  Multicore: Persistent mode/shared memory + ker...  \n",
1360*08b48e0bSAndroid Build Coastguard Worker       "1  Multicore: Persistent mode/shared memory + ker...  "
1361*08b48e0bSAndroid Build Coastguard Worker      ]
1362*08b48e0bSAndroid Build Coastguard Worker     },
1363*08b48e0bSAndroid Build Coastguard Worker     "execution_count": 151,
1364*08b48e0bSAndroid Build Coastguard Worker     "metadata": {},
1365*08b48e0bSAndroid Build Coastguard Worker     "output_type": "execute_result"
1366*08b48e0bSAndroid Build Coastguard Worker    }
1367*08b48e0bSAndroid Build Coastguard Worker   ],
1368*08b48e0bSAndroid Build Coastguard Worker   "source": [
1369*08b48e0bSAndroid Build Coastguard Worker    "r6a_graphdf = build_graphdf_from_query(r6a)\n",
1370*08b48e0bSAndroid Build Coastguard Worker    "r6a_graphdf.head(2)"
1371*08b48e0bSAndroid Build Coastguard Worker   ]
1372*08b48e0bSAndroid Build Coastguard Worker  },
1373*08b48e0bSAndroid Build Coastguard Worker  {
1374*08b48e0bSAndroid Build Coastguard Worker   "cell_type": "code",
1375*08b48e0bSAndroid Build Coastguard Worker   "execution_count": 152,
1376*08b48e0bSAndroid Build Coastguard Worker   "metadata": {},
1377*08b48e0bSAndroid Build Coastguard Worker   "outputs": [
1378*08b48e0bSAndroid Build Coastguard Worker    {
1379*08b48e0bSAndroid Build Coastguard Worker     "data": {
1380*08b48e0bSAndroid Build Coastguard Worker      "image/svg+xml": [
1381*08b48e0bSAndroid Build Coastguard Worker       "<svg class=\"main-svg\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"1200\" height=\"400\" style=\"\" viewBox=\"0 0 1200 400\"><rect x=\"0\" y=\"0\" width=\"1200\" height=\"400\" style=\"fill: rgb(255, 255, 255); fill-opacity: 1;\"/><defs id=\"defs-cbb66b\"><g class=\"clips\"><clipPath id=\"clipcbb66bxyplot\" class=\"plotclip\"><rect width=\"737\" height=\"220\"/></clipPath><clipPath class=\"axesclip\" id=\"clipcbb66bx\"><rect x=\"80\" y=\"0\" width=\"737\" height=\"400\"/></clipPath><clipPath class=\"axesclip\" id=\"clipcbb66by\"><rect x=\"0\" y=\"100\" width=\"1200\" height=\"220\"/></clipPath><clipPath class=\"axesclip\" id=\"clipcbb66bxy\"><rect x=\"80\" y=\"100\" width=\"737\" height=\"220\"/></clipPath></g><g class=\"gradients\"/><g class=\"patterns\"/></defs><g class=\"bglayer\"><rect class=\"bg\" x=\"80\" y=\"100\" width=\"737\" height=\"220\" style=\"fill: rgb(229, 236, 246); fill-opacity: 1; stroke-width: 0;\"/></g><g class=\"layer-below\"><g class=\"imagelayer\"/><g class=\"shapelayer\"/></g><g class=\"cartesianlayer\"><g class=\"subplot xy\"><g class=\"layer-subplot\"><g class=\"shapelayer\"/><g class=\"imagelayer\"/></g><g class=\"minor-gridlayer\"><g class=\"x\"/><g class=\"y\"/></g><g class=\"gridlayer\"><g class=\"x\"><path class=\"xgrid crisp\" transform=\"translate(91.58,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(107.01,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(122.45,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(137.88,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(153.31,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(168.75,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(184.18,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(199.62,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(215.05,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(230.49,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(245.92,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(261.36,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(276.78999999999996,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(292.23,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(307.65999999999997,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(323.09000000000003,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(338.53,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(353.96,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(369.4,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(384.83,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(400.27,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(415.7,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(431.14,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(446.57,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(462.01,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(477.44,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(492.87,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(508.31,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(523.74,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(539.1800000000001,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(554.61,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(570.05,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(585.48,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(600.92,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(616.35,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(631.79,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(647.22,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(662.65,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(678.09,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(693.52,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(708.96,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(724.39,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(739.83,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(755.26,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(770.7,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(786.13,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"xgrid crisp\" transform=\"translate(801.57,0)\" d=\"M0,100v220\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/></g><g class=\"y\"><path class=\"ygrid crisp\" transform=\"translate(0,309)\" d=\"M80,0h737\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"ygrid crisp\" transform=\"translate(0,269.4)\" d=\"M80,0h737\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"ygrid crisp\" transform=\"translate(0,229.8)\" d=\"M80,0h737\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"ygrid crisp\" transform=\"translate(0,190.2)\" d=\"M80,0h737\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"ygrid crisp\" transform=\"translate(0,150.6)\" d=\"M80,0h737\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/><path class=\"ygrid crisp\" transform=\"translate(0,111)\" d=\"M80,0h737\" style=\"stroke: rgb(255, 255, 255); stroke-opacity: 1; stroke-width: 1px;\"/></g></g><g class=\"zerolinelayer\"/><path class=\"xlines-below\"/><path class=\"ylines-below\"/><g class=\"overlines-below\"/><g class=\"xaxislayer-below\"/><g class=\"yaxislayer-below\"/><g class=\"overaxes-below\"/><g class=\"plot\" transform=\"translate(80,100)\" clip-path=\"url(#clipcbb66bxyplot)\"><g class=\"scatterlayer mlayer\"><g class=\"trace scatter trace9250e0\" style=\"stroke-miterlimit: 2; opacity: 1;\"><g class=\"fills\"/><g class=\"errorbars\"/><g class=\"lines\"><path class=\"js-line\" d=\"M0,209L27.01,102.25L30.87,92.62L38.59,70.35L42.45,56.73L54.02,21.04L57.88,11L61.74,26.13L65.6,32.45L77.17,55.69L81.03,63.3L88.75,77.57L92.61,91.06L100.32,99.97L104.18,101.5L119.62,110.06L123.48,115.54L131.19,117.24L135.05,116.27L138.91,118.19L142.77,119.19L150.49,122.55L154.35,126.03L158.2,124.89L162.06,125.39L165.92,124.75L169.78,125.59L173.64,126.69L177.5,128.95L181.36,130.38L185.21,138.51L196.79,138.25L200.65,139.44L204.51,138.5L208.37,138.36L212.23,138.9L216.08,143.74L219.94,144.38L223.8,143.28L235.38,142.43L239.24,143.32L243.09,142.87L246.95,145.91L250.81,146.52L254.67,145.26L266.25,144.24L270.1,145.13L273.96,144.33L277.82,147.9L281.68,147.87L285.54,146.98L300.97,145.4L304.83,146.29L308.69,149.5L312.55,149.05L316.41,147.52L320.27,147.61L324.13,146.65L327.98,147.64L335.7,146L339.56,149.34L343.42,149.32L347.28,148.33L354.99,148.62L358.85,146.68L366.57,146.81L370.43,148.02L378.15,149.76L382.01,149.62L389.72,151.19L393.58,151.08L405.16,153.04L409.02,152.44L412.87,153.36L416.73,152.85L439.88,154.48L443.74,153.92L451.46,154.74L455.32,154.56L459.18,154.9L463.04,157.41L470.75,159.8L474.61,160.48L482.33,161.72L486.19,163.29L501.62,165.38L505.48,164.47L532.49,167.38L536.35,166.72L540.21,167.26L544.07,166.74L551.79,166.87L555.64,168.82L563.36,168.82L567.22,168L582.65,167.75L586.51,168.83L594.23,168.31L598.09,167.88L601.95,168.3L605.81,167.68L613.52,166.74L617.38,167.9L636.68,166.35L640.53,166.66L648.25,166.11L652.11,166.24L667.54,164.76L671.4,164.41L675.26,164.4L679.12,165.51L682.98,164.93L686.84,165.64L690.7,164.08L694.55,163.93L698.41,163.27L702.27,163.55L706.13,162.53L709.99,162.91L713.85,163.78L717.71,162.38L733.14,162.64L737,161.91\" style=\"vector-effect: none; fill: none; stroke: rgb(99, 110, 250); stroke-opacity: 1; stroke-width: 2px; opacity: 1;\"/></g><g class=\"points\"/><g class=\"text\"/></g></g></g><g class=\"overplot\"/><path class=\"xlines-above crisp\" d=\"M0,0\" style=\"fill: none;\"/><path class=\"ylines-above crisp\" d=\"M0,0\" style=\"fill: none;\"/><g class=\"overlines-above\"/><g class=\"xaxislayer-above\"><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" transform=\"translate(91.58,0) rotate(90,0,327)\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\">4</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(107.01,0) rotate(90,0,327)\">8</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(122.45,0) rotate(90,0,327)\">12</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(137.88,0) rotate(90,0,327)\">16</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(153.31,0) rotate(90,0,327)\">20</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(168.75,0) rotate(90,0,327)\">24</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(184.18,0) rotate(90,0,327)\">28</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(199.62,0) rotate(90,0,327)\">32</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(215.05,0) rotate(90,0,327)\">36</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(230.49,0) rotate(90,0,327)\">40</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(245.92,0) rotate(90,0,327)\">44</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(261.36,0) rotate(90,0,327)\">48</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(276.78999999999996,0) rotate(90,0,327)\">52</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(292.23,0) rotate(90,0,327)\">56</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(307.65999999999997,0) rotate(90,0,327)\">60</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(323.09000000000003,0) rotate(90,0,327)\">64</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(338.53,0) rotate(90,0,327)\">68</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(353.96,0) rotate(90,0,327)\">72</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(369.4,0) rotate(90,0,327)\">76</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(384.83,0) rotate(90,0,327)\">80</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(400.27,0) rotate(90,0,327)\">84</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(415.7,0) rotate(90,0,327)\">88</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(431.14,0) rotate(90,0,327)\">92</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(446.57,0) rotate(90,0,327)\">96</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(462.01,0) rotate(90,0,327)\">100</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(477.44,0) rotate(90,0,327)\">104</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(492.87,0) rotate(90,0,327)\">108</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(508.31,0) rotate(90,0,327)\">112</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(523.74,0) rotate(90,0,327)\">116</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(539.1800000000001,0) rotate(90,0,327)\">120</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(554.61,0) rotate(90,0,327)\">124</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(570.05,0) rotate(90,0,327)\">128</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(585.48,0) rotate(90,0,327)\">132</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(600.92,0) rotate(90,0,327)\">136</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(616.35,0) rotate(90,0,327)\">140</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(631.79,0) rotate(90,0,327)\">144</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(647.22,0) rotate(90,0,327)\">148</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(662.65,0) rotate(90,0,327)\">152</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(678.09,0) rotate(90,0,327)\">156</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(693.52,0) rotate(90,0,327)\">160</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(708.96,0) rotate(90,0,327)\">164</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(724.39,0) rotate(90,0,327)\">168</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(739.83,0) rotate(90,0,327)\">172</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(755.26,0) rotate(90,0,327)\">176</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(770.7,0) rotate(90,0,327)\">180</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(786.13,0) rotate(90,0,327)\">184</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(801.57,0) rotate(90,0,327)\">188</text></g><g class=\"xtick\"><text text-anchor=\"start\" x=\"0\" y=\"333\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(817,0) rotate(90,0,327)\">192</text></g></g><g class=\"yaxislayer-above\"><g class=\"ytick\"><text text-anchor=\"end\" x=\"79\" y=\"4.199999999999999\" transform=\"translate(0,309)\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\">12x</text></g><g class=\"ytick\"><text text-anchor=\"end\" x=\"79\" y=\"4.199999999999999\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(0,269.4)\">43x</text></g><g class=\"ytick\"><text text-anchor=\"end\" x=\"79\" y=\"4.199999999999999\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(0,229.8)\">74x</text></g><g class=\"ytick\"><text text-anchor=\"end\" x=\"79\" y=\"4.199999999999999\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(0,190.2)\">104x</text></g><g class=\"ytick\"><text text-anchor=\"end\" x=\"79\" y=\"4.199999999999999\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(0,150.6)\">135x</text></g><g class=\"ytick\"><text text-anchor=\"end\" x=\"79\" y=\"4.199999999999999\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre; opacity: 1;\" transform=\"translate(0,111)\">166x</text></g></g><g class=\"overaxes-above\"/></g></g><g class=\"polarlayer\"/><g class=\"smithlayer\"/><g class=\"ternarylayer\"/><g class=\"geolayer\"/><g class=\"funnelarealayer\"/><g class=\"pielayer\"/><g class=\"iciclelayer\"/><g class=\"treemaplayer\"/><g class=\"sunburstlayer\"/><g class=\"glimages\"/><defs id=\"topdefs-cbb66b\"><g class=\"clips\"/><clipPath id=\"legendcbb66b\"><rect width=\"356\" height=\"48\" x=\"0\" y=\"0\"/></clipPath></defs><g class=\"layer-above\"><g class=\"imagelayer\"/><g class=\"shapelayer\"/></g><g class=\"infolayer\"><g class=\"legend\" pointer-events=\"all\" transform=\"translate(831.74,100)\"><rect class=\"bg\" shape-rendering=\"crispEdges\" width=\"356\" height=\"48\" x=\"0\" y=\"0\" style=\"stroke: rgb(68, 68, 68); stroke-opacity: 1; fill: rgb(255, 255, 255); fill-opacity: 1; stroke-width: 0px;\"/><g class=\"scrollbox\" transform=\"\" clip-path=\"url(#legendcbb66b)\"><text class=\"legendtitletext\" text-anchor=\"start\" x=\"2\" y=\"18.2\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 14px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre;\">Configuration</text><g class=\"groups\" transform=\"\"><g class=\"traces\" transform=\"translate(0,32.7)\" style=\"opacity: 1;\"><text class=\"legendtext\" text-anchor=\"start\" x=\"40\" y=\"4.680000000000001\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 12px; fill: rgb(42, 63, 95); fill-opacity: 1; white-space: pre;\">Multicore: Persistent mode/shared memory + kernel config</text><g class=\"layers\" style=\"opacity: 1;\"><g class=\"legendfill\"/><g class=\"legendlines\"><path class=\"js-line\" d=\"M5,0h30\" style=\"fill: none; stroke: rgb(99, 110, 250); stroke-opacity: 1; stroke-width: 2px;\"/></g><g class=\"legendsymbols\"><g class=\"legendpoints\"/></g></g><rect class=\"legendtoggle\" x=\"0\" y=\"-9.5\" width=\"350.46875\" height=\"19\" style=\"fill: rgb(0, 0, 0); fill-opacity: 0;\"/></g></g></g><rect class=\"scrollbar\" rx=\"20\" ry=\"3\" width=\"0\" height=\"0\" x=\"0\" y=\"0\" style=\"fill: rgb(128, 139, 164); fill-opacity: 1;\"/></g><g class=\"g-gtitle\"><text class=\"gtitle\" x=\"60\" y=\"50\" text-anchor=\"start\" dy=\"0em\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 17px; fill: rgb(42, 63, 95); opacity: 1; font-weight: normal; white-space: pre;\">Fuzzer performance</text></g><g class=\"g-xtitle\"><text class=\"xtitle\" x=\"448.5\" y=\"371.659375\" text-anchor=\"middle\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 14px; fill: rgb(42, 63, 95); opacity: 1; font-weight: normal; white-space: pre;\">Number of parallel fuzzers</text></g><g class=\"g-ytitle\"><text class=\"ytitle\" transform=\"rotate(-90,28.668750000000003,210)\" x=\"28.668750000000003\" y=\"210\" text-anchor=\"middle\" style=\"font-family: 'Open Sans', verdana, arial, sans-serif; font-size: 14px; fill: rgb(42, 63, 95); opacity: 1; font-weight: normal; white-space: pre;\">Fuzz target executions per second</text></g></g></svg>"
1382*08b48e0bSAndroid Build Coastguard Worker      ]
1383*08b48e0bSAndroid Build Coastguard Worker     },
1384*08b48e0bSAndroid Build Coastguard Worker     "metadata": {},
1385*08b48e0bSAndroid Build Coastguard Worker     "output_type": "display_data"
1386*08b48e0bSAndroid Build Coastguard Worker    }
1387*08b48e0bSAndroid Build Coastguard Worker   ],
1388*08b48e0bSAndroid Build Coastguard Worker   "source": [
1389*08b48e0bSAndroid Build Coastguard Worker    "r6a_pivotdf = r6a_graphdf.pivot(index=\"parallel_fuzzers\", columns=\"label\", values=\"execs_per_sec\")\n",
1390*08b48e0bSAndroid Build Coastguard Worker    "r6a_fig = r6a_pivotdf.plot(\n",
1391*08b48e0bSAndroid Build Coastguard Worker    "    title=\"Fuzzer performance\",\n",
1392*08b48e0bSAndroid Build Coastguard Worker    "    labels={\n",
1393*08b48e0bSAndroid Build Coastguard Worker    "        \"label\": \"Configuration\",\n",
1394*08b48e0bSAndroid Build Coastguard Worker    "        \"parallel_fuzzers\": \"Number of parallel fuzzers\",\n",
1395*08b48e0bSAndroid Build Coastguard Worker    "        \"value\": \"Fuzz target executions per second\"\n",
1396*08b48e0bSAndroid Build Coastguard Worker    "    }\n",
1397*08b48e0bSAndroid Build Coastguard Worker    ")\n",
1398*08b48e0bSAndroid Build Coastguard Worker    "\n",
1399*08b48e0bSAndroid Build Coastguard Worker    "# Compute tick values and their labels for the primary Y-axis\n",
1400*08b48e0bSAndroid Build Coastguard Worker    "tickvals = np.linspace(r6a_graphdf['execs_per_sec'].min(), r6a_graphdf['execs_per_sec'].max(), 6)\n",
1401*08b48e0bSAndroid Build Coastguard Worker    "ticktext = [f\"{val:.0f}x\" for val in tickvals / graphdf['execs_per_sec'].min()]\n",
1402*08b48e0bSAndroid Build Coastguard Worker    "# Update the primary Y-axis with custom tick labels\n",
1403*08b48e0bSAndroid Build Coastguard Worker    "r6a_fig.update_yaxes(tickvals=tickvals, ticktext=ticktext)\n",
1404*08b48e0bSAndroid Build Coastguard Worker    "r6a_fig.update_xaxes(tickvals=list(range(0,200+1, 4)))\n",
1405*08b48e0bSAndroid Build Coastguard Worker    "r6a_fig.update_layout(width=1200, height=400)\n",
1406*08b48e0bSAndroid Build Coastguard Worker    "r6a_fig.show(\"svg\")"
1407*08b48e0bSAndroid Build Coastguard Worker   ]
1408*08b48e0bSAndroid Build Coastguard Worker  },
1409*08b48e0bSAndroid Build Coastguard Worker  {
1410*08b48e0bSAndroid Build Coastguard Worker   "cell_type": "markdown",
1411*08b48e0bSAndroid Build Coastguard Worker   "metadata": {},
1412*08b48e0bSAndroid Build Coastguard Worker   "source": [
1413*08b48e0bSAndroid Build Coastguard Worker    "### Line graph analysis\n",
1414*08b48e0bSAndroid Build Coastguard Worker    "\n",
1415*08b48e0bSAndroid Build Coastguard Worker    "This is a shocking result for a 192 vCPU machine -- our optimal number of parallel fuzzers was 16!  Using 32 parallel fuzzers gives less performance than using 8 fuzzers.  Using 192 parallel fuzzers (the physical number of threads in this machine) gives the same performance as using 4 fuzzers.\n",
1416*08b48e0bSAndroid Build Coastguard Worker    "\n",
1417*08b48e0bSAndroid Build Coastguard Worker    "This is clearly a cautionary tale about measuring before simply using the number of hardware threads in your machine.  But does this mean that AFL++ is a bad fuzzer, or that AWS tricked us and gave us a 16-thread machine instead of a 192-thread one?\n",
1418*08b48e0bSAndroid Build Coastguard Worker    "\n",
1419*08b48e0bSAndroid Build Coastguard Worker    "No, probably not -- the most likely cause here (other than a horrible bug) may be that we're already saturating the Linux kernel's ability to service system calls (although we're definitely hitting such a limit way earlier than I expected).  A good way to test this theory would be to run more system-call-servicers (read: kernels!) at once on this machine; one way to do that is to use hardware virtualization with KVM. "
1420*08b48e0bSAndroid Build Coastguard Worker   ]
1421*08b48e0bSAndroid Build Coastguard Worker  }
1422*08b48e0bSAndroid Build Coastguard Worker ],
1423*08b48e0bSAndroid Build Coastguard Worker "metadata": {
1424*08b48e0bSAndroid Build Coastguard Worker  "kernelspec": {
1425*08b48e0bSAndroid Build Coastguard Worker   "display_name": "Python 3",
1426*08b48e0bSAndroid Build Coastguard Worker   "language": "python",
1427*08b48e0bSAndroid Build Coastguard Worker   "name": "python3"
1428*08b48e0bSAndroid Build Coastguard Worker  },
1429*08b48e0bSAndroid Build Coastguard Worker  "language_info": {
1430*08b48e0bSAndroid Build Coastguard Worker   "codemirror_mode": {
1431*08b48e0bSAndroid Build Coastguard Worker    "name": "ipython",
1432*08b48e0bSAndroid Build Coastguard Worker    "version": 3
1433*08b48e0bSAndroid Build Coastguard Worker   },
1434*08b48e0bSAndroid Build Coastguard Worker   "file_extension": ".py",
1435*08b48e0bSAndroid Build Coastguard Worker   "mimetype": "text/x-python",
1436*08b48e0bSAndroid Build Coastguard Worker   "name": "python",
1437*08b48e0bSAndroid Build Coastguard Worker   "nbconvert_exporter": "python",
1438*08b48e0bSAndroid Build Coastguard Worker   "pygments_lexer": "ipython3",
1439*08b48e0bSAndroid Build Coastguard Worker   "version": "3.11.5"
1440*08b48e0bSAndroid Build Coastguard Worker  },
1441*08b48e0bSAndroid Build Coastguard Worker  "orig_nbformat": 4
1442*08b48e0bSAndroid Build Coastguard Worker },
1443*08b48e0bSAndroid Build Coastguard Worker "nbformat": 4,
1444*08b48e0bSAndroid Build Coastguard Worker "nbformat_minor": 2
1445*08b48e0bSAndroid Build Coastguard Worker}
1446