{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Performance analysis"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import re\n",
"from datetime import datetime\n",
"import numpy as np\n",
"from mpmath import mp\n",
"import matplotlib as mpl\n",
"import matplotlib.pyplot as plt\n",
"from mpl_toolkits.axes_grid1 import host_subplot\n",
"import mpl_toolkits.axisartist as AA\n",
"import math\n",
"import warnings\n",
"from ipywidgets import interact, interactive, fixed, interact_manual\n",
"plt.rcParams['figure.dpi'] = 90\n",
"plt.rcParams['figure.figsize'] = [24.0, 16.0]\n",
"plt.rcParams['text.latex.unicode'] = False\n",
"plt.rcParams['text.usetex'] = False\n",
"plt.rcParams['mathtext.fontset'] = 'stixsans'\n",
"plt.rcParams['font.family'] = 'DejaVu Sans'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Log parsing"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def events(log):\n",
" start = None\n",
" events = []\n",
" for line in log.split('\\n'):\n",
" match = re.search(r'^\\[(.+Z) TRACE [:\\w]+\\] (BEGIN|END) (.*)$', line)\n",
" if match:\n",
" (time, event, name) = match.groups()\n",
" time = datetime.strptime(time, '%Y-%m-%dT%H:%M:%S.%fZ')\n",
" if start:\n",
" time -= start\n",
" time = time.total_seconds()\n",
" else:\n",
" start = time\n",
" time = 0\n",
" begin = event == 'BEGIN'\n",
" events += [(time, begin, name)]\n",
" return events"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def process(events):\n",
" stack = []\n",
" spans = []\n",
" histogram = {}\n",
" last = None\n",
" for event in events:\n",
" (time, begin, name) = event\n",
" # Collect top of stack histogram\n",
" if last:\n",
" top_of_stack = stack[-1][2]\n",
" duration = time - last\n",
" if top_of_stack in histogram:\n",
" histogram[top_of_stack] += duration\n",
" else:\n",
" histogram[top_of_stack] = duration\n",
" last = time\n",
" # Compute spans\n",
" if begin:\n",
" stack += [event]\n",
" else:\n",
" (start, _, previous_name) = stack[-1]\n",
" stack = stack[:-1]\n",
" assert name == previous_name\n",
" spans += [(len(stack), start, time, name)]\n",
" histogram = {k: v for k, v in sorted(histogram.items(), key=lambda item: -item[1])}\n",
" print(len(spans), len(histogram))\n",
" return spans, histogram"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"x = []\n",
"data = []\n",
"for i in range(10, 16):\n",
" i = 2**i\n",
" x += [i]\n",
" data += [process(events(open(\"../../pedersen-\" + str(i) + \".log\",\"r\").read()))]\n",
"print(x)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Flame graph"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def flamegraph(spans):\n",
" labels = list(set([span[3] for span in spans]))\n",
" maxt = spans[-1][2]\n",
" colour_map = mpl.cm.rainbow(np.linspace(0, 1, len(labels)))\n",
" fig = plt.figure()\n",
" ax = fig.add_subplot(111)\n",
" ax.set_xlim((0,maxt))\n",
" ax.set_ylim((0,7))\n",
"\n",
" for span in spans:\n",
" (depth, start, end, label) = span\n",
" colour = colour_map[labels.index(label)]\n",
" rectangle = mpl.patches.Rectangle((start, depth), end - start, 1, fc=colour, ec='white')\n",
" ax.add_patch(rectangle)\n",
" if end - start > 0.01 * maxt:\n",
" ax.text(start + 0.005 * maxt, depth+0.05, label)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"flamegraph(process(events(open(\"../../pedersen-test.log\",\"r\").read()))[0])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"flamegraph(process(events(open(\"../../pedersen-test3.log\",\"r\").read()))[0])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"flamegraph(data[-1][0])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Histogram"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"labels = list(data[-1][1].keys())\n",
"values = np.array([[hist[label] for label in labels] for (_, hist) in data]).T\n",
"fig, ax = plt.subplots()\n",
"y = values / np.sum(values, axis=0)\n",
"ax.stackplot(np.log2(x), y[::-1, :], labels=labels[::-1])\n",
"ax.set_xlim((10,15))\n",
"ax.set_ylim((0,1))\n",
"\n",
"handles, labels = ax.get_legend_handles_labels()\n",
"ax.legend(handles[::-1], labels[::-1], loc='lower left')\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"values "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"2**13"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 4
}