Skip to content

Instantly share code, notes, and snippets.

@paulroth3d
Last active December 5, 2021 16:47
Show Gist options
  • Save paulroth3d/557921e577cbb0fab22393b4c7598468 to your computer and use it in GitHub Desktop.
Save paulroth3d/557921e577cbb0fab22393b4c7598468 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "562db5c3-7de3-449d-aa09-1a2d544aa068",
"metadata": {},
"source": [
"# Test with [DocString](https://github.com/monolithed/__doc__)"
]
},
{
"cell_type": "markdown",
"id": "47267954-bd54-4250-a396-6c1480e35193",
"metadata": {},
"source": [
"## Libraries"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "eaa50369-eb27-432d-9384-a4c40ba7a042",
"metadata": {},
"outputs": [],
"source": [
"import altair as alt\n",
"import pandas as pd\n",
"import numpy as np\n",
"import json"
]
},
{
"cell_type": "markdown",
"id": "554c8c08-9841-4de1-80ce-a5d99c270352",
"metadata": {},
"source": [
"# What are we doing here?\n",
"\n",
"Python supports getting help for functions thanks to [Python's PEP-0257](http://www.python.org/dev/peps/pep-0257/)<br />\n",
"(ex: `help(pandas.dataframe)` and get the documentation on the function)\n",
"\n",
"**We want this for JavaScript.**\n",
"\n",
"We want to ask for help on a function (like `utils.array.arrange.help()` or `utils.help(utils.array.arrange)`)\n",
"so we can tell how we can use them - instead of going to the documentation.\n",
"\n",
"This is always accurate to the library and version that you are on,\n",
"and stops annoying jerks that simply reply `rtfm`.\n",
"\n",
"It also means that if you are writing a library, and want people to actually use it, then you can give them help to adopt it - and actually give helpful advice. \n",
"\n",
"## Considerations:\n",
"\n",
"### Memory Footprint\n",
"\n",
"If there is a Person class, with properties like `firstName`, `lastName` and methods like `saySomething()`, what does the memory footprint look like if there are millions of instances?\n",
"\n",
"If the help definition is not shared, then this can severely limit where we could use this.\n",
"\n",
"(ex: say we had a Matrix Transformation library with Vectors, Rects, PolyShapes, etc.\n",
"There can be helpful information available for problem solving - ex: dot products as shadows)\n",
"\n",
"It would be preferred that we could ask:\n",
"myPointInstance.dotProduct.help()\n",
"instead of PointClass.dotProduct.help()\n",
"\n",
"but conversely, do not want the help text duplicated for all 10k PointClass instances.\n",
"\n",
"### Objects / Classes / Containers vs Functions and Properties\n",
"\n",
"Asking for documentation on Person should give documentation about how to use Person, and include the list of properties and methods available.\n",
"\n",
"Asking for documentation on a function only gives the documentation on the function or property.\n",
"\n",
"So the class / container / etc needs to not only know about itself, but also the others around it.\n",
"\n",
"Static properties and methods would be preferrable, but perhaps not required.\n",
"\n",
"### Add-On instead of Pre-Work\n",
"\n",
"Ideally, a library that already exists could be documented this way, maybe even with personal notes. \n",
"\n",
"(Like highlighting the common function you use but can never remember how it works - **I'm looking at you D3**)\n",
"\n",
"It would be ideal that we don't require libraries to be forked / modified to support this.\n",
"\n",
"(ex: Comments outside of functions are not available in most ECMA262 runtimes, but ARE available when INSIDE the function - which is not how most libraries are written)\n",
"\n",
"### Opt-Out\n",
"\n",
"We want to minimize the impact on production end results. (Build time is less of a concern initially)\n",
"\n",
"Ideally, this would be a build step option / configuration to either add or remove the help.\n",
"\n",
"Thiw would allow production uses with minimal impact, but we can use it when we need it.\n",
"\n",
"### Introspection / Macro Documentation\n",
"\n",
"Ideally, we would like to ask for documentation at a larger level (ex: a Class, and get information on not just the class, but also the list of methods, properties, etc. available for that class)\n",
"\n",
"### Formatting\n",
"\n",
"Can we do something to make the documentation easier to understand / read?\n",
"\n",
"Like Markdown?\n",
"\n",
"What if the documentation can convert the JSDoc comments into something easier to understand through markdown?"
]
},
{
"cell_type": "markdown",
"id": "abe3170a-491a-49b6-bf3d-7cac911064b0",
"metadata": {},
"source": [
"-------------\n",
"\n",
"## Options\n",
"\n",
"After reviewing around, these were the options that seemed the most viable.\n",
"\n",
"### DocString Library Overview\n",
"\n",
"The [DocString NPM Library](https://npm.io/package/docstring) was inspired by [Python's PEP-0257](http://www.python.org/dev/peps/pep-0257/)\n",
"\n",
"The `__doc__` property in this case is an after-effect of importing the `docstring` module.\n",
"\n",
"(See the [Detail](#Python-__doc__-String) for more)\n",
" \n",
"### Binding Overview\n",
"\n",
"An alternative option could be that we Bind a help() implementation.\n",
" \n",
"ex:\n",
" \n",
"```\n",
"myLibrary.doSomething.help = HelpUtility.createHelpMessage.bind(myLibrary, 'The help message');\n",
"myLibrary.doSomething.help()\n",
"```\n",
"\n",
"(See the [Detail](#Binding) for more)\n",
"\n",
"### Template Function Overview\n",
"\n",
"Another Option is to call a function that returns a help() implementation. (Effectively calling a function to return the function implementation)\n",
"\n",
"ex:\n",
"\n",
"```\n",
"myLibrary.doSomething.help = HelpUtility.createHelpMessage('The help message');\n",
"myLibrary.doSomething.help()\n",
"```\n",
"\n",
"(See the [Detail](#Template-Function) for more)\n",
"\n",
"### Help Map Overview\n",
"\n",
"Another option is to have a map that stores all the help documentation.\n",
"\n",
"```\n",
"const HelpMap = new Map();\n",
"const fn1 = () => 'fn1';\n",
"HelpMap.set(fn1, 'help for Function fn1');\n",
"console.log('fn1.help()', HelpMap.get(fn1)); // help for Function f1\n",
"```\n",
"\n",
"(See the [Detail](#Help-Map) for more)\n",
"\n",
"### Baseline / Inline Help Overview\n",
"\n",
"Including some optional parameter to return the help.\n",
"\n",
"If nothing else, this allows us to compare what the footprint would be of a normal function.\n",
"\n",
"```\n",
"const f1 = (options) => {\n",
" const {requestHelp} = options;\n",
" if (requestHelp) console.log('Help for how to call f1') & return\n",
" ...\n",
"}\n",
"```"
]
},
{
"cell_type": "markdown",
"id": "cc2df839-784d-4762-bb7e-708141f258cd",
"metadata": {},
"source": [
"## TLDR Recommendation\n",
"\n",
"| | DocString | Binding | Arrow | HelpMap | Baseline |\n",
"|---|---|---|---|---|---|\n",
"| Memory Footprint (Max Normalized) | 54% | 92% | 100% | 48% | 54% |\n",
"| Support Function Documentation | TRUE | TRUE | TRUE | TRUE | - |\n",
"| Supports Class Documentation | FALSE | TRUE | TRUE | TRUE | - |\n",
"| Supports Property Documentation | FALSE | TRUE | TRUE | FALSE | - |\n",
"| Supports Arrow Property Documentation | FALSE | TRUE | TRUE | FALSE | - |\n",
"| Supports Hierarchy of Docs (ex: Class + Members) | TRUE | TRUE | TRUE | FALSE | - |\n",
"| Requires you to write Functions Differently | TRUE | FALSE | FALSE | FALSE | - |\n",
"| Supports Opt-Out if help is not desired | FALSE -? | TRUE | TRUE | TRUE | - |\n",
"| Works without a Pre-Processor | TRUE | FALSE | FALSE | FALSE | - |\n",
"\n",
"(Max normalized in this case means if we determine the maximum footprint of the options, how does this compare to it).\n",
"\n",
"The smallest footprint is actually HelpMap and does most of what we want.\n",
"\n",
"* [How the Test was run](#Testing-Memory-Footprints)\n",
"* [Results](#Results)"
]
},
{
"cell_type": "markdown",
"id": "c001eb7c-7b7a-494e-85fa-ddca0b7ecab4",
"metadata": {},
"source": [
"**Example chart for memory footprint**\n",
"\n",
"In this case, if we had a working solution to give a 4 paragraph lorem-ipsum help for 100 functions, the option with the highest memory is 1, and then the other options are then a percentage of that.\n",
"\n",
"Consistently we see the arrow function option take the most memory within Chrome for example, while using the DocString comment WITHIN the function had essentially negiligible additional memory usage to simply defining the function.\n",
"\n",
"Surprisingly, defining a map using the pointer references for the functions / classes etc as keys for the help message seemed to take less memory than just defining the function. \n",
"\n",
"(It is possible the function was moved elsewhere in memory where the tool could not identify it - as we did use a pointer. This may require further investigation)\n",
"\n",
"The footprint for both the map and the baseline object with just the functions (surprisingly the exact same test as used for the baseline object with just plain functions) and the footprint of the map with the pointers are included as-well in the graph below."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "6635d587-ac97-4161-b93f-f87df574d7b3",
"metadata": {},
"outputs": [],
"source": [
"tldrJSON = '{\"type\":{\"0\":\"bind\",\"1\":\"bind\",\"2\":\"bind\",\"3\":\"bind\",\"4\":\"arrow\",\"5\":\"arrow\",\"6\":\"arrow\",\"7\":\"arrow\",\"8\":\"docstring\",\"9\":\"docstring\",\"10\":\"docstring\",\"11\":\"docstring\",\"12\":\"helpMapTotal\",\"13\":\"helpMapTotal\",\"14\":\"helpMapTotal\",\"15\":\"helpMapTotal\",\"16\":\"_helpMapObject\",\"17\":\"_helpMapMap\",\"18\":\"_helpMapObject\",\"19\":\"_helpMapMap\",\"20\":\"_helpMapObject\",\"21\":\"_helpMapMap\",\"22\":\"_helpMapObject\",\"23\":\"_helpMapMap\",\"24\":\"baseline\",\"25\":\"baseline\",\"26\":\"baseline\",\"27\":\"baseline\"},\"count\":{\"0\":100,\"1\":1000,\"2\":10000,\"3\":100000,\"4\":100,\"5\":1000,\"6\":10000,\"7\":100000,\"8\":100,\"9\":1000,\"10\":10000,\"11\":100000,\"12\":100,\"13\":1000,\"14\":10000,\"15\":100000,\"16\":100,\"17\":100,\"18\":1000,\"19\":1000,\"20\":10000,\"21\":10000,\"22\":100000,\"23\":100000,\"24\":100,\"25\":1000,\"26\":10000,\"27\":100000},\"retainedSize\":{\"0\":13952,\"1\":132656,\"2\":1276688,\"3\":14305808,\"4\":15152,\"5\":144656,\"6\":1396688,\"7\":15505808,\"8\":8352,\"9\":76656,\"10\":716688,\"11\":8705808,\"12\":7420,\"13\":63068,\"14\":666140,\"15\":7740892,\"16\":5552,\"17\":1868,\"18\":48656,\"19\":14412,\"20\":436688,\"21\":229452,\"22\":5905808,\"23\":1835084,\"24\":8352,\"25\":76656,\"26\":716688,\"27\":8705808},\"componentOf\":{\"0\":null,\"1\":null,\"2\":null,\"3\":null,\"4\":null,\"5\":null,\"6\":null,\"7\":null,\"8\":null,\"9\":null,\"10\":null,\"11\":null,\"12\":null,\"13\":null,\"14\":null,\"15\":null,\"16\":\"helpMap\",\"17\":\"helpMap\",\"18\":\"helpMap\",\"19\":\"helpMap\",\"20\":\"helpMap\",\"21\":\"helpMap\",\"22\":\"helpMap\",\"23\":\"helpMap\",\"24\":null,\"25\":null,\"26\":null,\"27\":null},\"retainedSizePct\":{\"0\":0.9208025343,\"1\":0.9170445747,\"2\":0.9140824579,\"3\":0.9226096441,\"4\":1.0,\"5\":1.0,\"6\":1.0,\"7\":1.0,\"8\":0.5512143611,\"9\":0.5299192567,\"10\":0.5131339283,\"11\":0.5614546498,\"12\":0.4897043295,\"13\":0.4359860635,\"14\":0.4769425956,\"15\":0.4992253225,\"16\":0.3664202746,\"17\":0.1232840549,\"18\":0.3363565977,\"19\":0.0996294658,\"20\":0.3126596634,\"21\":0.1642829322,\"22\":0.3808771526,\"23\":0.1183481699,\"24\":0.5512143611,\"25\":0.5299192567,\"26\":0.5131339283,\"27\":0.5614546498}}'\n",
"tldrDF = pd.DataFrame.from_dict(json.loads(tldrJSON), orient=\"index\").transpose()\n",
"# see tldrDF for the full dataset"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "f356c148-4a1f-4557-aead-58bbdc60c708",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"<div id=\"altair-viz-dc0c0a24a44a496490a5cff165ead5ac\"></div>\n",
"<script type=\"text/javascript\">\n",
" (function(spec, embedOpt){\n",
" let outputDiv = document.currentScript.previousElementSibling;\n",
" if (outputDiv.id !== \"altair-viz-dc0c0a24a44a496490a5cff165ead5ac\") {\n",
" outputDiv = document.getElementById(\"altair-viz-dc0c0a24a44a496490a5cff165ead5ac\");\n",
" }\n",
" const paths = {\n",
" \"vega\": \"https://cdn.jsdelivr.net/npm//vega@5?noext\",\n",
" \"vega-lib\": \"https://cdn.jsdelivr.net/npm//vega-lib?noext\",\n",
" \"vega-lite\": \"https://cdn.jsdelivr.net/npm//vega-lite@4.8.1?noext\",\n",
" \"vega-embed\": \"https://cdn.jsdelivr.net/npm//vega-embed@6?noext\",\n",
" };\n",
"\n",
" function loadScript(lib) {\n",
" return new Promise(function(resolve, reject) {\n",
" var s = document.createElement('script');\n",
" s.src = paths[lib];\n",
" s.async = true;\n",
" s.onload = () => resolve(paths[lib]);\n",
" s.onerror = () => reject(`Error loading script: ${paths[lib]}`);\n",
" document.getElementsByTagName(\"head\")[0].appendChild(s);\n",
" });\n",
" }\n",
"\n",
" function showError(err) {\n",
" outputDiv.innerHTML = `<div class=\"error\" style=\"color:red;\">${err}</div>`;\n",
" throw err;\n",
" }\n",
"\n",
" function displayChart(vegaEmbed) {\n",
" vegaEmbed(outputDiv, spec, embedOpt)\n",
" .catch(err => showError(`Javascript Error: ${err.message}<br>This usually means there's a typo in your chart specification. See the javascript console for the full traceback.`));\n",
" }\n",
"\n",
" if(typeof define === \"function\" && define.amd) {\n",
" requirejs.config({paths});\n",
" require([\"vega-embed\"], displayChart, err => showError(`Error loading script: ${err.message}`));\n",
" } else if (typeof vegaEmbed === \"function\") {\n",
" displayChart(vegaEmbed);\n",
" } else {\n",
" loadScript(\"vega\")\n",
" .then(() => loadScript(\"vega-lite\"))\n",
" .then(() => loadScript(\"vega-embed\"))\n",
" .catch(showError)\n",
" .then(() => displayChart(vegaEmbed));\n",
" }\n",
" })({\"config\": {\"view\": {\"continuousWidth\": 400, \"continuousHeight\": 300}}, \"data\": {\"name\": \"data-ac09d044df6a0658aed756fe0e837add\"}, \"mark\": \"line\", \"encoding\": {\"color\": {\"type\": \"nominal\", \"field\": \"type\"}, \"x\": {\"type\": \"nominal\", \"field\": \"count\"}, \"y\": {\"type\": \"quantitative\", \"field\": \"retainedSizePct\"}}, \"height\": 200, \"width\": 600, \"$schema\": \"https://vega.github.io/schema/vega-lite/v4.8.1.json\", \"datasets\": {\"data-ac09d044df6a0658aed756fe0e837add\": [{\"type\": \"bind\", \"count\": 100, \"retainedSize\": 13952, \"componentOf\": null, \"retainedSizePct\": 0.9208025343}, {\"type\": \"bind\", \"count\": 1000, \"retainedSize\": 132656, \"componentOf\": null, \"retainedSizePct\": 0.9170445747}, {\"type\": \"bind\", \"count\": 10000, \"retainedSize\": 1276688, \"componentOf\": null, \"retainedSizePct\": 0.9140824579}, {\"type\": \"bind\", \"count\": 100000, \"retainedSize\": 14305808, \"componentOf\": null, \"retainedSizePct\": 0.9226096441}, {\"type\": \"arrow\", \"count\": 100, \"retainedSize\": 15152, \"componentOf\": null, \"retainedSizePct\": 1.0}, {\"type\": \"arrow\", \"count\": 1000, \"retainedSize\": 144656, \"componentOf\": null, \"retainedSizePct\": 1.0}, {\"type\": \"arrow\", \"count\": 10000, \"retainedSize\": 1396688, \"componentOf\": null, \"retainedSizePct\": 1.0}, {\"type\": \"arrow\", \"count\": 100000, \"retainedSize\": 15505808, \"componentOf\": null, \"retainedSizePct\": 1.0}, {\"type\": \"docstring\", \"count\": 100, \"retainedSize\": 8352, \"componentOf\": null, \"retainedSizePct\": 0.5512143611}, {\"type\": \"docstring\", \"count\": 1000, \"retainedSize\": 76656, \"componentOf\": null, \"retainedSizePct\": 0.5299192567}, {\"type\": \"docstring\", \"count\": 10000, \"retainedSize\": 716688, \"componentOf\": null, \"retainedSizePct\": 0.5131339283}, {\"type\": \"docstring\", \"count\": 100000, \"retainedSize\": 8705808, \"componentOf\": null, \"retainedSizePct\": 0.5614546498}, {\"type\": \"helpMapTotal\", \"count\": 100, \"retainedSize\": 7420, \"componentOf\": null, \"retainedSizePct\": 0.4897043295}, {\"type\": \"helpMapTotal\", \"count\": 1000, \"retainedSize\": 63068, \"componentOf\": null, \"retainedSizePct\": 0.4359860635}, {\"type\": \"helpMapTotal\", \"count\": 10000, \"retainedSize\": 666140, \"componentOf\": null, \"retainedSizePct\": 0.4769425956}, {\"type\": \"helpMapTotal\", \"count\": 100000, \"retainedSize\": 7740892, \"componentOf\": null, \"retainedSizePct\": 0.4992253225}, {\"type\": \"_helpMapObject\", \"count\": 100, \"retainedSize\": 5552, \"componentOf\": \"helpMap\", \"retainedSizePct\": 0.3664202746}, {\"type\": \"_helpMapMap\", \"count\": 100, \"retainedSize\": 1868, \"componentOf\": \"helpMap\", \"retainedSizePct\": 0.1232840549}, {\"type\": \"_helpMapObject\", \"count\": 1000, \"retainedSize\": 48656, \"componentOf\": \"helpMap\", \"retainedSizePct\": 0.3363565977}, {\"type\": \"_helpMapMap\", \"count\": 1000, \"retainedSize\": 14412, \"componentOf\": \"helpMap\", \"retainedSizePct\": 0.0996294658}, {\"type\": \"_helpMapObject\", \"count\": 10000, \"retainedSize\": 436688, \"componentOf\": \"helpMap\", \"retainedSizePct\": 0.3126596634}, {\"type\": \"_helpMapMap\", \"count\": 10000, \"retainedSize\": 229452, \"componentOf\": \"helpMap\", \"retainedSizePct\": 0.1642829322}, {\"type\": \"_helpMapObject\", \"count\": 100000, \"retainedSize\": 5905808, \"componentOf\": \"helpMap\", \"retainedSizePct\": 0.3808771526}, {\"type\": \"_helpMapMap\", \"count\": 100000, \"retainedSize\": 1835084, \"componentOf\": \"helpMap\", \"retainedSizePct\": 0.1183481699}, {\"type\": \"baseline\", \"count\": 100, \"retainedSize\": 8352, \"componentOf\": null, \"retainedSizePct\": 0.5512143611}, {\"type\": \"baseline\", \"count\": 1000, \"retainedSize\": 76656, \"componentOf\": null, \"retainedSizePct\": 0.5299192567}, {\"type\": \"baseline\", \"count\": 10000, \"retainedSize\": 716688, \"componentOf\": null, \"retainedSizePct\": 0.5131339283}, {\"type\": \"baseline\", \"count\": 100000, \"retainedSize\": 8705808, \"componentOf\": null, \"retainedSizePct\": 0.5614546498}]}}, {\"mode\": \"vega-lite\"});\n",
"</script>"
],
"text/plain": [
"alt.Chart(...)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"alt.Chart(tldrDF).mark_line().encode(\n",
" x = \"count:N\",\n",
" y = \"retainedSizePct:Q\",\n",
" color = \"type\"\n",
").properties(width=600, height=200)"
]
},
{
"cell_type": "markdown",
"id": "fce40902-9b0b-4460-a420-0eb57e9c9b1d",
"metadata": {},
"source": [
"(Note: for some reason, the chart above does not render in the gist, please see the [#Normalized-Against-the-Max-of-Each-Group](#Normalized-Against-the-Max-of-Each-Group) for more)\n",
" \n",
"* [How the Test was run](#Testing-Memory-Footprints)\n",
"* [Results](#Results)"
]
},
{
"cell_type": "markdown",
"id": "e3a32aca-6ce7-43a6-8c87-a748087ab29f",
"metadata": {},
"source": [
"-----\n",
"\n",
"# Option Details\n",
"\n",
"The following are more details about each of the options\n",
"\n",
"* [DocString Library](#Python-__doc__-String)\n",
"* [Binding](#Binding)\n",
"* [Template Function / Arrow Function](#Template-Function)\n",
"* [Help Map](#Help-Map)\n"
]
},
{
"cell_type": "markdown",
"id": "71ea9a9a-f7fd-4c34-a4fc-4cc2eee03a58",
"metadata": {},
"source": [
"-----\n",
"\n",
"# Python \\_\\_doc\\_\\_ String\n",
"\n",
"Before we describe the DocString library, lets talk about how Python's DocString actually works...\n",
"\n",
"[Python's PEP-0257](http://www.python.org/dev/peps/pep-0257/) was an idea similar to this, and gave python the `__doc__` property.\n",
"\n",
"The basic idea of the python `__doc__` string is that it contains the documentation for the function, and you can either call:\n",
"\n",
"* myObject.myFunction.\\_\\_doc\\_\\_ - and get the raw docstring\n",
"* help(myObject.myFunction) - and get the printed help\n",
"\n",
"We will never be able to get access to the comments outside of the function / property / class / etc. but we can get the internal body comments of it through `.toString()`"
]
},
{
"cell_type": "markdown",
"id": "5e1a9f67-bbc0-446c-865b-2f7e50e74f9e",
"metadata": {},
"source": [
"This only works with functions, it will not work for:\n",
"\n",
"* classes\n",
"* properties\n",
"\n",
"and documentation for them can be very helpful as-well."
]
},
{
"cell_type": "markdown",
"id": "7bb55ce6-e5b6-49de-9ec6-6bc1a7c5c31d",
"metadata": {},
"source": [
"## DocString Library\n",
"\n",
"The [DocString NPM Library](https://npm.io/package/docstring) was inspired by [Python's PEP-0257](http://www.python.org/dev/peps/pep-0257/)\n",
"\n",
"The `__doc__` property in this case is an after-effect of importing the `docstring` module.\n",
"\n",
"```\n",
"require('docstring');\n",
"//-- note: simply import to use the library\n",
"//-- there's no reason to store the result, as it uses the side effect on String\n",
"```\n",
"\n",
"This is a getter that parses the definition of a function, as unlike in Python - we DO get comments in the definition.\n",
"\n",
"(Note that [the entire function source is stored in raw form as part of the language](https://stackoverflow.com/questions/27897938/is-it-possible-that-the-comments-from-a-nodejs-script-create-memory-issues) )\n",
"\n",
"**For Example, here is a simple function with a jsDoc comment inside of the function**"
]
},
{
"cell_type": "raw",
"id": "a2b67b94-8718-4d64-b688-b6fc53b0163f",
"metadata": {},
"source": [
"const helper = {};\n",
"\n",
"/**\n",
" * JSDoc Comment OUTSIDE of the function.\n",
" * This is not accessible due to limitations of JavaScript\n",
" **/\n",
"helper.templateForFunction = (message) => (returnMessage) => {\n",
" /**\n",
" * Generates a help() function for printing out a help message,\n",
" * (or returning the message to be used in higher orders)\n",
" *\n",
" * This is the implementation of your Function's help call\n",
" * \n",
" * Example:\n",
" * \n",
" * const parrotSays = (who, what) => `${who} says: ${what}`;\n",
" * parrotSays.__doc__ = `Mimics a pirate parrot\n",
" * * who {string} - who is saying something\n",
" * * what {string} - what are they saying`;\n",
" * parrotSays.help = helper.helpFunctionTemplate(parrotSays.__doc__);\n",
" * parrotSays.help = helper.templateForFunction(parrotSays.__doc__);\n",
" * parrotSays.help = helper.printFunctionHelp.bind(this, parrotSays.__doc__)\n",
" * \n",
" * parrotSays.help(); // prints the help message\n",
" * \n",
" * @param {String} message - message to print\n",
" * @returns - {(returnMessage:Boolean = false) => void} - function that will render the message\n",
" * or return it.\n",
" */\n",
" \n",
" if (returnMessage === true) {\n",
" return message;\n",
" }\n",
" helper.printHelp(message);\n",
"};"
]
},
{
"cell_type": "markdown",
"id": "fb8e7781-1fbe-4208-8d89-4bdc9b571307",
"metadata": {},
"source": [
"Use the `__doc__` getter on function's prototype, and it returns the comment within the function."
]
},
{
"cell_type": "raw",
"id": "83512178-d0a1-40ee-8f0b-c3ab1fdd1a77",
"metadata": {},
"source": [
"helper.templateForFunction.__doc__\n",
"\n",
"//-- returns the following\n",
"\n",
"'\\n' +\n",
" ' * Generates a help() function for printing out a help message,\\n' +\n",
" ' * (or returning the message to be used in higher orders)\\n' +\n",
" ' *\\n' +\n",
" \" * This is the implementation of your Function's help call\\n\" +\n",
" ' * \\n' +\n",
" ' * Example:\\n' +\n",
" ' * \\n' +\n",
" ' * const parrotSays = (who, what) => `${who} says: ${what}`;\\n' +\n",
" ' * parrotSays.__doc__ = `Mimics a pirate parrot\\n' +\n",
" ' * * who {string} - who is saying something\\n' +\n",
" ' * * what {string} - what are they saying`;\\n' +\n",
" ' * parrotSays.help = helper.helpFunctionTemplate(parrotSays.__doc__);\\n' +\n",
" ' * parrotSays.help = helper.templateForFunction(parrotSays.__doc__);\\n' +\n",
" ' * parrotSays.help = helper.printFunctionHelp.bind(this, parrotSays.__doc__)\\n' +\n",
" ' * \\n' +\n",
" ' * parrotSays.help(); // prints the help message\\n' +\n",
" ' * \\n' +\n",
" ' * @param {String} message - message to print\\n' +\n",
" ' * @returns - {(returnMessage:Boolean = false) => void} - function that will render the message\\n' +\n",
" ' * or return it.\\n' +\n",
" ' '"
]
},
{
"cell_type": "markdown",
"id": "fb516e8c-b97f-4544-8a95-a6b63444e33a",
"metadata": {},
"source": [
"To make this easier to work with in Jupyter, we'd likely need to console or otherwise print the string."
]
},
{
"cell_type": "raw",
"id": "0d65d9f2-e304-416f-a517-9a8fd24076a9",
"metadata": {},
"source": [
"console.log(helper.templateForFunction.__doc__)\n",
"\n",
" * Generates a help() function for printing out a help message,\n",
" * (or returning the message to be used in higher orders)\n",
" *\n",
" * This is the implementation of your Function's help call\n",
" * \n",
" * Example:\n",
" * \n",
" * const parrotSays = (who, what) => `${who} says: ${what}`;\n",
" * parrotSays.__doc__ = `Mimics a pirate parrot\n",
" * * who {string} - who is saying something\n",
" * * what {string} - what are they saying`;\n",
" * parrotSays.help = helper.helpFunctionTemplate(parrotSays.__doc__);\n",
" * parrotSays.help = helper.templateForFunction(parrotSays.__doc__);\n",
" * parrotSays.help = helper.printFunctionHelp.bind(this, parrotSays.__doc__)\n",
" * \n",
" * parrotSays.help(); // prints the help message\n",
" * \n",
" * @param {String} message - message to print\n",
" * @returns - {(returnMessage:Boolean = false) => void} - function that will render the message\n",
" * or return it."
]
},
{
"cell_type": "markdown",
"id": "131f560f-cc8c-499a-96d5-c8d53e65ad2e",
"metadata": {},
"source": [
"### How does this work?\n",
"\n",
"As mentioned earlier, in order for this to work, the function.toString() call must provide the implementation."
]
},
{
"cell_type": "raw",
"id": "f3124082-a1d0-4957-8d39-a1aee150783e",
"metadata": {},
"source": [
"helper.templateForFunction.toString()\n",
"\n",
"'(message) => (returnMessage) => {\\n' +\n",
" ' /**\\n' +\n",
" ' * Generates a help() function for printing out a help message,\\n' +\n",
" ' * (or returning the message to be used in higher orders)\\n' +\n",
" ' *\\n' +\n",
" \" * This is the implementation of your Function's help call\\n\" +\n",
" ' * \\n' +\n",
" ' * Example:\\n' +\n",
" ' * \\n' +\n",
" ' * const parrotSays = (who, what) => `${who} says: ${what}`;\\n' +\n",
" ' * parrotSays.__doc__ = `Mimics a pirate parrot\\n' +\n",
" ' * * who {string} - who is saying something\\n' +\n",
" ' * * what {string} - what are they saying`;\\n' +\n",
" ' * parrotSays.help = helper.helpFunctionTemplate(parrotSays.__doc__);\\n' +\n",
" ' * parrotSays.help = helper.templateForFunction(parrotSays.__doc__);\\n' +\n",
" ' * parrotSays.help = helper.printFunctionHelp.bind(this, parrotSays.__doc__)\\n' +\n",
" ' * \\n' +\n",
" ' * parrotSays.help(); // prints the help message\\n' +\n",
" ' * \\n' +\n",
" ' * @param {String} message - message to print\\n' +\n",
" ' * @returns - {(returnMessage:Boolean = false) => void} - function that will render the message\\n' +\n",
" ' * or return it.\\n' +\n",
" ' */\\n' +\n",
" ' \\n' +\n",
" ' if (returnMessage === true) {\\n' +\n",
" ' return message;\\n' +\n",
" ' }\\n' +\n",
" ' helper.printHelp(message);\\n' +\n",
" '}'"
]
},
{
"cell_type": "markdown",
"id": "3a38772b-0026-4fc4-9877-67a74b97abbb",
"metadata": {},
"source": [
"## Consequences / Considerations\n",
"\n",
"the good\n",
"\n",
"* Likely Smallest Memory Footprint\n",
"* Does support Opt-Out - as comments can be removed in build steps\n",
"\n",
"the bad\n",
"\n",
"* Requires you to write code differently\n",
"* Can only really document functions (not classes or properties, arrow functions, etc)\n",
"* Requires Update to the original source code\n",
"* Does not support macro level (class level) documentation"
]
},
{
"cell_type": "markdown",
"id": "3a5de9ef-dbb1-461b-8afb-80cf4ded777f",
"metadata": {},
"source": [
"----\n",
"\n",
"# Binding\n",
"\n",
"An alternative option could be that we Bind a help() implementation.\n",
"\n",
"This help() function could by default print the documentation and provide a good experience,\n",
"but also return the DocString to others that would want to use it (like for classes / containers)\n",
"\n",
"## Example\n",
"\n",
"```\n",
"someLibrary.helpTemplate = (message) => ... print message with markdown based on context\n",
"//-- can bind to any method that can provide output, even console.log - etc.\n",
"\n",
"myLibraryToBeDocumented.someMethod.help = () => someLibrary.helpTemplate.bind(\n",
" myLibraryToBeDocumented,\n",
" 'This is how you use this method...'\n",
");\n",
"\n",
"myLibraryToBeDocumented.someMethod.help()\n",
"// this is how you use this method...\n",
"```\n",
"\n",
"## Consequences / Considerations\n",
"\n",
"the good\n",
"\n",
"* Does support Opt-In - as code can be included in separate file\n",
" * or removed in build config through opening and closing blocks\n",
"* Does not require code to be written differently\n",
"* can document Classes and Methods and some properties.\n",
"* makes help clear that you are calling a function through `bind`\n",
"\n",
"\n",
"the bad\n",
"\n",
"* 2nd Highest Memory Footprint"
]
},
{
"cell_type": "markdown",
"id": "4a2b28bd-dea1-4c66-9f5c-6a35bc3480c1",
"metadata": {},
"source": [
"-----\n",
"\n",
"# Template Function\n",
"\n",
"Another Option is to call a function that returns a help() implementation.\n",
"(Effectively calling a function to return the function implementation)\n",
"\n",
"```\n",
"myLibraryToBeDocumented.someMethod.help = () => someLibrary.helpTemplate(\n",
" 'This is how you use this method...'\n",
");\n",
"\n",
"myLibraryToBeDocumented.someMethod.help()\n",
"// this is how you use this method...\n",
"```\n",
"\n",
"## Consequences / Considerations\n",
"\n",
"the good\n",
"\n",
"* Does support Opt-In - as code can be included in separate file\n",
" * or removed in build config through opening and closing blocks\n",
"* Does not require code to be written differently\n",
"* can document Classes and Methods and some properties.\n",
"\n",
"\n",
"the bad\n",
"\n",
"* Consistent Highest Memory Footprint\n",
"* Less Obvious from an introspection standpoint this is a function"
]
},
{
"cell_type": "markdown",
"id": "5e333ea7-7c55-4aa8-83ee-0fbdf5379d11",
"metadata": {},
"source": [
"--------\n",
"\n",
"# Help Map\n",
"\n",
"Another option is to have a map that stores all the help documentation.\n",
"\n",
"We could make a custom utility where you would pass an instance of a function, class, etc.\n",
"along with the documentation string.\n",
"\n",
"like:\n",
"\n",
"```\n",
"utils.registerHelp(MyClass, `Some description\n",
" on how to use MyClass\n",
" like with examples, etc.`);\n",
"```\n",
"\n",
"But then you'd need to have access to either the helper utility or the map to get the help again.\n",
"\n",
"```\n",
"utils.help(MyClass);\n",
"\n",
"/* prints the following in the console */\n",
"\n",
"Some description\n",
" on how to use MyClass\n",
" like with examples, etc.\n",
"```\n",
"\n",
"Couple notes:\n",
"\n",
"* This also means you'd be doing something very different from normal development\n",
"* and you'd have to store the link to the map, so you can access it again later.\n",
"* (if the instance of the utility or the map didn't exist, then your code wouldn't compile)\n"
]
},
{
"cell_type": "raw",
"id": "6ffe8433-c2e3-472a-90f8-4c5c44d859cd",
"metadata": {},
"source": [
"{\n",
" const HelpMap = new Map();\n",
" const fn1 = () => 'fn1';\n",
" const fn2 = () => 'fn2';\n",
" class Cuca {\n",
" constructor(name) {\n",
" this.name = name;\n",
" }\n",
" }\n",
" const c1 = new Cuca('foo');\n",
" c1;\n",
" HelpMap.set(fn1, 'help for Function fn1');\n",
" HelpMap.set(fn2, 'help for Function fn2');\n",
" HelpMap.set(Cuca, 'help for Class Cuca');\n",
" console.log('HelpMap', HelpMap);\n",
" console.log('fn1.help()', HelpMap.get(fn1));\n",
" console.log('fn2.help()', HelpMap.get(fn2));\n",
" console.log('cuca.help()', HelpMap.get(Cuca));\n",
"}\n",
"\n",
"//-- provides\n",
"\n",
"HelpMap Map(3) {\n",
" [Function: fn1] => 'help for Function fn1',\n",
" [Function: fn2] => 'help for Function fn2',\n",
" [class Cuca] => 'help for Class Cuca'\n",
"}\n",
"fn1.help() help for Function fn1\n",
"fn2.help() help for Function fn2\n",
"cuca.help() help for Class Cuca"
]
},
{
"cell_type": "markdown",
"id": "c4950ca8-d3c1-40a2-989f-296d544a2bb0",
"metadata": {},
"source": [
"## Consequences / Considerations\n",
"\n",
"the good\n",
"\n",
"* Smallest Memory Footprint (per tests, but likely larger than DocString)\n",
"* Does support Opt-In - by including help after the library has been loaded\n",
" * Opt-Out is supported if you remove the code defining help within tags removed in build step.\n",
"* Can document functions AND classes and arrow functions (no properties though)\n",
"* Does not require you to write code differently\n",
"\n",
"the bad\n",
"\n",
"* Does not support macro level (class level) documentation.\n",
" * Class pointer has no concept of the functions and pointers used within."
]
},
{
"cell_type": "markdown",
"id": "eb02e1fb-1d02-4fb5-b765-0bd911d858e2",
"metadata": {},
"source": [
"------\n",
"\n",
".\n",
"\n",
".\n",
"\n",
".\n",
"\n",
".\n",
"\n",
".\n",
"\n",
".\n",
"\n",
"---\n",
"\n",
"# Testing Memory Footprints\n",
"\n",
"So the following is the results from trying to test the memory footprints of the different options:\n",
"\n",
"* docString - adding in a comment internal to the function\n",
"* bind - creating a bind / bound function to a help() implementation\n",
"* arrow - calling a function that returns a function to provide a help() implementation (an arrow function)\n",
"* helpMap - creating a map that uses the function or class as a key to return the documentation\n",
"* baseline - creating a function that you pass an argument to return the help instead"
]
},
{
"cell_type": "raw",
"id": "ae7f0749-b753-4d96-b8a2-5747cebb8948",
"metadata": {
"tags": []
},
"source": [
"//-- note that this needs to be run in the browser / like chrome to get the memory footprint\n",
"//-- create a new blank tab, paste in the console and then run the memory footprint analyzer\n",
"\n",
"/*\n",
"* What does this do?\n",
"* \n",
"* We have a couple different implementations, and then the most important stuff is at the bottom.\n",
"* \n",
"* Create a factory\n",
"* functionFactory = {\n",
"* bind: generateFunctionWithBind, // generates a function that has a .help method bound to another\n",
"* arrow: generateFunctionWithArrow, // generates a help function by calling an arrow function\n",
"* docString: generateFunctionWithDocString, // generates a function that has a jsdoc comment INSIDE to support docstring\n",
"* map: generateFunctionWithMap, // generates a function that is used as a key in helpMap to get docs\n",
"* baseline: generateFunctionBaseline, // generates a function that returns documentation with an argument\n",
"* empty: generateFunctionEmpty, // generates an empty function and returns it\n",
"* ...\n",
"* }\n",
"* \n",
"* // create an object that stores all the functions - so we can get a footprint\n",
"* generateBigObject = (numberOfFunctions, type) => {\n",
"* const result = { numberOfFunctions };\n",
"* for (let i = 0; i < numberOfFunctions; i++ ) {\n",
"* result[`function${i}`] = functionFactory[type]();\n",
"* }\n",
"* return result;\n",
"* }\n",
"* \n",
"* \n",
"* //-- configure your test here\n",
"* setupTest = () => {\n",
"* let numberOfObjects = 100;\n",
"* let type = 'empty';\n",
"* window.bigObject = generateBigObject(numberOfObjects, type);\n",
"* }\n",
"* \n",
"* \n",
"* In all cases (except empty) - we can get help documentation:\n",
"* \n",
"* generateFunctionWithBind().help();\n",
"* generateFunctionWithArrow().help();\n",
"* generateFunctionWithDocString().toString() -- or using the .__doc__ with docString library\n",
"* \n",
"* someFn = generateFunctionWithMap();\n",
"* helpMap.get(someFn)\n",
"* \n",
"* generateFunctionBaseline()(true);\n",
"*/\n",
"\n",
"\n",
"//-- bind implementation\n",
"printHelp = (message) => console.log(message);\n",
"generateFunctionWithBind = () => {\n",
" const result = () => 'hello';\n",
" result.help = printHelp.bind(this, `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Praesent elementum facilisis leo vel. Est placerat in egestas erat imperdiet sed euismod. Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Tellus elementum sagittis vitae et leo. Libero volutpat sed cras ornare. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Quis imperdiet massa tincidunt nunc. Mattis nunc sed blandit libero volutpat sed cras ornare. In iaculis nunc sed augue lacus viverra. Arcu cursus euismod quis viverra nibh cras pulvinar. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Orci nulla pellentesque dignissim enim. Nulla posuere sollicitudin aliquam ultrices sagittis. Ut enim blandit volutpat maecenas volutpat blandit. Et tortor consequat id porta nibh venenatis cras sed. Sit amet mattis vulputate enim nulla. Risus ultricies tristique nulla aliquet enim tortor at. Augue neque gravida in fermentum. Quam vulputate dignissim suspendisse in est ante.\n",
"\n",
"Nunc non blandit massa enim nec. Aliquam faucibus purus in massa. Tincidunt lobortis feugiat vivamus at. Habitasse platea dictumst vestibulum rhoncus. Proin sed libero enim sed. Lectus urna duis convallis convallis tellus. Cras adipiscing enim eu turpis egestas pretium aenean pharetra magna. Lobortis elementum nibh tellus molestie nunc non blandit massa. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Non nisi est sit amet facilisis magna etiam tempor. Nunc consequat interdum varius sit amet mattis vulputate enim nulla. Egestas purus viverra accumsan in nisl nisi scelerisque. Nunc mattis enim ut tellus elementum sagittis vitae et leo. Cras semper auctor neque vitae tempus quam. Ultricies mi eget mauris pharetra. Tincidunt dui ut ornare lectus sit amet est placerat in. Tristique sollicitudin nibh sit amet.\n",
"\n",
"Egestas maecenas pharetra convallis posuere. Sodales neque sodales ut etiam. Tristique sollicitudin nibh sit amet commodo. Adipiscing at in tellus integer feugiat scelerisque varius. Neque volutpat ac tincidunt vitae semper quis lectus. Eu scelerisque felis imperdiet proin. At urna condimentum mattis pellentesque id nibh tortor id. Eleifend donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum. Gravida neque convallis a cras semper. Commodo sed egestas egestas fringilla phasellus faucibus. Duis ultricies lacus sed turpis tincidunt. Ornare aenean euismod elementum nisi quis eleifend quam. Lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum et sollicitudin ac orci phasellus egestas.\n",
"\n",
"Habitant morbi tristique senectus et netus et malesuada. Nunc vel risus commodo viverra maecenas accumsan. Tincidunt eget nullam non nisi est. Vel fringilla est ullamcorper eget nulla. Nibh sit amet commodo nulla facilisi. Metus aliquam eleifend mi in nulla posuere sollicitudin. Ipsum consequat nisl vel pretium lectus quam id leo in. Ipsum dolor sit amet consectetur adipiscing elit pellentesque habitant morbi. Quam adipiscing vitae proin sagittis nisl rhoncus mattis. Amet nisl suscipit adipiscing bibendum est ultricies integer quis. Mollis aliquam ut porttitor leo. Nisi est sit amet facilisis magna etiam tempor orci eu. Ac turpis egestas maecenas pharetra convallis posuere morbi leo. Varius sit amet mattis vulputate.\n",
"\n",
"Tincidunt dui ut ornare lectus sit amet est. Elit eget gravida cum sociis natoque penatibus et. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Id eu nisl nunc mi ipsum faucibus vitae aliquet. Eu augue ut lectus arcu bibendum at. Porta non pulvinar neque laoreet. Diam vulputate ut pharetra sit amet aliquam id. Aliquet bibendum enim facilisis gravida. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus. Diam donec adipiscing tristique risus nec feugiat in fermentum. Odio ut enim blandit volutpat maecenas.`);\n",
" return result;\n",
"};\n",
"\n",
"//-- arrow function implementation\n",
"helpTemplate = (message) => () => printHelp(message);\n",
"\n",
"generateFunctionWithArrow = () => {\n",
" const result = () => 'hello';\n",
" result.help = helpTemplate(`Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Praesent elementum facilisis leo vel. Est placerat in egestas erat imperdiet sed euismod. Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Tellus elementum sagittis vitae et leo. Libero volutpat sed cras ornare. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Quis imperdiet massa tincidunt nunc. Mattis nunc sed blandit libero volutpat sed cras ornare. In iaculis nunc sed augue lacus viverra. Arcu cursus euismod quis viverra nibh cras pulvinar. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Orci nulla pellentesque dignissim enim. Nulla posuere sollicitudin aliquam ultrices sagittis. Ut enim blandit volutpat maecenas volutpat blandit. Et tortor consequat id porta nibh venenatis cras sed. Sit amet mattis vulputate enim nulla. Risus ultricies tristique nulla aliquet enim tortor at. Augue neque gravida in fermentum. Quam vulputate dignissim suspendisse in est ante.\n",
"\n",
"Nunc non blandit massa enim nec. Aliquam faucibus purus in massa. Tincidunt lobortis feugiat vivamus at. Habitasse platea dictumst vestibulum rhoncus. Proin sed libero enim sed. Lectus urna duis convallis convallis tellus. Cras adipiscing enim eu turpis egestas pretium aenean pharetra magna. Lobortis elementum nibh tellus molestie nunc non blandit massa. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Non nisi est sit amet facilisis magna etiam tempor. Nunc consequat interdum varius sit amet mattis vulputate enim nulla. Egestas purus viverra accumsan in nisl nisi scelerisque. Nunc mattis enim ut tellus elementum sagittis vitae et leo. Cras semper auctor neque vitae tempus quam. Ultricies mi eget mauris pharetra. Tincidunt dui ut ornare lectus sit amet est placerat in. Tristique sollicitudin nibh sit amet.\n",
"\n",
"Egestas maecenas pharetra convallis posuere. Sodales neque sodales ut etiam. Tristique sollicitudin nibh sit amet commodo. Adipiscing at in tellus integer feugiat scelerisque varius. Neque volutpat ac tincidunt vitae semper quis lectus. Eu scelerisque felis imperdiet proin. At urna condimentum mattis pellentesque id nibh tortor id. Eleifend donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum. Gravida neque convallis a cras semper. Commodo sed egestas egestas fringilla phasellus faucibus. Duis ultricies lacus sed turpis tincidunt. Ornare aenean euismod elementum nisi quis eleifend quam. Lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum et sollicitudin ac orci phasellus egestas.\n",
"\n",
"Habitant morbi tristique senectus et netus et malesuada. Nunc vel risus commodo viverra maecenas accumsan. Tincidunt eget nullam non nisi est. Vel fringilla est ullamcorper eget nulla. Nibh sit amet commodo nulla facilisi. Metus aliquam eleifend mi in nulla posuere sollicitudin. Ipsum consequat nisl vel pretium lectus quam id leo in. Ipsum dolor sit amet consectetur adipiscing elit pellentesque habitant morbi. Quam adipiscing vitae proin sagittis nisl rhoncus mattis. Amet nisl suscipit adipiscing bibendum est ultricies integer quis. Mollis aliquam ut porttitor leo. Nisi est sit amet facilisis magna etiam tempor orci eu. Ac turpis egestas maecenas pharetra convallis posuere morbi leo. Varius sit amet mattis vulputate.\n",
"\n",
"Tincidunt dui ut ornare lectus sit amet est. Elit eget gravida cum sociis natoque penatibus et. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Id eu nisl nunc mi ipsum faucibus vitae aliquet. Eu augue ut lectus arcu bibendum at. Porta non pulvinar neque laoreet. Diam vulputate ut pharetra sit amet aliquam id. Aliquet bibendum enim facilisis gravida. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus. Diam donec adipiscing tristique risus nec feugiat in fermentum. Odio ut enim blandit volutpat maecenas.`);\n",
" return result;\n",
"};\n",
"\n",
"//-- docString implementation\n",
"generateFunctionWithDocString = () => {\n",
" const result = (message) => (returnMessage) => {\n",
" /**\n",
" * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Praesent elementum facilisis leo vel. Est placerat in egestas erat imperdiet sed euismod. Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Tellus elementum sagittis vitae et leo. Libero volutpat sed cras ornare. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Quis imperdiet massa tincidunt nunc. Mattis nunc sed blandit libero volutpat sed cras ornare. In iaculis nunc sed augue lacus viverra. Arcu cursus euismod quis viverra nibh cras pulvinar. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Orci nulla pellentesque dignissim enim. Nulla posuere sollicitudin aliquam ultrices sagittis. Ut enim blandit volutpat maecenas volutpat blandit. Et tortor consequat id porta nibh venenatis cras sed. Sit amet mattis vulputate enim nulla. Risus ultricies tristique nulla aliquet enim tortor at. Augue neque gravida in fermentum. Quam vulputate dignissim suspendisse in est ante.\n",
" * \n",
" * Nunc non blandit massa enim nec. Aliquam faucibus purus in massa. Tincidunt lobortis feugiat vivamus at. Habitasse platea dictumst vestibulum rhoncus. Proin sed libero enim sed. Lectus urna duis convallis convallis tellus. Cras adipiscing enim eu turpis egestas pretium aenean pharetra magna. Lobortis elementum nibh tellus molestie nunc non blandit massa. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Non nisi est sit amet facilisis magna etiam tempor. Nunc consequat interdum varius sit amet mattis vulputate enim nulla. Egestas purus viverra accumsan in nisl nisi scelerisque. Nunc mattis enim ut tellus elementum sagittis vitae et leo. Cras semper auctor neque vitae tempus quam. Ultricies mi eget mauris pharetra. Tincidunt dui ut ornare lectus sit amet est placerat in. Tristique sollicitudin nibh sit amet.\n",
" * \n",
" * Egestas maecenas pharetra convallis posuere. Sodales neque sodales ut etiam. Tristique sollicitudin nibh sit amet commodo. Adipiscing at in tellus integer feugiat scelerisque varius. Neque volutpat ac tincidunt vitae semper quis lectus. Eu scelerisque felis imperdiet proin. At urna condimentum mattis pellentesque id nibh tortor id. Eleifend donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum. Gravida neque convallis a cras semper. Commodo sed egestas egestas fringilla phasellus faucibus. Duis ultricies lacus sed turpis tincidunt. Ornare aenean euismod elementum nisi quis eleifend quam. Lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum et sollicitudin ac orci phasellus egestas.\n",
" * \n",
" * Habitant morbi tristique senectus et netus et malesuada. Nunc vel risus commodo viverra maecenas accumsan. Tincidunt eget nullam non nisi est. Vel fringilla est ullamcorper eget nulla. Nibh sit amet commodo nulla facilisi. Metus aliquam eleifend mi in nulla posuere sollicitudin. Ipsum consequat nisl vel pretium lectus quam id leo in. Ipsum dolor sit amet consectetur adipiscing elit pellentesque habitant morbi. Quam adipiscing vitae proin sagittis nisl rhoncus mattis. Amet nisl suscipit adipiscing bibendum est ultricies integer quis. Mollis aliquam ut porttitor leo. Nisi est sit amet facilisis magna etiam tempor orci eu. Ac turpis egestas maecenas pharetra convallis posuere morbi leo. Varius sit amet mattis vulputate.\n",
" * \n",
" * Tincidunt dui ut ornare lectus sit amet est. Elit eget gravida cum sociis natoque penatibus et. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Id eu nisl nunc mi ipsum faucibus vitae aliquet. Eu augue ut lectus arcu bibendum at. Porta non pulvinar neque laoreet. Diam vulputate ut pharetra sit amet aliquam id. Aliquet bibendum enim facilisis gravida. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus. Diam donec adipiscing tristique risus nec feugiat in fermentum. Odio ut enim blandit volutpat maecenas.\n",
" */\n",
"\n",
" if (returnMessage === true) {\n",
" return message;\n",
" }\n",
" helper.printHelp(message);\n",
" };\n",
" return result;\n",
"}\n",
"\n",
"//-- map implementation\n",
"helpMap = new Map();\n",
"\n",
"generateFunctionWithMap = () => {\n",
" const result = () => 'hello';\n",
" helpMap.set(result, `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Praesent elementum facilisis leo vel. Est placerat in egestas erat imperdiet sed euismod. Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Tellus elementum sagittis vitae et leo. Libero volutpat sed cras ornare. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Quis imperdiet massa tincidunt nunc. Mattis nunc sed blandit libero volutpat sed cras ornare. In iaculis nunc sed augue lacus viverra. Arcu cursus euismod quis viverra nibh cras pulvinar. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Orci nulla pellentesque dignissim enim. Nulla posuere sollicitudin aliquam ultrices sagittis. Ut enim blandit volutpat maecenas volutpat blandit. Et tortor consequat id porta nibh venenatis cras sed. Sit amet mattis vulputate enim nulla. Risus ultricies tristique nulla aliquet enim tortor at. Augue neque gravida in fermentum. Quam vulputate dignissim suspendisse in est ante.\n",
"\n",
"Nunc non blandit massa enim nec. Aliquam faucibus purus in massa. Tincidunt lobortis feugiat vivamus at. Habitasse platea dictumst vestibulum rhoncus. Proin sed libero enim sed. Lectus urna duis convallis convallis tellus. Cras adipiscing enim eu turpis egestas pretium aenean pharetra magna. Lobortis elementum nibh tellus molestie nunc non blandit massa. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Non nisi est sit amet facilisis magna etiam tempor. Nunc consequat interdum varius sit amet mattis vulputate enim nulla. Egestas purus viverra accumsan in nisl nisi scelerisque. Nunc mattis enim ut tellus elementum sagittis vitae et leo. Cras semper auctor neque vitae tempus quam. Ultricies mi eget mauris pharetra. Tincidunt dui ut ornare lectus sit amet est placerat in. Tristique sollicitudin nibh sit amet.\n",
"\n",
"Egestas maecenas pharetra convallis posuere. Sodales neque sodales ut etiam. Tristique sollicitudin nibh sit amet commodo. Adipiscing at in tellus integer feugiat scelerisque varius. Neque volutpat ac tincidunt vitae semper quis lectus. Eu scelerisque felis imperdiet proin. At urna condimentum mattis pellentesque id nibh tortor id. Eleifend donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum. Gravida neque convallis a cras semper. Commodo sed egestas egestas fringilla phasellus faucibus. Duis ultricies lacus sed turpis tincidunt. Ornare aenean euismod elementum nisi quis eleifend quam. Lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum et sollicitudin ac orci phasellus egestas.\n",
"\n",
"Habitant morbi tristique senectus et netus et malesuada. Nunc vel risus commodo viverra maecenas accumsan. Tincidunt eget nullam non nisi est. Vel fringilla est ullamcorper eget nulla. Nibh sit amet commodo nulla facilisi. Metus aliquam eleifend mi in nulla posuere sollicitudin. Ipsum consequat nisl vel pretium lectus quam id leo in. Ipsum dolor sit amet consectetur adipiscing elit pellentesque habitant morbi. Quam adipiscing vitae proin sagittis nisl rhoncus mattis. Amet nisl suscipit adipiscing bibendum est ultricies integer quis. Mollis aliquam ut porttitor leo. Nisi est sit amet facilisis magna etiam tempor orci eu. Ac turpis egestas maecenas pharetra convallis posuere morbi leo. Varius sit amet mattis vulputate.\n",
"\n",
"Tincidunt dui ut ornare lectus sit amet est. Elit eget gravida cum sociis natoque penatibus et. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Id eu nisl nunc mi ipsum faucibus vitae aliquet. Eu augue ut lectus arcu bibendum at. Porta non pulvinar neque laoreet. Diam vulputate ut pharetra sit amet aliquam id. Aliquet bibendum enim facilisis gravida. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus. Diam donec adipiscing tristique risus nec feugiat in fermentum. Odio ut enim blandit volutpat maecenas.`);\n",
" return result;\n",
"};\n",
"\n",
"generateFunctionBaseline = () => (printHelp) => !printHelp ? '' : `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Praesent elementum facilisis leo vel. Est placerat in egestas erat imperdiet sed euismod. Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Tellus elementum sagittis vitae et leo. Libero volutpat sed cras ornare. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Quis imperdiet massa tincidunt nunc. Mattis nunc sed blandit libero volutpat sed cras ornare. In iaculis nunc sed augue lacus viverra. Arcu cursus euismod quis viverra nibh cras pulvinar. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Orci nulla pellentesque dignissim enim. Nulla posuere sollicitudin aliquam ultrices sagittis. Ut enim blandit volutpat maecenas volutpat blandit. Et tortor consequat id porta nibh venenatis cras sed. Sit amet mattis vulputate enim nulla. Risus ultricies tristique nulla aliquet enim tortor at. Augue neque gravida in fermentum. Quam vulputate dignissim suspendisse in est ante.\n",
"\n",
"Nunc non blandit massa enim nec. Aliquam faucibus purus in massa. Tincidunt lobortis feugiat vivamus at. Habitasse platea dictumst vestibulum rhoncus. Proin sed libero enim sed. Lectus urna duis convallis convallis tellus. Cras adipiscing enim eu turpis egestas pretium aenean pharetra magna. Lobortis elementum nibh tellus molestie nunc non blandit massa. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Non nisi est sit amet facilisis magna etiam tempor. Nunc consequat interdum varius sit amet mattis vulputate enim nulla. Egestas purus viverra accumsan in nisl nisi scelerisque. Nunc mattis enim ut tellus elementum sagittis vitae et leo. Cras semper auctor neque vitae tempus quam. Ultricies mi eget mauris pharetra. Tincidunt dui ut ornare lectus sit amet est placerat in. Tristique sollicitudin nibh sit amet.\n",
"\n",
"Egestas maecenas pharetra convallis posuere. Sodales neque sodales ut etiam. Tristique sollicitudin nibh sit amet commodo. Adipiscing at in tellus integer feugiat scelerisque varius. Neque volutpat ac tincidunt vitae semper quis lectus. Eu scelerisque felis imperdiet proin. At urna condimentum mattis pellentesque id nibh tortor id. Eleifend donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum. Gravida neque convallis a cras semper. Commodo sed egestas egestas fringilla phasellus faucibus. Duis ultricies lacus sed turpis tincidunt. Ornare aenean euismod elementum nisi quis eleifend quam. Lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum et sollicitudin ac orci phasellus egestas.\n",
"\n",
"Habitant morbi tristique senectus et netus et malesuada. Nunc vel risus commodo viverra maecenas accumsan. Tincidunt eget nullam non nisi est. Vel fringilla est ullamcorper eget nulla. Nibh sit amet commodo nulla facilisi. Metus aliquam eleifend mi in nulla posuere sollicitudin. Ipsum consequat nisl vel pretium lectus quam id leo in. Ipsum dolor sit amet consectetur adipiscing elit pellentesque habitant morbi. Quam adipiscing vitae proin sagittis nisl rhoncus mattis. Amet nisl suscipit adipiscing bibendum est ultricies integer quis. Mollis aliquam ut porttitor leo. Nisi est sit amet facilisis magna etiam tempor orci eu. Ac turpis egestas maecenas pharetra convallis posuere morbi leo. Varius sit amet mattis vulputate.\n",
"\n",
"Tincidunt dui ut ornare lectus sit amet est. Elit eget gravida cum sociis natoque penatibus et. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Id eu nisl nunc mi ipsum faucibus vitae aliquet. Eu augue ut lectus arcu bibendum at. Porta non pulvinar neque laoreet. Diam vulputate ut pharetra sit amet aliquam id. Aliquet bibendum enim facilisis gravida. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus. Diam donec adipiscing tristique risus nec feugiat in fermentum. Odio ut enim blandit volutpat maecenas.`;\n",
"\n",
"generateFunctionEmpty = () => () => 'hello';\n",
"\n",
"functionFactory = {\n",
" bind: generateFunctionWithBind,\n",
" arrow: generateFunctionWithArrow,\n",
" docString: generateFunctionWithDocString,\n",
" map: generateFunctionWithMap,\n",
" baseline: generateFunctionBaseline,\n",
" empty: generateFunctionEmpty\n",
"}\n",
"\n",
"generateBigObject = (numberOfFunctions, type) => {\n",
" const result = { numberOfFunctions };\n",
" for (let i = 0; i < numberOfFunctions; i++ ) {\n",
" result[`function${i}`] = functionFactory[type]();\n",
" }\n",
" return result;\n",
"}\n",
"\n",
"\n",
"//-- configure your test here\n",
"setupTest = () => {\n",
" let numberOfObjects = 100;\n",
" let type = 'empty';\n",
" window.bigObject = generateBigObject(numberOfObjects, type);\n",
"}\n",
"\n",
"//-- actually run the test\n",
"setupTest();"
]
},
{
"cell_type": "markdown",
"id": "89c657d9-6ffa-4a21-8595-0343f31c904f",
"metadata": {
"tags": []
},
"source": [
"# Results\n",
"\n",
"| | DocString | Binding | Arrow | HelpMap | Baseline |\n",
"|---|---|---|---|---|---|\n",
"| Memory Footprint | 54% | 92% | 100% | 48% | 54% |\n",
"| Support Function Documentation | TRUE | TRUE | TRUE | TRUE | - |\n",
"| Supports Class Documentation | FALSE | TRUE | TRUE | TRUE | - |\n",
"| Supports Hierarchy of Docs (ex: Class + Members) | TRUE | TRUE | TRUE | FALSE | - |\n",
"| Supports Property Documentation | FALSE | TRUE | TRUE | TRUE | - |\n",
"| Requires you to write Functions Differently | TRUE | FALSE | FALSE | FALSE | - |\n",
"| Supports Opt-Out if help is not desired | FALSE -? | TRUE | TRUE | TRUE | - |"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "a6259f1c-5750-4596-ba4e-6400774e6ea1",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"class MemoryFootprint:\n",
" def __init__(self, type, count, retainedSize, componentOf = None):\n",
" self.type = type\n",
" self.count = count\n",
" self.retainedSize = retainedSize\n",
" self.componentOf = componentOf\n",
" \n",
" def __repr__(self):\n",
" return f\"<MemoryFootprint type={self.type} count={self.count} retainedSize={self.retainedSize} componentOf={self.componentOf} />\"\n",
" \n",
" def toDict(self):\n",
" return {\n",
" 'type': self.type,\n",
" 'count': self.count,\n",
" 'retainedSize': self.retainedSize,\n",
" 'componentOf': self.componentOf\n",
" }"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "2bd47ebf-4597-401f-86b3-e00f2bdb4fb0",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"footprintResults = [\n",
" MemoryFootprint('bind', 100, 13952),\n",
" MemoryFootprint('bind', 1000, 132656),\n",
" MemoryFootprint('bind', 10000, 1276688),\n",
" MemoryFootprint('bind', 100000, 14305808),\n",
" MemoryFootprint('arrow', 100, 15152),\n",
" MemoryFootprint('arrow', 1000, 144656),\n",
" MemoryFootprint('arrow', 10000, 1396688),\n",
" MemoryFootprint('arrow', 100000, 15505808),\n",
" MemoryFootprint('docstring', 100, 8352),\n",
" MemoryFootprint('docstring', 1000, 76656),\n",
" MemoryFootprint('docstring', 10000, 716688),\n",
" MemoryFootprint('docstring', 100000, 8705808),\n",
" MemoryFootprint('helpMapTotal', 100, 5552 + 1868),\n",
" MemoryFootprint('helpMapTotal', 1000, 48656 + 14412),\n",
" MemoryFootprint('helpMapTotal', 10000, 436688 + 229452),\n",
" MemoryFootprint('helpMapTotal', 100000, 5905808 + 1835084),\n",
" MemoryFootprint('_helpMapObject', 100, 5552, 'helpMap'),\n",
" MemoryFootprint('_helpMapMap', 100, 1868, 'helpMap'),\n",
" MemoryFootprint('_helpMapObject', 1000, 48656, 'helpMap'),\n",
" MemoryFootprint('_helpMapMap', 1000, 14412, 'helpMap'),\n",
" MemoryFootprint('_helpMapObject', 10000, 436688, 'helpMap'),\n",
" MemoryFootprint('_helpMapMap', 10000, 229452, 'helpMap'),\n",
" MemoryFootprint('_helpMapObject', 100000, 5905808, 'helpMap'),\n",
" MemoryFootprint('_helpMapMap', 100000, 1835084, 'helpMap'),\n",
" MemoryFootprint('baseline', 100 , 8352),\n",
" MemoryFootprint('baseline', 1000 , 76656),\n",
" MemoryFootprint('baseline', 10000 , 716688),\n",
" MemoryFootprint('baseline', 100000 , 8705808)\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "4ce1aa13-adf9-4f03-a2da-2e3b72aaedd8",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"footprintDF = pd.DataFrame(data = [footprint.toDict() for footprint in footprintResults])"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "b0b2181a-cd54-4ff8-9056-303c737acaf1",
"metadata": {},
"outputs": [],
"source": [
"def makeNormalizedPct(df, groupByField, fieldToNormalize):\n",
" maxDF = df.groupby(groupByField)[[fieldToNormalize]].max()\n",
" df[fieldToNormalize + 'Pct'] = df.apply(lambda row: row[fieldToNormalize] / maxDF.loc[row[groupByField]], axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "b5d5b198-1184-4cc8-aee4-50b786ef6dcf",
"metadata": {},
"outputs": [],
"source": [
"makeNormalizedPct(footprintDF, 'count', 'retainedSize')"
]
},
{
"cell_type": "markdown",
"id": "1a51b2db-9966-4848-a727-f2219ea7e23c",
"metadata": {},
"source": [
"## Results\n",
"\n",
"It appears that the footprint is linear as we scale."
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "7cc28a13-23b9-46e4-963c-95b985a196cc",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>type</th>\n",
" <th>count</th>\n",
" <th>retainedSize</th>\n",
" <th>componentOf</th>\n",
" <th>retainedSizePct</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>bind</td>\n",
" <td>100</td>\n",
" <td>13952</td>\n",
" <td>None</td>\n",
" <td>0.920803</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>bind</td>\n",
" <td>1000</td>\n",
" <td>132656</td>\n",
" <td>None</td>\n",
" <td>0.917045</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>bind</td>\n",
" <td>10000</td>\n",
" <td>1276688</td>\n",
" <td>None</td>\n",
" <td>0.914082</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>bind</td>\n",
" <td>100000</td>\n",
" <td>14305808</td>\n",
" <td>None</td>\n",
" <td>0.922610</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>arrow</td>\n",
" <td>100</td>\n",
" <td>15152</td>\n",
" <td>None</td>\n",
" <td>1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>arrow</td>\n",
" <td>1000</td>\n",
" <td>144656</td>\n",
" <td>None</td>\n",
" <td>1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>arrow</td>\n",
" <td>10000</td>\n",
" <td>1396688</td>\n",
" <td>None</td>\n",
" <td>1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>arrow</td>\n",
" <td>100000</td>\n",
" <td>15505808</td>\n",
" <td>None</td>\n",
" <td>1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>docstring</td>\n",
" <td>100</td>\n",
" <td>8352</td>\n",
" <td>None</td>\n",
" <td>0.551214</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>docstring</td>\n",
" <td>1000</td>\n",
" <td>76656</td>\n",
" <td>None</td>\n",
" <td>0.529919</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>docstring</td>\n",
" <td>10000</td>\n",
" <td>716688</td>\n",
" <td>None</td>\n",
" <td>0.513134</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>docstring</td>\n",
" <td>100000</td>\n",
" <td>8705808</td>\n",
" <td>None</td>\n",
" <td>0.561455</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>helpMapTotal</td>\n",
" <td>100</td>\n",
" <td>7420</td>\n",
" <td>None</td>\n",
" <td>0.489704</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>helpMapTotal</td>\n",
" <td>1000</td>\n",
" <td>63068</td>\n",
" <td>None</td>\n",
" <td>0.435986</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>helpMapTotal</td>\n",
" <td>10000</td>\n",
" <td>666140</td>\n",
" <td>None</td>\n",
" <td>0.476943</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>helpMapTotal</td>\n",
" <td>100000</td>\n",
" <td>7740892</td>\n",
" <td>None</td>\n",
" <td>0.499225</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>_helpMapObject</td>\n",
" <td>100</td>\n",
" <td>5552</td>\n",
" <td>helpMap</td>\n",
" <td>0.366420</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>_helpMapMap</td>\n",
" <td>100</td>\n",
" <td>1868</td>\n",
" <td>helpMap</td>\n",
" <td>0.123284</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>_helpMapObject</td>\n",
" <td>1000</td>\n",
" <td>48656</td>\n",
" <td>helpMap</td>\n",
" <td>0.336357</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>_helpMapMap</td>\n",
" <td>1000</td>\n",
" <td>14412</td>\n",
" <td>helpMap</td>\n",
" <td>0.099629</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>_helpMapObject</td>\n",
" <td>10000</td>\n",
" <td>436688</td>\n",
" <td>helpMap</td>\n",
" <td>0.312660</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>_helpMapMap</td>\n",
" <td>10000</td>\n",
" <td>229452</td>\n",
" <td>helpMap</td>\n",
" <td>0.164283</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>_helpMapObject</td>\n",
" <td>100000</td>\n",
" <td>5905808</td>\n",
" <td>helpMap</td>\n",
" <td>0.380877</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>_helpMapMap</td>\n",
" <td>100000</td>\n",
" <td>1835084</td>\n",
" <td>helpMap</td>\n",
" <td>0.118348</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>baseline</td>\n",
" <td>100</td>\n",
" <td>8352</td>\n",
" <td>None</td>\n",
" <td>0.551214</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>baseline</td>\n",
" <td>1000</td>\n",
" <td>76656</td>\n",
" <td>None</td>\n",
" <td>0.529919</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>baseline</td>\n",
" <td>10000</td>\n",
" <td>716688</td>\n",
" <td>None</td>\n",
" <td>0.513134</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>baseline</td>\n",
" <td>100000</td>\n",
" <td>8705808</td>\n",
" <td>None</td>\n",
" <td>0.561455</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" type count retainedSize componentOf retainedSizePct\n",
"0 bind 100 13952 None 0.920803\n",
"1 bind 1000 132656 None 0.917045\n",
"2 bind 10000 1276688 None 0.914082\n",
"3 bind 100000 14305808 None 0.922610\n",
"4 arrow 100 15152 None 1.000000\n",
"5 arrow 1000 144656 None 1.000000\n",
"6 arrow 10000 1396688 None 1.000000\n",
"7 arrow 100000 15505808 None 1.000000\n",
"8 docstring 100 8352 None 0.551214\n",
"9 docstring 1000 76656 None 0.529919\n",
"10 docstring 10000 716688 None 0.513134\n",
"11 docstring 100000 8705808 None 0.561455\n",
"12 helpMapTotal 100 7420 None 0.489704\n",
"13 helpMapTotal 1000 63068 None 0.435986\n",
"14 helpMapTotal 10000 666140 None 0.476943\n",
"15 helpMapTotal 100000 7740892 None 0.499225\n",
"16 _helpMapObject 100 5552 helpMap 0.366420\n",
"17 _helpMapMap 100 1868 helpMap 0.123284\n",
"18 _helpMapObject 1000 48656 helpMap 0.336357\n",
"19 _helpMapMap 1000 14412 helpMap 0.099629\n",
"20 _helpMapObject 10000 436688 helpMap 0.312660\n",
"21 _helpMapMap 10000 229452 helpMap 0.164283\n",
"22 _helpMapObject 100000 5905808 helpMap 0.380877\n",
"23 _helpMapMap 100000 1835084 helpMap 0.118348\n",
"24 baseline 100 8352 None 0.551214\n",
"25 baseline 1000 76656 None 0.529919\n",
"26 baseline 10000 716688 None 0.513134\n",
"27 baseline 100000 8705808 None 0.561455"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"footprintDF"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "fdd60da5-8fe7-4004-9109-783cc8c55df3",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"RendererRegistry.enable('mimetype')"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"alt.renderers.enable('mimetype')"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "8447d179-b741-4e27-b60f-b2ec295786b5",
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"application/vnd.vegalite.v4+json": {
"$schema": "https://vega.github.io/schema/vega-lite/v4.8.1.json",
"config": {
"view": {
"continuousHeight": 300,
"continuousWidth": 400
}
},
"data": {
"name": "data-6222ec680a3e22fffa64e76b00bc0b1b"
},
"datasets": {
"data-6222ec680a3e22fffa64e76b00bc0b1b": [
{
"componentOf": null,
"count": 100,
"retainedSize": 13952,
"retainedSizePct": 0.9208025343189018,
"type": "bind"
},
{
"componentOf": null,
"count": 1000,
"retainedSize": 132656,
"retainedSizePct": 0.9170445747151864,
"type": "bind"
},
{
"componentOf": null,
"count": 10000,
"retainedSize": 1276688,
"retainedSizePct": 0.9140824579290435,
"type": "bind"
},
{
"componentOf": null,
"count": 100000,
"retainedSize": 14305808,
"retainedSizePct": 0.9226096440765937,
"type": "bind"
},
{
"componentOf": null,
"count": 100,
"retainedSize": 15152,
"retainedSizePct": 1,
"type": "arrow"
},
{
"componentOf": null,
"count": 1000,
"retainedSize": 144656,
"retainedSizePct": 1,
"type": "arrow"
},
{
"componentOf": null,
"count": 10000,
"retainedSize": 1396688,
"retainedSizePct": 1,
"type": "arrow"
},
{
"componentOf": null,
"count": 100000,
"retainedSize": 15505808,
"retainedSizePct": 1,
"type": "arrow"
},
{
"componentOf": null,
"count": 100,
"retainedSize": 8352,
"retainedSizePct": 0.5512143611404435,
"type": "docstring"
},
{
"componentOf": null,
"count": 1000,
"retainedSize": 76656,
"retainedSizePct": 0.5299192567193894,
"type": "docstring"
},
{
"componentOf": null,
"count": 10000,
"retainedSize": 716688,
"retainedSizePct": 0.5131339282645802,
"type": "docstring"
},
{
"componentOf": null,
"count": 100000,
"retainedSize": 8705808,
"retainedSizePct": 0.5614546497673646,
"type": "docstring"
},
{
"componentOf": null,
"count": 100,
"retainedSize": 7420,
"retainedSizePct": 0.48970432946145726,
"type": "helpMapTotal"
},
{
"componentOf": null,
"count": 1000,
"retainedSize": 63068,
"retainedSizePct": 0.4359860634885522,
"type": "helpMapTotal"
},
{
"componentOf": null,
"count": 10000,
"retainedSize": 666140,
"retainedSizePct": 0.4769425956262243,
"type": "helpMapTotal"
},
{
"componentOf": null,
"count": 100000,
"retainedSize": 7740892,
"retainedSizePct": 0.4992253225372067,
"type": "helpMapTotal"
},
{
"componentOf": "helpMap",
"count": 100,
"retainedSize": 5552,
"retainedSizePct": 0.36642027455121434,
"type": "_helpMapObject"
},
{
"componentOf": "helpMap",
"count": 100,
"retainedSize": 1868,
"retainedSizePct": 0.12328405491024287,
"type": "_helpMapMap"
},
{
"componentOf": "helpMap",
"count": 1000,
"retainedSize": 48656,
"retainedSizePct": 0.336356597721491,
"type": "_helpMapObject"
},
{
"componentOf": "helpMap",
"count": 1000,
"retainedSize": 14412,
"retainedSizePct": 0.09962946576706116,
"type": "_helpMapMap"
},
{
"componentOf": "helpMap",
"count": 10000,
"retainedSize": 436688,
"retainedSizePct": 0.3126596634323485,
"type": "_helpMapObject"
},
{
"componentOf": "helpMap",
"count": 10000,
"retainedSize": 229452,
"retainedSizePct": 0.1642829321938758,
"type": "_helpMapMap"
},
{
"componentOf": "helpMap",
"count": 100000,
"retainedSize": 5905808,
"retainedSizePct": 0.38087715261275,
"type": "_helpMapObject"
},
{
"componentOf": "helpMap",
"count": 100000,
"retainedSize": 1835084,
"retainedSizePct": 0.1183481699244567,
"type": "_helpMapMap"
},
{
"componentOf": null,
"count": 100,
"retainedSize": 8352,
"retainedSizePct": 0.5512143611404435,
"type": "baseline"
},
{
"componentOf": null,
"count": 1000,
"retainedSize": 76656,
"retainedSizePct": 0.5299192567193894,
"type": "baseline"
},
{
"componentOf": null,
"count": 10000,
"retainedSize": 716688,
"retainedSizePct": 0.5131339282645802,
"type": "baseline"
},
{
"componentOf": null,
"count": 100000,
"retainedSize": 8705808,
"retainedSizePct": 0.5614546497673646,
"type": "baseline"
}
]
},
"encoding": {
"color": {
"field": "type",
"type": "nominal"
},
"x": {
"field": "count",
"scale": {
"type": "log"
},
"type": "quantitative"
},
"y": {
"field": "retainedSize",
"scale": {
"type": "log"
},
"type": "quantitative"
}
},
"height": 400,
"mark": "line",
"width": 600
},
"image/png": "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",
"text/plain": [
"<VegaLite 4 object>\n",
"\n",
"If you see this message, it means the renderer has not been properly enabled\n",
"for the frontend that you are using. For more information, see\n",
"https://altair-viz.github.io/user_guide/troubleshooting.html\n"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"alt.Chart(footprintDF)\\\n",
" .mark_line().encode(\n",
" x=alt.Y('count:Q', scale=alt.Scale(type='log')),\n",
" y=alt.Y('retainedSize:Q', scale=alt.Scale(type='log')),\n",
" color='type'\n",
" ).properties(width=600, height=400)\n",
"\n",
"# example in javascript\n",
"# utils.vega.svg($$,\n",
"# vl.markLine()\n",
"# .width(800)\n",
"# .height(800)\n",
"# .data(footprintResults)\n",
"# .encode(\n",
"# vl.x().fieldN('count'),\n",
"# vl.y().fieldQ('retainedSize').scale({type: 'log'}),\n",
"# vl.color().fieldN('type')\n",
"# )\n",
"# );\n",
"# /*\n",
"# vl.svg(d,\n",
"# vl.markPoint()\n",
"# .width(chartWidth)\n",
"# .data(data3)\n",
"# .encode(\n",
"# vl.x().fieldQ('precip'),\n",
"# vl.y().fieldN('city')\n",
"# ));\n",
"# */"
]
},
{
"cell_type": "markdown",
"id": "d6e93ca2-99f6-4a59-ad5c-6950a24b1917",
"metadata": {},
"source": [
"## Normalized Against the Max of Each Group\n",
"\n",
"So lets normalize against the max for each group."
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "27dd76c6-52be-404f-93f6-cb71d125be64",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.vegalite.v4+json": {
"$schema": "https://vega.github.io/schema/vega-lite/v4.8.1.json",
"config": {
"view": {
"continuousHeight": 300,
"continuousWidth": 400
}
},
"data": {
"name": "data-6222ec680a3e22fffa64e76b00bc0b1b"
},
"datasets": {
"data-6222ec680a3e22fffa64e76b00bc0b1b": [
{
"componentOf": null,
"count": 100,
"retainedSize": 13952,
"retainedSizePct": 0.9208025343189018,
"type": "bind"
},
{
"componentOf": null,
"count": 1000,
"retainedSize": 132656,
"retainedSizePct": 0.9170445747151864,
"type": "bind"
},
{
"componentOf": null,
"count": 10000,
"retainedSize": 1276688,
"retainedSizePct": 0.9140824579290435,
"type": "bind"
},
{
"componentOf": null,
"count": 100000,
"retainedSize": 14305808,
"retainedSizePct": 0.9226096440765937,
"type": "bind"
},
{
"componentOf": null,
"count": 100,
"retainedSize": 15152,
"retainedSizePct": 1,
"type": "arrow"
},
{
"componentOf": null,
"count": 1000,
"retainedSize": 144656,
"retainedSizePct": 1,
"type": "arrow"
},
{
"componentOf": null,
"count": 10000,
"retainedSize": 1396688,
"retainedSizePct": 1,
"type": "arrow"
},
{
"componentOf": null,
"count": 100000,
"retainedSize": 15505808,
"retainedSizePct": 1,
"type": "arrow"
},
{
"componentOf": null,
"count": 100,
"retainedSize": 8352,
"retainedSizePct": 0.5512143611404435,
"type": "docstring"
},
{
"componentOf": null,
"count": 1000,
"retainedSize": 76656,
"retainedSizePct": 0.5299192567193894,
"type": "docstring"
},
{
"componentOf": null,
"count": 10000,
"retainedSize": 716688,
"retainedSizePct": 0.5131339282645802,
"type": "docstring"
},
{
"componentOf": null,
"count": 100000,
"retainedSize": 8705808,
"retainedSizePct": 0.5614546497673646,
"type": "docstring"
},
{
"componentOf": null,
"count": 100,
"retainedSize": 7420,
"retainedSizePct": 0.48970432946145726,
"type": "helpMapTotal"
},
{
"componentOf": null,
"count": 1000,
"retainedSize": 63068,
"retainedSizePct": 0.4359860634885522,
"type": "helpMapTotal"
},
{
"componentOf": null,
"count": 10000,
"retainedSize": 666140,
"retainedSizePct": 0.4769425956262243,
"type": "helpMapTotal"
},
{
"componentOf": null,
"count": 100000,
"retainedSize": 7740892,
"retainedSizePct": 0.4992253225372067,
"type": "helpMapTotal"
},
{
"componentOf": "helpMap",
"count": 100,
"retainedSize": 5552,
"retainedSizePct": 0.36642027455121434,
"type": "_helpMapObject"
},
{
"componentOf": "helpMap",
"count": 100,
"retainedSize": 1868,
"retainedSizePct": 0.12328405491024287,
"type": "_helpMapMap"
},
{
"componentOf": "helpMap",
"count": 1000,
"retainedSize": 48656,
"retainedSizePct": 0.336356597721491,
"type": "_helpMapObject"
},
{
"componentOf": "helpMap",
"count": 1000,
"retainedSize": 14412,
"retainedSizePct": 0.09962946576706116,
"type": "_helpMapMap"
},
{
"componentOf": "helpMap",
"count": 10000,
"retainedSize": 436688,
"retainedSizePct": 0.3126596634323485,
"type": "_helpMapObject"
},
{
"componentOf": "helpMap",
"count": 10000,
"retainedSize": 229452,
"retainedSizePct": 0.1642829321938758,
"type": "_helpMapMap"
},
{
"componentOf": "helpMap",
"count": 100000,
"retainedSize": 5905808,
"retainedSizePct": 0.38087715261275,
"type": "_helpMapObject"
},
{
"componentOf": "helpMap",
"count": 100000,
"retainedSize": 1835084,
"retainedSizePct": 0.1183481699244567,
"type": "_helpMapMap"
},
{
"componentOf": null,
"count": 100,
"retainedSize": 8352,
"retainedSizePct": 0.5512143611404435,
"type": "baseline"
},
{
"componentOf": null,
"count": 1000,
"retainedSize": 76656,
"retainedSizePct": 0.5299192567193894,
"type": "baseline"
},
{
"componentOf": null,
"count": 10000,
"retainedSize": 716688,
"retainedSizePct": 0.5131339282645802,
"type": "baseline"
},
{
"componentOf": null,
"count": 100000,
"retainedSize": 8705808,
"retainedSizePct": 0.5614546497673646,
"type": "baseline"
}
]
},
"encoding": {
"color": {
"field": "type",
"type": "nominal"
},
"x": {
"field": "count",
"type": "nominal"
},
"y": {
"field": "retainedSizePct",
"type": "quantitative"
}
},
"height": 200,
"mark": "line",
"width": 600
},
"image/png": "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Qunfv79ceOGFUlpaqqE077zzjh42+sILL6gRAKMg2omnScJYZ81QxNcZet6YBEiABEiABEiABOqOQDJFfCKj+Oc//ym777673HbbbXLTTTdpSEx1Iv6nn36S8847T0U9zhvq2LGjLF26VMrKyjShCg4Uhdhv3LixZkOEB78+For4+jirHBMJkAAJkAAJkAAJ1EDALiJ+0aJFcv7558vee++tG1vhPYcXHd75zz//XPbYYw/1xH/22Wfy8MMP66hwiChSmOOQ0UGDBqloRznkkEMERsGVV14pRx55pMbLDx06tF4+CxTx9XJaOSgSIAESIAESIAESqJ6AXUQ8eonU5MXFxXqWED7jANCaQmA2b94sfr9f498zsVDEZ+Ksc8wkQAIkQAIkQAIZT8BOIj7jJyMOABTxcUDjJSRAAiRAAiRAAiTgdAIU8c6eQYp4Z88fe08CJEACJEACJEACcRGgiI8Lm20uooi3zVSwIyRAAiRAAiRAAiSQPgIU8eljnYo7UcSngirbJAESIAESIAESIAGbE7CLiEc/UNq2bZtUYt9//71uesVhUkhFiRNd61OhiK9Ps8mxkAAJkAAJkAAJkECMBOwi4nFoE7LM3HzzzTH2PLZqSDN5+umna+749evX66mu9alQxNen2eRYSIAESIAESIAESCBGAnYS8Thl9ccff9SeI+d7jx49ZOHChTJixAhZvXq1CnCIfaSVRB74N998Uzp37izTp0+XRo0ayZgxY+Sxxx6TVq1ayaOPPipHHHGE5oqHiEeqShwQhVNdr7/+esnLy5P33ntPBgwYIOPGjVMv/XXXXaf56U844QT5z3/+44i0lTGJeBx526ZNG2natKnCRR5PJNw/5phjJCcnJ8ZHJf5qDzzwgAwfPjz+BnglCZAACZAACZAACZBAGAE7iXhoPYjor7/+Wh588EH59ttv9STWW2+9Vbp27SonnXSSPPnkk3qS6zfffCP33nuvakN83759e+nXr5/MnTtX3n77bRXma9askauvvlpFPET6smXLZMiQIbLffvtpPehatP/HH3/I888/Lzhw6s4779R2XS6XTJs2zfZPS7UifuXKlWoV4bQrvI4//ngdEKwZnJT1yy+/6OlaqS4U8akmzPZJgARIgARIgAQyjUAyRfzkzxbFhG9Ix2Mr1YOHHd72iRMn6m84ofWrr75SD/r777+v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kwAJkAAJkAAJ2I8ARbz95qQ2PYpJxNemwVTUpYhPBVW2SQIkQAIkQAIkkMkEKOKdPfsU8c6eP/aeBEiABEiABEiABOIiQBEfFzbbXEQRb5upYEdIgARIgARIgARIIH0EKOLTxzoVd6KITwVVtkkCJEACJEACJEACNidAEW/zCaqhexTxzp4/9p4ESIAESIAESIAE4iJAER8XNttcRBFvm6lgR0iABEiABEiABEggfQQo4tPHOhV3oohPBVW2SQIkQAIkQAIkQAI2J0ARb/MJqqF7FPHOnj/2ngRIgARIgARIgATiIkARHxc221xEEW+bqWBHSIAESIAESIAESCB9BCji08c6FXeiiE8FVbZJAiRAAiRAAiRAAjYnQBFv8wmqoXsU8c6eP/aeBEiABEiABEiABOIiQBEfFzbbXEQRb5upYEdIgARIgARIgARIIH0EKOLTxzoVd6KITwVVtkkCJEACJEACJEACNidAEW/zCaqhexTxzp4/9p4ESIAESIAESIAE4iJAER8XNttcRBFvm6lgR0iABEiABEiABEggfQQo4tPHOhV3SpmI9/v9UlRUJAUFBVX2e/PmzdKwYUPxeDzVju2BBx6Q4cOHp2L8bJMESIAESIAESIAEMpIARbyzpz0lIn7atGkyYcIEadmypZSXl8vMmTOladOmIVJr166VPn366Hder1eOOOIIGTVqVJUkKeKd/ZCx9yRAAiRAAiRAAvYjQBFvvzmpTY+SLuIh2rOysmTLli3SqFEjuf7666VFixYyYsSIUL/uueceKSsrk9GjR0txcbHk5eXJ+vXrZc8994zad4r42kwp65IACZAACZAACZBAzQQo4mtmZOcaSRfxq1evlq5du8qqVat03BMnTpSlS5fK1KlTQxwQZuNyuSQ3N1defvllufHGG2XlypX6XbRCEW/nR4h9IwESIAESIAEScCIBingnzlpFn5Mu4pctWya9evWSH3/8Ue8yY8YM+fDDD2XKlClhpEpLS2XMmDEybtw4eemll+SUU07R3xcsWCALFy6sRBVtspAACZAACZAACZAACSSPQNu2bZPXGFtKK4Gki3h42fPz8wUbW+FZHz9+vA5o2LBhoYEhhKZ3796SnZ2tnnqE21RX6IlP6zPBm5EACZAACZAACWQAAXrinT3JSRfxwNGhQweZPHmytG/fXk4//XSNfe/WrZt8+umn+t2zzz4rr776qsybNy8mehTxMWFiJRIgARIgARIgARKImQBFfMyobFkxJSIe4nzAgAE64B49esisWbPUK490khDyY8eOlenTp4cBWbFihey3335RIVHE2/LZYadIgARIgARIgAQcTIAi3sGTJyIpEfFAUlhYKFu3bq0xVCYWfBTxsVBiHRIgARIgARIgARKInQBFfOys7FgzZSI+mYOliE8mTbZFAiRAAiRAAiRAAiIU8c5+CijinT1/7D0JkAAJ2JJAWblftu4slq07SmRL8H3rzpKw7/z+gBTkZktBbpa+8vU9WwryIv62/G7LwbJTJOBQAhTxDp24YLcp4p09f+w9CZAACaSFQCAQkC0Q4TuKRcX4DkOQb9H3iu+3BH8vLC5Ler9wkogK/bwowt9qCFh+N40DXJefkyW52d6k94sNkoBTCVDEO3XmjH5TxDt7/th7EiABEoibwPbCUotn3CrQi4OCvcJzvq2wpFb3yfK6pVFBrjTaJUd2Db43Ksip+G6XXHG7XLKzuFR2FpfpC8Jf/y6K+Nvye606EaUy+pVv8f5XrAJUrAAYwt9iKOQYqwSmIYA2WEigPhCgiHf2LFLEO3v+2HsSIAESCBEoKimr7Bm3hrIEveSmtxzhLLEWZBjbFSJ8lwohDpG+q/6N73ND76gHwZuKooK/KIrwtxoC1fxeWuZLuFt5OV4N+zHCf6yvbMkPhgKZhkC+1jVWAayGgNsd/YTyhDvHBkigFgQo4msBy4ZVKeJtOCnsEgmQAAmAQGm5LxS2YsSWh3vLEcZihLMYseeoX5vSID/b4i2vLMStgr1hfk5tmrZtXZ8/EDICdoTEfmlwFcBYAcBKQKFlhcBYKaioUxvjJxoICHhD/Bve/pAxoAZAxXch4R9hABTkeiUvJzVGkm0njh1LCQGK+JRgTVujFPFpQ80bkQAJZDoBiD9DeJtx5cZ7aOOnKciD4hye9doUCLuQZ9wMYTHDWSze8l2DXnN6g2tDt6IujCUI/ZARUFQqOzQcqCIUKFL4mysICBkqKi2P78aWq7KzPGGGgBoDViMgxxsK/7GuAJghQXjPyfIk3A824GwCFPHOnj+KeGfPH3tPAiRQxwQQK25u8ozmLTe854a3HDHotSnZXk8ofKWqsBWrtxz1WZxBoKikXL37OxD/r0aAaQBUNgQq9gtUhBKV+/wJDzQsI5BlY7BV9IeHAnkrhQV5PdwfkPBE1GEDFPF1CD8Jt6aITwJENkECJFB/CMBTWlPYSkXqxBJB1pZYCzzfiB83PeEVceTBzZ9h3vIchkzECjYD6+GxCxkBagAYqwG6XwCrBFajwNwvENwwbG4mThQbBHzYxuDQ5t/gKkCUvQDR9ge4uD0g0amI+3qK+LjR2eJCinhbTEPyOvF/Uz6QbK9bsNQKr5z1HRkVIr/D3/p9lPrGb2jDuI4el+TNE1tKH4GSMsSVB8NXzFAWS9hKeB7zYkF+89oUxIpbveHG5s/wTZ7m74hBZyEBuxCANx9efg0LCu4PMEOEjO+MvQC6WhAlaxD+bSVakPLTui8gcgOwNfwnP9eyEpBTcZYA04bGPwsU8fGzs8OVFPF2mIUk9uHsEXOS2FrlpuBJDDMELCI/K9IQiDAODIMgaFxE+y3YltaLMCDwN+N3Uzq1jmkcGxMhyqvOWW5s8jRzl9c2/hiiIZq33AhnMVImmtlYINiRtYWFBDKVAIR8NCPAujJgNQKsKwRY9cK/50QK0pRGxvw/cNUpiTSZUddSxDt7uininT1/lXr/1U+/qycRG6/Kyn2CdGoVf1u+19/8Rh2ta72miu/L/eJLQhxmIsgrDIEqVhWCqwbRVhywomAaCNYViNB3kb9b2oKBQqmWyMxVf631sKCQZzziYCFz8ycEQ20KNu+FxHdYznLTW27NY56rK1MsJEAC6SMAMW8V9xX7BCr2AERbGcB32FsQWV4Z0yd9nXf4nSjinT2BFPHOnr+09h6xv6Wm2C8zxD/+Lgt+DjMEYBiUWY2GCMNAjYvg9VZDoqrvgwZJWgcccTNPcBWi0opDhNivMCCCRkNw9SEUzoRVBv3OMESshkloFSKizSyHbR7DEn313vLwVIm18cVhHhCuEhm2YnjPK+cw51J7Xf6r4b1JIPUEkPXJGvbTrmWT1N+0ntyBIt7ZE0kR7+z5y6jeY9nVWFmobECEVhNCBoVhIFjrh4wMrRNltaHa730JL/smOlmmcRC2hyEYomSI/6BREMVAqNKAsIQ3VaxIBPdJWNoGc8NbXpGTPJQWEd8H85Sb39U2c0b4YUHhnnHjxM8Kcb5LHuPKE32WeD0JkAAJgABFvLOfA4p4Z88fe59GAlWtNFSELoWHMVkNBa0TXJkwPgeNjFDYk9WoiL7CkcahJnwrbFSr7C03hHhkbDkytbCQAAmQAAmknwBFfPqZJ/OOFPHJpMm2SCBFBJBOzrrPIcxAsOx7qDAQKvY5WPdFRDcgLCsTEaFR5koGvPRWb3lVmzzNrCzMZJSiB4HNkgAJkEASCVDEJxFmHTRFEV8H0HlLEiABEiABEiABEqhrAhTxdT0Did2fIj4xfryaBEiABEiABEiABBxJgCLekdMW6jRFvLPnj70nARIgARIgARIggbgIUMTHhc02F1HE22Yq2BESIAESIAESIAESSB8Bivj0sU7FnSjiU0GVbZIACZAACZAACZCAzQlQxNt8gmroHkW8s+ePvScBEiABEiABEiCBuAhQxMeFzTYXUcTbZirYERIgARIgARIgARJIHwGK+PSxTsWdKOJTQZVtkgAJkAAJkAAJkIDNCVDE23yCaugeRbyz54+9JwESIAESIAESIIG4CFDEx4XNNhdRxNtmKtgREiABEiABEiABEkgfAYr49LFOxZ0o4lNBlW2SAAmQAAmQAAmQgM0JUMTbfIJq6B5FvLPnj70nARIgARIgARIggbgIUMTHhc02F1HE22Yq2BESIAESIAESIAESSB8Bivj0sU7FnSjiU0GVbZIACZAACZAACZCAzQlQxNt8gmroHkW8s+ePvScBEiABEiABEiCBuAhQxMeFzTYXpUzE+/1+KSoqkoKCgioHu3PnTsnLyxO3210tkAceeECGDx9uG2jsCAmQAAmQAAmQAAk4nQBFvLNnMCUiftq0aTJhwgRp2bKllJeXy8yZM6Vp06YhUhs3bpSLLrpIvF6vrFmzRm655RYZNGhQlSQp4p39kLH3JEACJEACJEAC9iNAEW+/OalNj5Iu4iHas7KyZMuWLdKoUSO5/vrrpUWLFjJixIhQv+6//37Zvn273HvvvfL777/r7/DK5+fnR+07RXxtppR1SYAESIAESIAESKBmAhTxNTOyc42ki/jVq1dL165dZdWqVTruiRMnytKlS2Xq1KkhDpdffrnW6du3rwQCAQ2nQf22bdtSxNv5aWHfSIAESIAESIAE6g0BinhnT2XSRfyyZcukV69e8uOPPyqZGTNmyIcffihTpkwJkerdu7fgdeGFF+p3e+yxh3z66afSpk0bWbBggSxcuDCMKuLq4alnIQESIAESIAESIAESSA6BQw45RM4666zkNMZW0k4g6SIem1kRFoONrS6X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RYtk6NChMmbMmEzFwnEnSIDPVYIAebkjCVDEO3La2GkSIAEScC6Bv/76S7755htZs2aNet47dOigYTYsJJAIAT5XidDjtU4kQBHvxFljn0mABEiABEiABEIENmzYoClxEf735ZdfStu2beWEE06QUaNGMfMRn5N6S4Aivt5OLQdGAiRAAvYigNjlGTNmVNmpiy66SLxer706zd44ggDOsDj66KPlkksukb322ksKCwtl/vz5csstt8jGjRt5hoojZpGdrC0BivjaEmN9EiABEiCBuAj4/X7p16+fzJ07V/r27VspwxHSBObm5sbVNi/KXAI+n0+Nv02bNknjxo3DQHTs2FGmTJkSlg0pc0lx5PWNAEV8fZtRjocESIAEbE4AcfALFy7UTDUsJJAMAt27d5cGDRpI//79NXwGGY+QyvThhx+WH374gSlxkwGZbdiOAEW87aaEHSIBEiCB+k0Ap7UeNjQOMwAABSBJREFUdNBBDHGo39Oc1tHt3LlTY+I//vhj+emnnzTzEUJsLr30UsbEp3UmeLN0EqCITydt3osESIAESIAESIAESIAEkkCAIj4JENkECZAACZAACZAACZAACaSTAEV8OmnzXiRAAiRAAiRAAkklUF5eLi1btqyyzZ9//pkx8UklzsbsQoAi3i4zwX6QAAmQAAmQAAnERWD58uXSvn17zRPfrFmzsDbatGkjLpcrrnZ5EQnYmQBFvJ1nh30jARIgARIgARKIicB1110no0ePliZNmsRUn5VIwOkEKOKdPoPsPwmQAAmQAAmQAAmQQMYRoIjPuCnngEmABEiABEiABEiABJxOgCLe6TPI/pMACZAACZAACZAACWQcAYr4jJtyDpgESIAESIAESIAESMDpBCjinT6D7D8JkAAJkAAJkAAJkEDGEaCIz7gp54BJgARIgARIgARIgAScToAi3ukzyP6TAAk4msA333wj8+bNk4EDB0rr1q0dPRZ2ngRIgARIIH0EKOLTx5p3IgESIIFKBJ577jm56KKLZOHChXLssceSEAmQAAmQAAnERIAiPiZMrEQCJJBpBNauXSs33HCDiusjjzxSrrnmGjn77LOlqKhIRo4cKbNmzdLPZ5xxhkycOFF8Pp+cd955MmjQIBkyZIi88sorcvfdd8vjjz8uO3bskJtvvlm6dOki8+fPl5ycHLntttvkkEMOkTPPPFNWrFghRxxxhMyZM0fatWuXaag5XhIgARIggTgIUMTHAY2XkAAJ1H8CgwcPlunTp6soX7RokWzYsEF+++03mT17tlxxxRXqPcfx7hMmTFDRfsstt8g+++wjo0aNUvGOa9HGhx9+KFu2bJFzzz1XGjRoIFdeeaU88cQT0rRpU1myZInceuutMnXqVBk+fLh+5mmT9f/Z4ghJgARIIBkEKOKTQZFtkAAJ1CsCpaWlsvvuu6tn/ZlnnpFffvlFvv76a+ncubP06dNHvvjiCxXmbrdbunXrJosXL9bv9t9//2pF/LPPPiv9+/eXq666SoX833//LW+++SbDaerV08PBkAAJkEB6CFDEp4cz70ICJOAgAn/99Zd62a+99loNldm8ebOsW7dOPe3HH3+8bNq0Sf9G6dmzp/zvf/+T7777Tg4++GD1qN9///3y6KOP6vVWT/zrr7+u4TPXXXedTJo0iSLeQc8Eu0oCJEACdiNAEW+3GWF/SIAEbEEAYn3ZsmUqtufOnSuvvfaahtPMnDlTQ2fuu+8+adGihYbM9O3bVz322dnZ6o2HkL/33nvl559/jlnE4z6XXXaZ5Obm2mL87AQJkAAJkIC9CVDE23t+2DsSIIE6IoANqPCamwUie+jQoQIv/fnnn68bXlFatWolb7zxhhx66KEq3seOHavfn3DCCfLxxx/LRx99pJ58xMSjHjbCXn/99erhRzgN2jv66KNl+/btsnTpUunQoUMdjZi3JQESIAEScBIBingnzRb7SgIkkFYCJSUlgiw1LVu2lPz8/LB7Y6Mrft9rr700Nt4syETjcrmkoKAg5r6WlZVpBpuGDRuKx+OJ+TpWJAESIAESyFwCFPGZO/ccOQmQAAmQAAmQAAmQgEMJUMQ7dOLYbRIgARIgARIgARIggcwlQBGfuXPPkZMACZAACZAACZAACTiUAEW8QyeO3SYBEiABEiABEiABEshcAhTxmTv3HDkJkAAJkAAJkAAJkIBDCVDEO3Ti2G0SIAESIAESIAESIIHMJfD/D5JUWPJloqkAAAAASUVORK5CYII=",
"text/plain": [
"<VegaLite 4 object>\n",
"\n",
"If you see this message, it means the renderer has not been properly enabled\n",
"for the frontend that you are using. For more information, see\n",
"https://altair-viz.github.io/user_guide/troubleshooting.html\n"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"alt.Chart(footprintDF).mark_line().encode(\n",
" x = \"count:N\",\n",
" y = \"retainedSizePct:Q\",\n",
" color = \"type\"\n",
").properties(width=600, height=200)\n",
"\n",
"# utils.vega.svg($$,\n",
"# vl.markLine()\n",
"# .width(800)\n",
"# .data(footprintResults)\n",
"# .encode(\n",
"# vl.x().fieldN('count'),\n",
"# vl.y().fieldQ('retainedSizePct'),\n",
"# vl.color().fieldN('type')\n",
"# )\n",
"# );"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "08db27a6-3dce-4cbd-9988-16d589252c39",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>count</th>\n",
" <th>retainedSize</th>\n",
" <th>retainedSizePct</th>\n",
" </tr>\n",
" <tr>\n",
" <th>type</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>_helpMapMap</th>\n",
" <td>27775</td>\n",
" <td>520204</td>\n",
" <td>0.126386</td>\n",
" </tr>\n",
" <tr>\n",
" <th>_helpMapObject</th>\n",
" <td>27775</td>\n",
" <td>1599176</td>\n",
" <td>0.349078</td>\n",
" </tr>\n",
" <tr>\n",
" <th>helpMapTotal</th>\n",
" <td>27775</td>\n",
" <td>2119380</td>\n",
" <td>0.475465</td>\n",
" </tr>\n",
" <tr>\n",
" <th>baseline</th>\n",
" <td>27775</td>\n",
" <td>2376876</td>\n",
" <td>0.538931</td>\n",
" </tr>\n",
" <tr>\n",
" <th>docstring</th>\n",
" <td>27775</td>\n",
" <td>2376876</td>\n",
" <td>0.538931</td>\n",
" </tr>\n",
" <tr>\n",
" <th>bind</th>\n",
" <td>27775</td>\n",
" <td>3932276</td>\n",
" <td>0.918635</td>\n",
" </tr>\n",
" <tr>\n",
" <th>arrow</th>\n",
" <td>27775</td>\n",
" <td>4265576</td>\n",
" <td>1.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" count retainedSize retainedSizePct\n",
"type \n",
"_helpMapMap 27775 520204 0.126386\n",
"_helpMapObject 27775 1599176 0.349078\n",
"helpMapTotal 27775 2119380 0.475465\n",
"baseline 27775 2376876 0.538931\n",
"docstring 27775 2376876 0.538931\n",
"bind 27775 3932276 0.918635\n",
"arrow 27775 4265576 1.000000"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"footprintDF.groupby('type').mean().sort_values(by='retainedSizePct')"
]
},
{
"cell_type": "markdown",
"id": "4135a0c8-dfd1-4d9a-8fd1-de3defd8d71f",
"metadata": {},
"source": [
"## Something Funny with Help Map\n",
"\n",
"It seems that there is something funny going on with the Help Map.\n",
"\n",
"In this case, the load is split across two different parts:\n",
"\n",
"* _helpMapObject - the object that stores the function\n",
"* _helpMapMap - and the map that uses the function as the key to return the help documentation.\n",
"\n",
"For some reason, the sum total of the memory used for the Object and the Map (helpMapTotal) is less than the memory used for just a function returning a string...\n",
"\n",
"(This was confirmed by running the empty case of it just returning the function)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "a8124df6-c196-4a30-84f6-0c7973caff3d",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.vegalite.v4+json": {
"$schema": "https://vega.github.io/schema/vega-lite/v4.8.1.json",
"config": {
"view": {
"continuousHeight": 300,
"continuousWidth": 400
}
},
"data": {
"name": "data-aff63a698682880c82a3a5eeae2a83fc"
},
"datasets": {
"data-aff63a698682880c82a3a5eeae2a83fc": [
{
"componentOf": null,
"count": 100,
"retainedSize": 13952,
"retainedSizePct": 0.9208025343189018,
"type": "bind"
},
{
"componentOf": null,
"count": 1000,
"retainedSize": 132656,
"retainedSizePct": 0.9170445747151864,
"type": "bind"
},
{
"componentOf": null,
"count": 10000,
"retainedSize": 1276688,
"retainedSizePct": 0.9140824579290435,
"type": "bind"
},
{
"componentOf": null,
"count": 100000,
"retainedSize": 14305808,
"retainedSizePct": 0.9226096440765937,
"type": "bind"
},
{
"componentOf": null,
"count": 100,
"retainedSize": 15152,
"retainedSizePct": 1,
"type": "arrow"
},
{
"componentOf": null,
"count": 1000,
"retainedSize": 144656,
"retainedSizePct": 1,
"type": "arrow"
},
{
"componentOf": null,
"count": 10000,
"retainedSize": 1396688,
"retainedSizePct": 1,
"type": "arrow"
},
{
"componentOf": null,
"count": 100000,
"retainedSize": 15505808,
"retainedSizePct": 1,
"type": "arrow"
},
{
"componentOf": null,
"count": 100,
"retainedSize": 8352,
"retainedSizePct": 0.5512143611404435,
"type": "docstring"
},
{
"componentOf": null,
"count": 1000,
"retainedSize": 76656,
"retainedSizePct": 0.5299192567193894,
"type": "docstring"
},
{
"componentOf": null,
"count": 10000,
"retainedSize": 716688,
"retainedSizePct": 0.5131339282645802,
"type": "docstring"
},
{
"componentOf": null,
"count": 100000,
"retainedSize": 8705808,
"retainedSizePct": 0.5614546497673646,
"type": "docstring"
},
{
"componentOf": null,
"count": 100,
"retainedSize": 7420,
"retainedSizePct": 0.48970432946145726,
"type": "helpMapTotal"
},
{
"componentOf": null,
"count": 1000,
"retainedSize": 63068,
"retainedSizePct": 0.4359860634885522,
"type": "helpMapTotal"
},
{
"componentOf": null,
"count": 10000,
"retainedSize": 666140,
"retainedSizePct": 0.4769425956262243,
"type": "helpMapTotal"
},
{
"componentOf": null,
"count": 100000,
"retainedSize": 7740892,
"retainedSizePct": 0.4992253225372067,
"type": "helpMapTotal"
},
{
"componentOf": null,
"count": 100,
"retainedSize": 8352,
"retainedSizePct": 0.5512143611404435,
"type": "baseline"
},
{
"componentOf": null,
"count": 1000,
"retainedSize": 76656,
"retainedSizePct": 0.5299192567193894,
"type": "baseline"
},
{
"componentOf": null,
"count": 10000,
"retainedSize": 716688,
"retainedSizePct": 0.5131339282645802,
"type": "baseline"
},
{
"componentOf": null,
"count": 100000,
"retainedSize": 8705808,
"retainedSizePct": 0.5614546497673646,
"type": "baseline"
}
]
},
"encoding": {
"color": {
"field": "type",
"type": "nominal"
},
"x": {
"field": "count",
"type": "nominal"
},
"y": {
"field": "retainedSizePct",
"type": "quantitative"
}
},
"height": 200,
"mark": "line",
"width": 600
},
"image/png": "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",
"text/plain": [
"<VegaLite 4 object>\n",
"\n",
"If you see this message, it means the renderer has not been properly enabled\n",
"for the frontend that you are using. For more information, see\n",
"https://altair-viz.github.io/user_guide/troubleshooting.html\n"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"alt.Chart(footprintDF[footprintDF.componentOf.isnull()]).mark_line().encode(\n",
" x = \"count:N\",\n",
" y = \"retainedSizePct:Q\",\n",
" color = \"type\"\n",
").properties(width=600, height=200)"
]
},
{
"cell_type": "markdown",
"id": "f4f9ca7f-359c-4b11-9bd9-ac9b0d999e19",
"metadata": {},
"source": [
"Now lets look just at the help map vs the baseline"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "263f84d7-56f4-4597-bbf6-190bf0df0982",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.vegalite.v4+json": {
"$schema": "https://vega.github.io/schema/vega-lite/v4.8.1.json",
"config": {
"view": {
"continuousHeight": 300,
"continuousWidth": 400
}
},
"data": {
"name": "data-644bb5b04dab4d734c1725d30afad8bd"
},
"datasets": {
"data-644bb5b04dab4d734c1725d30afad8bd": [
{
"componentOf": null,
"count": 100,
"retainedSize": 7420,
"retainedSizePct": 0.48970432946145726,
"type": "helpMapTotal"
},
{
"componentOf": null,
"count": 1000,
"retainedSize": 63068,
"retainedSizePct": 0.4359860634885522,
"type": "helpMapTotal"
},
{
"componentOf": null,
"count": 10000,
"retainedSize": 666140,
"retainedSizePct": 0.4769425956262243,
"type": "helpMapTotal"
},
{
"componentOf": null,
"count": 100000,
"retainedSize": 7740892,
"retainedSizePct": 0.4992253225372067,
"type": "helpMapTotal"
},
{
"componentOf": "helpMap",
"count": 100,
"retainedSize": 5552,
"retainedSizePct": 0.36642027455121434,
"type": "_helpMapObject"
},
{
"componentOf": "helpMap",
"count": 100,
"retainedSize": 1868,
"retainedSizePct": 0.12328405491024287,
"type": "_helpMapMap"
},
{
"componentOf": "helpMap",
"count": 1000,
"retainedSize": 48656,
"retainedSizePct": 0.336356597721491,
"type": "_helpMapObject"
},
{
"componentOf": "helpMap",
"count": 1000,
"retainedSize": 14412,
"retainedSizePct": 0.09962946576706116,
"type": "_helpMapMap"
},
{
"componentOf": "helpMap",
"count": 10000,
"retainedSize": 436688,
"retainedSizePct": 0.3126596634323485,
"type": "_helpMapObject"
},
{
"componentOf": "helpMap",
"count": 10000,
"retainedSize": 229452,
"retainedSizePct": 0.1642829321938758,
"type": "_helpMapMap"
},
{
"componentOf": "helpMap",
"count": 100000,
"retainedSize": 5905808,
"retainedSizePct": 0.38087715261275,
"type": "_helpMapObject"
},
{
"componentOf": "helpMap",
"count": 100000,
"retainedSize": 1835084,
"retainedSizePct": 0.1183481699244567,
"type": "_helpMapMap"
},
{
"componentOf": null,
"count": 100,
"retainedSize": 8352,
"retainedSizePct": 0.5512143611404435,
"type": "baseline"
},
{
"componentOf": null,
"count": 1000,
"retainedSize": 76656,
"retainedSizePct": 0.5299192567193894,
"type": "baseline"
},
{
"componentOf": null,
"count": 10000,
"retainedSize": 716688,
"retainedSizePct": 0.5131339282645802,
"type": "baseline"
},
{
"componentOf": null,
"count": 100000,
"retainedSize": 8705808,
"retainedSizePct": 0.5614546497673646,
"type": "baseline"
}
]
},
"encoding": {
"color": {
"field": "type",
"type": "nominal"
},
"x": {
"field": "count",
"type": "nominal"
},
"y": {
"field": "retainedSizePct",
"type": "quantitative"
}
},
"height": 200,
"mark": "line",
"width": 600
},
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAvEAAAEPCAYAAADLSJsVAAAAAXNSR0IArs4c6QAAIABJREFUeF7tnQd4VFX6xr9JLyQQem9iRURQUXZRrICiYKOoWLCs2FhRlMUHC+LadimK4uqCoCyouP4XsYBtpSpgQ0RXmoggoIQSAunl/7zfzJ3cSWYyk+TO5N6Z9zyPTyaTe88953eO+p7vvuc7rvLy8nJhIQESIAESIAESIAESIAEScAwBF0W8Y8aKDSUBEiABEiABEiABEiABJUARz4lAAiRAAiRAAiRAAiRAAg4jQBHvsAFjc0mABEiABEiABEiABEiAIp5zgARIgARIgARIgARIgAQcRoAi3mEDxuaSAAmQAAmQAAmQAAmQQNhEfFlZmeTn50t6enpAykeOHBFcl5GRwZEgARIgARIgARIgARIgARIIkUBYRPzs2bNl2rRp0qZNGykpKZF58+ZJs2bNvE0qKCiQm266SXJyciQuLk569OghEydODLHJvIwESIAESIAESIAESIAEYpuA5SIeoj0xMVEOHjwoDRs2lNGjR0urVq1k/PjxXtJz5syRtWvXyowZMwRp6v/zn//I4MGDJT4+PrZHg70nARIgARIgARIgARIggRAIWC7it23bJueff75s3bpVHz99+nRZt26dzJo1y9uchx56SL788kv56quvpG3btvLYY4/JhRdeGEJzeQkJkAAJkAAJkAAJkAAJkIDlIn79+vUyZMgQ2bhxo9KdO3euLFu2TGbOnOmlPXLkSFm+fLm8//778s0338h9990nv/zyi7hcLlm5cqWsWrXKZ2SaN28uffv25WiRAAmQAAmQAAmQAAlYSKBz584W1saqIknAchGPzaxpaWm6YRWifOrUqdqfMWPGePt1zz33SHJysjzxxBP6XYsWLVS4d+nSxW/fn3rqKRk3blwkufBZJEACJEACJEACJBDVBH766SexQsRjj+Nzzz0nZ599tvzxj3+MamZ26pzlIh6d6969u/rdu3XrJv3799dNq/369ZM1a9bod2+99Zb885//lI8//lh27twpvXv3ll27dgX0xFPE22nKsC0kQAIkQAIkQALRQMAqEQ83RYcOHTQ4+5e//CUa0DiiD2ER8YsWLZIRI0YogIEDB8r8+fM1Kp+ZmalCHqs+bHiFnQZRe4j84cOHBwRGEe+IucRGkgAJkAAJkAAJOIiAVSIegdqPPvpI9zk+/vjjuh/y9NNP15979uyRQYMGaQITJDNZsmSJnHXWWfLGG2/o93fffbcuALZs2aIBYGQ0PPbYYzXLYc+ePR1EM/JNDYuIRzfy8vI0hSQy0wQqBw4cUGEfLCsNRXzkJwafSAIkQAIkQAIkEN0ErBLxENywTV922WUyadIkufPOO2Xp0qWSm5srCxculGuvvVYDt3BiINEJ9jrCerNgwQL926uvvirnnHOO/PDDDwLL9UsvvSR79+6V3bt3V3veUHSPTvDehU3EB3906FdQxIfOileSAAmQAAmQAAmQQCgErBLxle00SCWOJCZvv/22Rtzfeecd2bdvn9x2220q4iHOW7ZsKRdffLG89957YrTjjDPOkAsuuEAXACtWrJDFixfLgAEDQulKTF5DER+Tw85OkwAJkAAJkAAJxDqBcIl4nBWUlZWlUXZE4m+++WaZMmWK/oSI/+233zQaP3ToUHnzzTflk08+kfPOO083xSIib5Rhw4bJiSeeGOvDFLD/FPGcGiRAAiRAAiRAAiQQgwSsFvE33HCD/P3vf5cmTZrIVVddJa+//rpSXb16tXrkDRE/atQoOeWUU+SWW26RK664Qu0zuOeYY46Rl19+We/DHkpE8quzZcfgkPl0mSI+1mcA+08CJEACJEACJBCTBKwS8SUlJZqZEJ52pJq844471CYDuwySmWDTKhKcGCIethkI+4yMDN3o+oc//EEtN4888oh8/fXXOhaTJ09WfzxLYAIU8ZwdJEACJEACJEACJBCDBKwS8UCH84EOHTqkWQeTkpJk7dq1Gn03p500RDyy1MAX36xZM0lISPAhD39906ZNtR6W6glQxHOGkAAJkAAJkAAJkEAMErBSxJvx/fvf/5YhQ4boV8YmVnw2i/gYxG15lyniLUfKCkmABEiABEiABCJNoLyoSEr37pWENm0i/WjHPi9cIn7Hjh2yfv163ajaqFEjL58NGzbo4Z7IK89SdwIU8XVnyBpIgARIgARIgATCSKDs8GEpzc6W0uy9UrLX/RO/l+x1/yw7dMj79DavvxHGlkRX1eES8dFFyb69oYi379iwZSRAAiRAAiQQ9QRKDxxwi/K92VLiEef4rII9O1vK8/ODMnAlJkpcVpbEN2okzR6dFPR6XuAmQBHv7JlAEe/s8WPrSYAESIAESMCeBMrKfKLllaPopfv2S3lxUdC2u1JTJd4j0A2hHt8oS+KyGgl+Qrjj+7j09KB18QJfAhTxzp4RFPHOHr8qrc9+bJK4UlIlLjVFXCn4J1Xi8FN/93z2/B6Xkuq5JsV9TUqKiMsVZUTYHRIgARIgAasJlBcWqv8ckfIqUfR9+6R0/36kKwn62LiMDBXocRDjHlFeWZxDpLuSk4PWxQtqToAivubM7HQHRbydRsOCtvw6fFida4GYdwt/t8h3C/xUXQh4P+N7z8Kg4npjoZAsrmRjEZEieM3JQgIkQAIk4AwCZbm57gi6x+Li9Z/v2ydl+/ZL6cEDIXVEo+SNG3sj5nGNGpki6hVRdImPD6k+XmQ9AYp465lGskaK+EjSjsCzCtatE0RIygsKpLywQMoLCqXM89P/77iuUMr0evd94SgQ8r5vCDyCP9gbA+8iAte7Fwd8axCOEWKdJEACsUAAEfKKyLmxQRSRc3f0HAI+aImLU3Ee37iJRs8DRtEbNgxaFS+oXwJ2F/Gffvqp9OnTRxJDCAb+73//01Nfmzdv7hcq8tajnh49enj/vmfPHj2gCodP1SQvfXZ2tmbfwamzDU3z/LPPPpPMzEw58cQTIzKwFPERweychxhCvrLwh7gvg8g3FgSeRUJZgem7wgKp/Ltxn5SWWg8hLk7UEuRZCPh9Y+B9e+B5M2BaBLjfIPCtgfUDwxpJgAQiTqC01G1t8WRrMTaFqmhH9Hz/vhA3iCZJfBMI9MYSnxUoip4lcTyIJ+JDHI4H2l3Et2jRQn788UfJysoK2v0//elP0r9/f7niiiv8XgvBjdNgi4qKvIsCnAg7depUfcaxxx4b9BnGBcZptMbptPj+t99+k5YtW8q1114rr776ash11eVCivi60OO9oREoLXVH+s1vByr/XsO3BbrYKAq+ISq0BvpeVWEhqvy2oNK+gpRk91sBk3XIeEvAtwa1Ic97SIAE/BHAfzuNVIqGtcUQ5oZID3mDKKLnhkjHhlCzF91jd3ElJXEgYoSAE0T85ZdfLv/3f/8np512mrz22mvSoEEDPQX2hRdekLZt28rzzz8vPXv2FEPEFxQUyMqVK/XE2IMHD+p1yEsPEX/48GGZPn26/l5SUqLCHd8tX75cI+h33HGHrFq1Snr37i0vv/yyIFI/ceJEyc/PlzVr1ghE/7hx4wQiHp8bN24sn3/+uc6Wl156SSZPnqyn1ELEz5w5UxcIOJF2zJgxcsMNN+g9paWl8u6770qrVq1k7ty50qlTp1rPNor4WqPjjfVNwPvWwLQ40IUC3hp4v/P3dqCyxcjXUiTl5ZZ3zW0ncr8NqPr2oGIhoG8GPNeZrUN8a2D5kLBCErAFAeQ39/Gfe2wtZpEe8gZRw+ICkW7K3mL2oktcnC36zUbYg4ATRPyll14qY8eOleuuu04FdOfOneWqq66SBQsWyEcffaTCefv27TJq1CiNxOPzU089JbC2wGLz8MMPy1dffaUifuDAgXrYFAT2smXLVHivXr1a3n//fZkzZ44K7AkTJsj48eP1OWeddZb06tVLFi9eLEcddZRae2C/wT0vvvii/Prrr4LTaSHEzznnHDnzzDPl559/lmeeeUY6dOggX3zxhcTFxemz9+7d631LMGvWLEEUv7CwUJ5++ulaTwaK+Fqj441RSaC6twZqKfK8UdDFgmcvgXkR4cdShAVF+OxEFVmIEP2veBPgXhiY3wzwrUFUzlh2ysYESpGlxWNxKYE499ha1Hteww2icUb0HJH0xp60iuYoemamjUmwaXYlYKWIf+Cfn4bUzcdvOSek63AR7DQQ0Ii0/+Uvf9HIe25urkbLEaFHuemmm+SXX36RSZMmeUX8zp07ZcqUKfp3iO8VK1bIJZdcouIadhsI/XvvvVfOPfdcuf/++1XEQ3TDgw/hP2/ePLngggv0WkTQv//+e63r9ttvV7EO/zxEPE6kjY+P10UFovuPPPKIvPPOO/LKK6/Ili1btJ3fffedtuXAgQMyYsQIufnmmwULEywAsEjYunVryDwqX0gRX2t0vJEEQidQo7cGJquR14bk2Xhs3oAcNjtRsvttQJzXJuTZN5CcJK4kfPb8TEqSuMrf+bkGqeHwet78M3RyvJIE7EegvKTEK85VqPuJntd4g6hXpPtG0TW9Iv3n9psEUdIiJ4h4wxP/4IMP6qZViGxE0/v27esdBQhtROmNSDwsMg899JD+vV27dmp/GTlypEbep02bJoMHD1brDAR09+7dVcTDPgMRf/3116tHPj09XUU8xD7sNigQ4FhQQPBDxP/tb3+ToUOHqpVn3759cvzxx6uIh2hv1qyZtunUU0+VIUOGeEU86sNCYNu2bfrsQ6bThms6rSjia0qM15OAXQjU6a2Bx3LkeaOADcvGgiEcdqIq0QOIeq+wNxYGvkLfR/ibFg/ehUOlhUHlhYL6ennugV1mq2PagdNB1X++L9sTOXdvCq3TBlGTD919WBHyorvTLTIFr2OmRlQ21EoRHw5A5o2thoiHdQWec/jjEc2+8MIL5ZtvvpE777zTK+IXLlwoS5culQ0bNqiAhiiHmIaI37Fjh9x6660aRYfXHpF6iPhBgwbp32GZgYXm/PPPlyuvvFLOO+88FdxJSUly8sknq6Bft26divhFixZJ165dBdlqPvzwQ9m0aZOKeNwHPzwWBbgGi4b9+/frpld4+2HxgZcf7YJHv7aFIr625HgfCUQpAb9vDTQzkXszcXkRPvv+LKv0u/fvuN64z/QzUuhU2PssGEJbKBhvG+L8LhSqvpGgzzhSI1q355QdypGSvdnuVIp+ouc1OkHUvEFULS7I6OIR6J5Di7iIrNt48e7wE3CaiIeov/HGG9XiAp872m9kiEE0fMCAAepJh4CG5WX37t3yz3/+U4YNG6a+dHzGZlZsjp0/f77aYPA7hPaSJUvk73//u25wRbQdonz27NkyfPhwjaojun/NNddolB0WH4h4LBYee+wxvQ5R/TfffFNFPIQ56kDKS4h/bIyFkMdmW7xJwGZXbLqFL/+4446r9UBTxNcaHW8kARKoLQH/iwE/gt/PggH3arrTAAsE9/fuRUYk3iqAgW5c9if4zfajEK1HvgsH3wUDFwuBZ5x6zzWdoidqbtUGUWOzKA4t8kTPccooCwlEAwE7iHhkiYEYrlywsRRCOFBB5pjk5OQq6SchspGh5rbbbtO/1yT/O6LlKSkpek9OTo5s3LhRN7kiUg8RD1EeaikrK9PsNq1bt9ZMOGgTFgTw9iP6D2sQ/PR1KRTxdaHHe0mABGxNoLy42PMmwHh7EOJCwXiz4FkwSHULB6Q6DeF4eStAuRISfPYWBLIcefcthLBHocq+BtiQ6vg/Fiv6atSBMaxOmNdpg6h5s6jaXBrpSdUsJBArBOwg4pERBllcKhdEvyF2a1oMEf/AAw/U9NYq16NdEN2ffPJJnetCBRdffLHWB8uOFYUi3gqKrIMESCCmCehiwd+bAX9vEipbj0xvDiqsR0VShnsr1RnRxUJt3yzofZUsR6bN0MYG57jkZO2f+s01a0tV73mtThD1yeLSWOKb4FRRtwed/vOY/teUnfdDwA4i3uqBgXUFJdWCBTki6Hl5eWqxsaIgsw7aBTuNFYUi3gqKrIMESIAEIkAAWVGq7DEIZaGgCwf/+xlgPaq8YAhLStRa8nElmk4QNW8Q9frQcbJo8NMca/l43kYCUU0gGkV8VA9Ypc6FTcTDC4TVEFL01LUgaT/S9LCQAAmQAAmEn4AuFmr6ZsHn+gALBs81ZbAgFRaKJCVJvL8NohpNd28Wpf88/OPNJ8QuAYp4Z499WEQ8dukiD2ebNm3UzI+k+fA2GQUnVOF37CJGwc5gJOkPVCjinT3J2HoSIAESIAESIAH7EbC7iEeKRvjHExMTg8JD1hdsPMWGUX8FmWFQT48ePbx/xsZTnMB6xhln1GgDrFEBMuR8++23apHBJlzoWZQvv/xSunTpIo0aNfI+C7YcHPx0+umnB+1LqBdYLuIh2gEJqXMaNmwoo0ePllatWunuXqMgLyaS8CO9Tyi+IIr4UIeT15EACZAACZAACZBAaATsLuLNeeKD9QgpJnHYEw5o8leQYvLrr7+WoqIi76Lgnnvu0XSU0KWGAA/2HPwdWheHQoEfnonMNUgtiYOfEJTGBlbktTcL9t9++01TXE6YMCGUR+g1OCn2H//4R8Bc8paLeCTER4J84xhZ5MpEUvxZs2Z5G/3uu+/K1VdfrUfnIuk9RDpOrwpUKOJDHm9eSAIkQAIkQAJRS6CgpEQK8U9piRifK393XucuUdt/qzvmBBF/+eWX66FM0Is44Ak53p944gl54YUXpG3btnpoEqLghohHKseVK1dqTnYElHFdv379NE88xDZ0KX6HEIdwx3c4wAmbV3GK66pVq6R37956gisi9RMnTlR7+Jo1awSiH/ZuHDaFej/77DNxeQ4VhKaFAwVvD3CYE+zkOHAKqTLnzp2r6S6RMQefN2/erO3dsmWL5p5Hrvny8nKt/5VXXpGzzjpL23nppZfK+vXr5cknn/RrK7dcxONhOB0LuTVR0Fgks585c6Z37iFVD1ZDOF3rjTfe0MHAKgggAB4AKxfUyUICJEACJEACJOAMAuUiUlxWJkVlpZ6fvp+NvxWVlXn/XlxWKvjd33eh9vqOY7qGeimvE1GRadeCSDyE7NixY+W6665TIYv24pCmBQsWyEcffSSTJ0+W7du3y6hRo7wntiL4C4ENiw0ENWwvEPEDBw6UXbt2qSaFNsUJratXr9Y88HPmzBGku0SkHO4RPAdiGqe34nAnpLuEtQf2m0cffVTz0z/yyCM+6C666CINUr/++uu6SIAQR6Qfuedvv/12fUsA+w1OdMVCAUHvW265RfUwFiSo79///rcuEI4cOaKLDXyHg6f85bu3XMRjtYIHYWMrRDkajzJmzBhvR/EqAwnu8Q+AwVKDY3DRAX+FkXi7/uvFdpEACZAACUQLAUQCC0o9kW4cTlMp4o0IuN/vTPcgQq6RcmyOthhMckKCJMfHS1J8gng/63fu7/Ed/nbRMbU/AdPiJtu+Oisj8QX/8m9jqQwhZcRbIXOBiIeARqQd+dWhExHxRrAXEXqUm266SX755Re1scDaAkG/c+dOPVkVBeJ7xYoVcskll8gzzzyjQhrX3HvvvXLuuefK/fffryK+Q4cOGkWH8MdezgsuuECvxemwsLWgQIjDOYIIe0ZGhkbIzaV79+7eaDvug1hHUBvi/oMPPtD6sGiAToZQx2muCGzjLQAs6Mccc4yeSAv/PNqIvmJBEShPveUiHp1BJ2bMmCHdunVToHgVgdUEXkXgO4jyvXv36jVYKV177bVe+w1FfMhz2++Fe48ckaZpad7XO3WrjXeTAAmQAAnYlUBZebmK5SrC25/dxI/QNgS5255Sqq/zrSwQ1CkJZtEN8R2vojvJI8gN4W0W4d5rPMJcRboK9Lqdbmll36KlLieIeDg1EPWGxxybViGyEU3v27evdxggmBGlN0Q8LDLYe4nSrl07ee+992TkyJEaeUfilcGDB6t1BtZvaFaIeNhnIOLhdcczYYeB6IbYh90G5eabb9YFBSw7sIkb4h5/w2mv2FgLpwnaahzqBDGOxYIh4vEsLEaMRQbuPe644wRJYeA6wT+I4sMKhPGJuIhftGiRjBgxQjuMVxfYwIqoPFYaEPLYrYtXCIjA4x+IfGwCCFQYiQ/9Pxf3LnnHe3Hj1DRpkoZ/0lXYN0lN9/6eYtFBA6G3jFeSAAmQQGwTgOgO7OkuVjFeVFLqjXYb3m8jsg2hXfG5RFCflQUi2R3hNiLdFRFvr9j2inC3GHcLcs9nI1LuqYOi28rRCU9dVor4cLTQvLHVEPGdOnVSTzr88b/++qtceOGF8s0336glxRDxCxcu1Gj5hg0bVBRDlJ966qkq4uH8uPXWW+WPf/yjeu0RqYewHjRokP4dlhlYaKBTEUk/77zzBPs9ETU/+eSTVdBD08L/judgQYAFMMT2f//7X/XiQ9PiebDCwLOPaDwSvRh2GiwcYN9BfVhstG7dWutHYBttwIICmWygpeGTh9XcXwlLJB4PwquAnJwczUwTqGDDQMuWLYOOO0V8UETeC55dvVJyCgokp7AgaFSlQVKyr8hPS5cmKvzTJTM5OfSH8koSIAESiEICpRrpLnZHu/1YS7yi2m+Uu1Q3X5qFuNWiOzE+XlIMwe0jpD3iu5L9xEekw5biFezuaDlFdxRO4iBdcpqIh6iH3QSRd/jc0f7nnntOo+rYKIrU5T///LNauWFZ2b17t2aEGTZsmHri8RmbWbE5FgFmeOvxO4LPS5Yskb///e8acEa0HT50RMeHDx+uadER3ccmVCOCjug+7kd6SVjJTzrpJHnzzTdV90LEQ/gjYg/nCew8RmQfnvi3335bxTkK/PJYGGAhALvO559/rm1H/XgDgUULNsQisl+5hE3EW/mvAkV8zWkeKixwi/mCAjlYmO/9bAj8nIJ8KSotrbZi/AfdG8X3CPymaenSOC1NslLTJN6zI7vmreMdJEACJGA9gdKyMh9rSYU/u7Ti+yqC2xPdriS4Ib4h4q0sEN3uKLcpcu0R0ng76v2bx9tt/B7IA476WEigLgTsIOJhHUFEu3LBxlKI6UAFgWBkfIHQNReIbIjn2267Tf/ub0NooDphiYGoxj0IRCOCjgg7IvUQ8bDLmAv2f2LRAD975b/hOqSVbNy4saa0xIZY2Mex+EBBv+Hl79ixo8TFxXmrhY3GnF8e1+E5iNRTxNdltkfRvfnFxXJQhb5J4Jt+P1hQIHnFRUF77CPy09KkaapH5KekSmoIhzMEfQAvIAESiFoCVUW3r12kIopdIbQRES8ypRc0R8NRn5UlMQ72kqqCWy0nJk+3135SKbJt+LwND3ii6X/UVraTdZFAbQnYQcQjwckXX3xRpQuIfsPqUtNiiHhEr+ta0C5EwANtLK1J/egLMuwgW45VhZF4q0hGWT34n+EBH4HvFvsQ9yr8PZH+YN2GLQdCH958RPHhy9dIfkqqNExJCXY7/04CJOAwAsWlpZJbVCi5hZ5/jM9+voMYt7IkxMX5erpNQrvCdlLZ8+3rA1fLiceigvpYSCCaCdhBxFvNF9YWFNhc6loQBYc9HBabupZDhw5ZUo+5HRTxdR2VGL4flp0D+RWC3m3fMf+er7l/qyt4hewV+Z6Nt4bIh2WH/xON4QnGrtuGQElZmVuU+wjyAu93h02CHZHyUIuv6DZvjjR7uo3P7r9X2E7Mmy/dnm7+9yJU8ryOBNwEolHEx9LYUsTH0mhHuK/4nzlE/kGN6PuKff2usEBg66muxLlclSL5aYKsO1mpqfpPWmJVj1iEu8nHkYAjCZSWe4S5SZwfDhBBD/bvqRkAfNoZScmSkZxc8dPv5xRupHTkzGGjo4kARbyzR5Mi3tnj5+jWI1MDLDsHvUIfdh1fsY9of7ACW4568z2ZdRqrwE+TRviZUvfXacGez7+TgF0I4N8pI1qu0fFqrCyh7Hkx+oUIt48oV5GeUkWoI+MV09faZTawHSQQnIBdRDzagWL16bHIKY8Np7DF4OAkZKKJpkIRH02jGYV9gQiByPdG9L1ZdxDhd6fSDLaZDRts3X58d/pMt8hPlUaI6KekMhoYhfMmmrqE/CgVgrzCwuJjb/EI9iNFwTejG2ziIcwDRMwbVIqcpyYkRhNS9oUESMBDwC4iHptRkYFl7Nixlo4N0k4idzzSPiKnPHLGR1OhiI+m0YzBvmBjHAQ+Ivrqz0dk35Na0735Nl/zO1dXIGbMh2HBrmNE8RHRb+AnrVMMomaXLSbgta74s7BUsriE+mjYz8wRc0TG/dtaUiSN2aNCxcrrSCBqCdhJxH/88cea0hHl2Wef1cNCV61apSkekXMdAhxi/8CBA/LnP/9ZT0Dt3bu3HpqEFI9PPPGEvPDCC3oaKg5YQnpKQ8QjPePmzZv18CYcuoRNrziYCYcpTZ48WaP0d911lyxevFjOPPNMefHFF/2mjLTbRKCIt9uIsD2WE3CL/Dy32PduxK1IrYlof7CCyL1x4q2vyHdbd1zBKuDfY4IAIuGBLSzuKLoh3kPNQI65BSHuFeSwsRji3BwxT0qWdC44Y2KesZMkYBUBO4l4nAkEEY3DkHDo0vfff68np95///16emrfvn31sCbkWcdppn/9619l3Lhx+n23bt304KUFCxbIRx99pMJ8+/btMmrUKI3EQ6SvX79eD1M6+uij9TrkZ0f9yOWOQ5pwWipOWEW9OJEVBz3ZvVDE232E2L6wE4DwMiL5B/Lz1JdvWHWMPPrBTlqEeDLsOsam26wUzwbclFRNe8fiTAJ5xcWSW1jgN21i5Wh6sHliJhA4Su4bPcd1LCRAAiQQDgJWivjsRyeG1MSmD1XNk44IO6Lt06dP1zpwMus333yjBxx9+umnGqF/+umn5bXXXpP4+HgZOnSoivtBgwbpSamIwiNqf/nll+v9N910kx6kNGnSpCoiHqJ+69ateh1EPKLuWAxgIdC1a1fZuXOnvPLKK95rQupUPV1EEV9P4PlY5xBA3muvyNeNuHm+OfT+XWVjAAAgAElEQVQLCvR49eoKMnZA5MObX2HVcUfx4ctHpJUlcgTySyDMK/KY+2wCrbQhNNieC3OrsZgLFCVXW4snig7POd/eRG68+SQSIAH/BOwk4nHKqnFAU7t27eTzzz+XwYMHS5cuXeTCCy+Ul19+WcU2bDY4fAmnvEJs43tYY3bt2qVReaPccMMNen3lSPwVV1yh0X6UPn366MIBNhs8C89FwYmtt956q+2nDUW87YeIDXQCAUTvDW++eSOukW0nlA2HsOngUCxD2GtEP8Uj9FNTBX5nlsAEsPfBb4pEcxTd4z9H3vNQC9KYBkyXmJQsugnUY2vhGIVKldeRAAnYgYCVIr4u/UEkHqJ86dKlapVBpH358uXSsmVLPWxp//796nV/9913Ze3atXLKKadoFB7e9x9++EFF/quvvqqRemxgxe+I5N95550hiXjc1759e71+0aJF8u9//1vrs3uhiLf7CLF9UUEAlgx3hh2PN98j+t059N0bcIN5pBHh1YOwVNxXWHUM+05KFGYQKcLpnwGsLJVPBcUbk1ALsq24I+O+ucz9WVziXTy1M1SuvI4ESMBZBOwi4qdOnSr/+Mc/NBUk2oQI+3XXXacRcqSJRIGXHWIefnl45GGjwSbXuXPnynHHHSeIvMMvj/ufe+45ueOOO3Rj64ABAwSnpRqeeH+R+JSUFLn++uslJydHdu/eLR9++KGcccYZth9MinjbDxEbGAsEEBk2cubDl1/h0fdk3CkskGAiFadZVpx2606jCbGv9p3UVGmYnGILlOhHZQHuL10ivkP2oVAL8pMbVhbfFImmjaCeDaE82TNUqryOBEggmgnYRcQbjCGi4Xlv0KCBFztEdfPmzfV7iPasrCyNzsM+c9RRR+kmVKPs2bNHkpOT9ZralJ9//lmj/xD1TigU8U4YJbaRBEQEB18ZGXa82Xa8qTULJNjhPfjPXOO0dI9FxxD5yJdfEdmvrbjFIsRHiKttpSKnuXrOPV7zYCk/zYOdFJ9QrZXFHE3HvgMWEiABEiCB0AnYTcSH3nJeCQIU8ZwHJBAlBApK3JYdcxQfYl89+h7bTrCuQhS7ffi+UXx4vc3pESsL9vzi4mBVe/8OsR3okCFfi0sKD+IKmSovJAESIIGaE6CIrzkzO91BEW+n0WBbSCCMBJD+sHLOfK+Fx+PVr8mGT3NTEcH38ZerbSXFr+ccthcWEiABEiCB+idAEV//Y1CXFlDE14Ue7yWBKCOACHvlnPkQ/lgAmKPkvp7zZMFGURYSIAESIAFnEaCId9Z4VW4tRbyzx4+tJwESIAESIAESIIFaEbCLiMcBSzhV9fjjjw/aD2x0RbaZY4891u+12dnZmokGaSgbNmzovQYnsmZmZsqJJ54Y9BnGBUhfic2ylcvJJ58sjRs3DrkeXIg8+OvWrbM06w1FfI2GgBeTAAmQAAmQAAmQQHQQsIuInzNnjuZ7x6mswcq8efNkzZo18uyzz/q99L333pOLL77Ym2YSF/3222+adebaa6+tUf73t99+Ww+GwiLj9ddfl7Fjx+ozr7nmGs2MYy7ff/+9psk0Tp2t3Ljt27dLv3799PRZqwpFvFUkWQ8JkAAJkAAJkAAJOIiAnUQ88r0jdSQEM3LBDxs2TDZv3qy53rds2aLC+bHHHpM33nhDRfyoUaNk4sSJkp+fr7/fc889ekIrRDw+I1KOU19RXnrpJZk8ebKcfvrpKuJnzpwpyE2fkJAgY8aM0RzzuKe0tFQPlGrVqpXmn+/UqZPe/+WXX2p7tm7dqr/Pnj1bHnroIf38yCOPyE033STdu3fXNwBPPvmk5rhHnvpVq1ZJ79699VRZvGmoFxH/xRdfSMeOHaVZs2baYLwSwIlZgIF8nOEuTz31lA4MCwmQAAmQAAmQAAmQgDUE7CTiR44cqWIckWoIYUS2cdgTRDAOd7rlllv0RFXki8d1iKr36tVLFi9erFHxPn36aDR/9erV8uKLL+rJrTh5FUL8nHPOkTPPPFOQB/6ZZ56RDh06CLRtXFyc2m727t0rOAQKZdasWRrFLyws9L4ZMIv4w4cP6/OwmDhy5IjceOONsm3bNoFdB4IeB0VNmjRJFwQTJkyQ8ePHS+fOnbUvERXxWPkAJhqIfwAIBSsjrFwAAyDCXSjiw02Y9ZMACZAACZAACcQaAStF/Iy1n4WE7/Zef6hyHew0Cxcu1H9w4FOjRo00Kp+WliYvvPCCJCUlySeffKKedmhRQ8Qjgg6xj3L77berWMc9EPF//OMfVfBfddVVKp4hsN955x09DRb6FlHy7777TqZMmaKHSI0YMUJuvvlmufTSS3UBcNZZZ3kj72YRj0g/rDWI1KMg6j5kyBBp0aKFCna0E8HuTz/9VE+bhf3nggsukNtuuy2yIh7epEAR8IyMDO00AIW7UMSHmzDrJwESIAESIAESiDUCdhLxhice0W2c2ApbTdu2bVVkG+W4446T/fv3e0X8vffeK8uXL9c/Q4D37NlTg8sQ8X/7299k6NChasfZt2+fbpqFiEd9cJZA35566qkqwA0Rj/qwEEBkHfYYbKBFMYt4+N43bdrkbRdsPoiyt2nTxiviUTdE/PXXXy8//vijpKenR17EB4rEo0Ndu3ZVi02gUlZWpj4lNLy6gsHANdXZcijiY+0/K+wvCZAACZAACZBAuAlYKeLr0lbzxlZDxJeXl6uQxt+QDQYe9NatW2s03ojEn3feeSq4EanHNRD0yAADEb9o0SLVqshWA4sLhDdEPAQ3/PAQ2bhm8ODBujCAPee0006Thx9+WJ5//nkV38YmVbOIhxsF0Xq0AT53WHrwTPjl4atfuXKlZs6BDx9vDfB32IHwpiCidhpjQH755Rc1+uPVAjYKvP/++zJ8+HBdKfkrMPxPmzZNVyUlJSX6KsHw05uvx07dbt26yZIlS+QPf6j6esW4liK+Lv9q8F4SIAESIAESIAESqErA7iIe2WEgjFFSUlJUpEMzYl8m7C8Q8dCX8KkjIo4oOzzyEPGw5mAjLDQpBPabb76pIh7CHBH7Jk2aqPhHwBlCHnXC/oLNrgcPHpRly5YJIv8olTe2wlI+f/58vReWHmTKQbQf/vsHHnhAUlNTdXMuFhx4FhYReDYWChHPTgMfD14fAEz79u11ZXP22Wer7webAswFoj0xMVEBID/n6NGjdZcvfELmUlRUpK85sIKC34kinv95IQESIAESIAESIIHIEbCLiK+ux9CVCCbD/WHWnNiY+pe//EUDyxDxEOWhFrhFkP8dkX3UDw87gtOoD5tWmzdvHtQuDgsO6jE/F3XhOywOEN3HwgMeffj8IehdLleoTQzpuqApJvE6A7k1L7roIl3ZACBeM9x99936auLoo4/2eRBEOV4bGGl4sOLBawbs9jUXrKywgsLf8YqEIj6k8eJFJEACJEACJEACJGAJASeI+EAdNUQ8AspWFOSWh4g3krhYUWe46wgq4pEiB68Wzj33XH0dgI2sjz76qHqGvv76a+nRo4dPG5EjE5sEjNcF2L2LVxLIyWmUt956S/CKBLk6BwwYQBEf7lFm/SRAAiRAAiRAAiRQiYCTRTyi3shggwi3FQX+dthgoHmdUoKKeHQEuTuxsQAFWWnQUaTugXm/coE/CK8O8DoBrw2weQAF/iGjIOfn77//rq8gsJI65phj1DePXcKoE2l/KhcsDFhIgARIgARIgARIgASsI4Ac5izOJBCSiMdKB354bBLAZlRsAMDJVUj9469gN/GMGTN002r//v31RC3syMVOXnwH8z/8Ryg45Qo7dgcNGqTi31/hxlZnTi62mgRIgARIgARIwL4EnByJty/VyLUsqIjH6wrs2MWOW2xQDaUgZQ92DaMMHDhQd/AiKm+kBUKuTqPAg4SdvPTEh0KW15AACZAACZAACZCANQQo4q3hWF+1VCvi4YFHOhxYX1DghX/wwQdDaiui99iNG6rwr65SRuJDQs6LSIAESIAESIAESCBkAhTxIaOy5YXVinhYXJYuXap2l//85z+ye/duTZkTadM/Rbwt5w4bRQIkQAIkQAIk4GACFPEOHjwRqVbEwwKDDalIng8Rf/nll8uGDRs0T3wkC0V8JGnzWSRAAiRAAiRgcwJlJVKWvUnKszdJWfZm0+dNkvbAbps33j7No4i3z1jUpiVBRfykSZNkwoQJmiYSBzz5SytZmwfX5B6K+JrQ4rUkQAIkQAIkEB0Eyg/96hHobqFuCPfygpyAHaSID33sKeJDZ2XHK4OKeKSUxMmr8LcjtSROscJJVCg4nrZBgwZh7xdFfNgR8wEkQAIkQAIkUD8Eig6bBLpJrB/8JWB7XEnp4mrUQVyN2us/cT6f24skpNRPXxz2VIp4hw1YpeZWK+KPPfZYPY42UMHBTunp6WEnQBEfdsR8AAmQAAmQAAmElUD5/q1VrC9l+7aIFOcHFutVBHqFcHelNQlre2Ohcop4Z49y0BSTRvfKy8tlx44dkpKSIo0bN47o5laK+NAnWdme78SVmqX/SFL4F1iht4xXkgAJkAAJRDuB8rxsPz71LVJ+eE9goY7/Z2V19Immm6Pr0c6sPvtHEV+f9Ov+7JBE/ObNm2XAgAGCwR4/frxubr366qtl+PDhdW9BCDVQxIcAyXNJ3uOVcvnHJ1WIeo+4N0S+Cn3Td97PKY1E4hNDfyivJAESIAESiB0CZcVStneTlO8z+9Q3S9n+rSJlpf45uOIlrslRHvtLB4nz2GBgicFnBp3qZ/pQxNcPd6ueGpKIP+WUUwRCvlmzZnpS686dO2Xu3Lly8OBB9cuHu1DEh064YO5gkYIcwaaf8oJDIsV5od9c6UpXcoaPyK8s+n1+h/BPaSSuVMwHV62fyRtJgARIgATsQaA8Z6eU7dss5Xs3Sdk+dxaY8n1bpTx/f+CoeoMWEte4s1esuyPqbt+6q0ELe3SMrfASoIh39mQIKuILCgokNTVVnn/+edm+fbvEx8fLkCFDpGfPnhHLVEMRX8tJVlqsYl4KTaLeK/ADfF+Y41kEHBIpC7wfotoWxcUHjP5LSpa40rLEhZ94E5DSUFypjcSFRQDtP7UcaN5GAiRAArUkUJjr2VQKge5J17hvi5Qf+DlwhYmpEtf4KI8FBgLd7VM3xLrEJdSyMbwt0gQo4iNN3NrnBRXxeFxmZqacdNJJ0qhRI81MExcXJzjNdd++fZKYGH7bBUW8tYMeUm3FeVKef9C9CIDw9ywEpOCQJ8rvfxGg1xYdDukR/i5yJab5t/gYPn/81Ig/Iv8NKz7HuzMmsZAACZAACVQlgAi6OUUjrC9l+7aKVPPfa1fDdh4LjCHSTZtKU8L/Fp7jGH4CFPHhZxzOJ4Qk4l977TW59dZbNcWkUYz88eFsnFE3RXwkKFv3DLfwP+hnEXDIZPUxFgeVvistqnVDvBt6A/j83cIfUX939N/9uZGIi/afWkPnjSRAArYhUH5kr5R7Dj7SfOoeoY5c64GKKyVTXI27mCwwRkS9g7gyW9umb2xIeAhQxIeHa6RqDUnEIzNNUVGRfPrpp7Jt2zY54YQTBOknW7RoITjVNdyFIj7chG1Sf1mJCn9dAOgiADYg/O62A0mh6S2AYQsqrFgE1LoXCcle+0+Vzb6G6IfYV9uPKfqfFP4zEmrdJ95IAiQQnQRKi9zedM/BR0jRaIh1qSYIovYXbCzN6uS1vRi51SUhOTpZsVdBCVDEB0Vk6wtCEvEQ67DR/Pe//5Wjjz5a3nvvPbn44ov1AChYbcJdKOLDTTgK6i/O9wh/YxHgWQB4LEGwA/lYgcybf0sC5ygORgZRLHOGH7fP3x3h1yh/qkf0V/7M/2kGQ8u/k0BME9BNpcYJpfu2aOYX3VR6ZG/gqHp6U3E1PspjgUHKRs+GUvxkTvWYnk+BOk8R7+xpEbKI//333wWnt3788cfqhb/oooso4p099my9h4Bm8TGi/4j8e94A6FsA72f/bwKkvKx2HOMSqm7+9bH5uMW/O/rvfgNgfBZXXO2eybtIgARsRaAcbxc99pdyCHWIdLXAbAnczvgk96bSJkf5ZIHxbiq1VQ/ZGLsToIi3+whV376QRXzfvn1lyZIl6ou/5ZZb5J///CdFvLPHnq2vKwHYf2Dz0Wi/exOwjx3I52+HTFmCckSKjtT66Thu3Cenvye1p//ov2cBgGuQMpSFBEgg4gRUoCOqjnSN2GDqEev6348ABX50r1jP6uSTAYaZvCI+hFH7QIp4Zw9tyCL+oYcekn79+nkPfUK3aadx9uCz9fVIoCS/wvNvWH7U/2/eEGx8xvee/QCwBZUW167hLpc7+u/N6e+x/JjTfPp8duf91+sTUmr3TN5FAjFCwL2p1JOi0WN9UQvMwV8CC/WkdE9EvYvbr+45+EhTNjZoHiPk2M36JEARX5/06/7skER8nz59ZNSoUTJixAiBrQZ++C+++IIivu78WQMJ1JgAXsHrZl/PGwDfz+YNwZUzBB2q8bO8N+DkX2zkTW7g/pnUQFzJnp9Vvk+v/hqkEWUhAScS0E2lm9wWGETUIdL3u20wUhx4b40rq6PJAuM+tdS7qTQu3okk2OYoIUAR7+yBrFbE45TWJk2a6MmspaUVRynj85EjR6RHjx6aMz7chRtbw02Y9ccEgbJSU7Yft8B3Z/4xR/zNiwOTRaikwDpErrgaLAjMCwXfxYGxmOAeAeuGhjW5CZTn7HCLdUOoGz9z9wSOquMtl/rUPX71LOPU0vbuPS0sJGBDAhTxNhyUGjQpoIhHSsnk5GR5/PHHZdq0aRqBr1xop6kBaV5KAk4mUFrkPsSr8LD7Z9FhKS/0/NTvj1R8X811ek9xnrUkEtN83goEfkNgWhD4vElIr3jDwEPDrB0bG9eGDe1qf9FousenrmJ9i0hZRdDKpwuuOIlr0qUiAwwywWR11Mg6c6rbeLDZtIAEKOKdPTkCinhE2xEBx4bWL7/8UiPvlcvYsWM19WS4CyPx4SbM+kkgggTKyyotCDwLgIALBNPCocoC4YhIeQDBVZsuwTYU0CYUaBEQwFqUmFqbFvAeiwloTnVPxhevWIdwz9sf8EmuBi3caRqNdI2Irnv86sypbvEAsbp6JUARX6/46/zwkDzxJSUlkpCQoA9bu3atNG7cWLp06VLnh4daAUV8qKR4HQnEIAGcEVBZ3Pt5G+D3DULREd83CiWF1gF0xXsWBB4bUKD9BNXuLzAtHCJwsJ51nY9sTeWHfxfNAGNE1I2fB7YFbkhCikmod3F/NrLApDWObAf4NBKoJwIU8fUE3qLHVivi169fL1dddZVce+21cuutt8rZZ58t+A4FKSZvvvlmi5pRfTUU8RHBzIeQAAmUFvu3C5ntQ14b0ZEqtiLDYqR2ozqkEfU3EJpaFIJfNxKb9geEvOHYtCCIT3TeWJcUav50czTd+F25Byiuhu2qRNUNC4zzILDFJGAtAYp4a3lGurZqRfyAAQPkgw8+kFdeeUUOHTokd911l2aoWbp0qaSlpcnGjRsj0l6K+Ihg5kNIgASsJFBe7hb5nn8q9hNUiv6bbUTV7TsI5NOuTZvjkytsQ2b7EFIemn4PyVpksW1IN5V6Dz0y+dUP/RpYqCdnujeVGhYY3VzaRU8sZU712kwQ3hMrBCjinT3SAUU8MtJkZWXJ008/Lffdd5/mh4eghzf+888/l/PPP1+QvSYSthqKeGdPMraeBEjAAgKGbQgWoOrEvuetQbUbkC3NNmTYhoy3BP7SkGLzcIYn9WjFQqH88G++GWCQqrE0sKWp4qRS48RS+NY7M6e6BdOLVcQmAYp4Z497QBG/d+9ead68ucydO1cuu+wyadCggQwcOFDeffddmT17ttx4443y66+/SuvWrcNOgCI+7Ij5ABIggVgigNOGfbILVbd52MhCdCRwdiIL2bnSmnqj6j6iPauTCHOqW0iaVZGACEW8s2dBtXaas846S7Zt2ybdunWTxYsXq3g/5phj1CPfqFEj+eqrrwL2vqysTPLz8yU9PT3gNQcOHNBof7BCER+MEP9OAiRAAvVHwHgzYNiHDOuQ7xuDqm8QYHWpEOqeU0uZU73+BpJPjjkCFPHOHvJqRTy873/+8591M2vPnj3l008/lRkzZsj48ePltddek+HDh/vtPcQ+csu3adNGkNlm3rx50qxZM++1P/74o1xzzTVy1FFHSV5envrsA9WFmyjinT3J2HoSIAESIAESIAH7EaCIt9+Y1KRFIaWY3LNnj7Ro0UJcLpfs2LFDEhMTpWXLln6fA9GOv8NT37BhQxk9erS0atVKhb9RpkyZot8h883HH38s9957r3z77bcB200RX5Mh5bUkQAIkQAIkQAIkEJwARXxwRna+oloRjxSSOLk1UHnxxRclNdX3QBPYb7DpdevWrXrb9OnTZd26dTJr1qwq1SCqjzpgz8HBUYEKRbydpxDbRgIkQAIkQAIk4EQCFPFOHLWKNlcr4hF5r64g7WRGRobPJbDeDBkyxJt+Ehtjly1bJjNnzqxS1dSpU+Wtt97SdJUffvih/n3lypWyatWqKteiThYSIAESIAESIAESIAHrCHTu3Nm6ylhTRAlUK+KxORXlyiuvlN9//12effZZ6dChgzz44IMqzBFhh3XGXLCZFaIc92IRAKGOMmbMGO9lCxculF69emlmGyOVZXWZbhiJj+ic4MNIgARIgARIgARigAAj8c4e5KCeeMPjjoOeIOJR3nzzTRk6dKj62E866aQqBLp3764bYJHVpn///jJx4kTp16+frFmzRr979NFHJTk5WR5++GH54Ycf5LzzzpNdu3ZJfHy8X5oU8c6eZGw9CZAACZAACZCA/QhQxNtvTGrSoqAiHpV17dpVxbaRLx6RdHjh4XtH/vjKZdGiRZpxBgW55efPn69R+czMTBXy5eXl8qc//UkPi0pKSpLHH39cffGBCkV8TYaU15IACZAACZAACZBAcAIU8cEZ2fmKkET8999/r0L7nXfekdzcXDn33HNlwoQJcs455wTsG1JH5uTkaBaaQGX37t2a9SYuLq5aRhTxdp5CbBsJkAAJkAAJkIATCVDEO3HUKtockojH5T///LNuOoXo7tSpk3Tp0iViPaeIjxhqPogESIAESIAESCBGCFDEO3ugQxLxiMAPGjRIe4p87xDzPXr0kGeeeSYivaeIjwhmPoQESIAESIAESCCGCFDEO3uwQxLx7dq1k+bNm0ujRo3k9NNPl4SEBJk0aZJUl1HGSiwU8VbSZF0kQAIkQAIkQAIkIEIR7+xZEFTEFxQU6CZWZJuBpQYZZJCzvWfPnrJhwwbd9BruQhEfbsKsnwRIgARIgARIINYIUMQ7e8SDinh0D0I9OztbWrZsqVF45IxHLviNGzdGpPcU8RHBzIeQAAmQAAmQAAnEEAGKeGcPdkgi/ptvvtGc7vDGG+Xtt9/2+uTDjYAiPtyEWT8JkAAJkAAJkECsEaCId/aIhyTijS4eOHBAdu7cKUcddZRG4iNVKOIjRZrPIQESIAESIAESiBUCFPHOHumQRPyKFStk8uTJ8vnnn/v0NtBhT1YjoYi3mijrIwESIAESIAESiHUCFPHOngEhiXjjxFZsZsUJq0b55JNPIhKRp4h39iRj60mABEiABEiABOxHgCLefmNSkxYFFfElJSWSmJgoDz30kEycOLEmdVt2LUW8ZShZEQmQAAmQAAmQAAkoAYp4Z0+EoCIe3Rs5cqSsXbtWXn/9dcnKyvL2uE2bNuJyucJOgCI+7Ij5ABIgARIgARIggRgjQBHv7AEPScS3aNFC00pWLjk5OZKZmRl2AhTxYUfMB5AACZAACZAACcQYAYp4Zw94SCJ+2rRpkpubW6Wn999/vyQnJ4edAEV82BHzASRAAiRAAiRAAjFGgCLe2QNerYjfvHmzNGnSRA4ePCilpaVVeopUk3FxcWEnQBEfdsR8AAmQAAmQAAmQQIwRoIh39oAHFPFFRUUaZX/88ccFkXjaaZw90Gw9CZAACZAACZAACZgJUMQ7ez4EFPGIvCMC3rdvX/nyyy/lyJEjVXo6duxYn5ST4ULBSHy4yLJeEiABEiABEiCBWCVAEe/skQ/JE48uFhYWCjayopSXl8uWLVukV69emn4y3IUiPtyEWT8JkAAJkAAJkECsEaCId/aIhyTi33jjDRk9enQVSw2z0zh78Nl6EiABEiABEiCB2CVAEe/ssQ9JxGMDa6NGjQQbXc844wz53//+J82bN5fVq1czEu/s8WfrSYAESIAESIAEYpQARbyzBz6oiC8uLlbf+7/+9S9Zvny5NG3aVEaNGiXt27eXAwcOqLgPd6GdJtyEWT8JkAAJkAAJkECsEaCId/aIBxXx6F67du1UyN92223y6KOPyhVXXCFz5syRTZs2ydFHHx12AhTxYUfMB5AACZAACZAACcQYAYp4Zw94SCL+v//9r4wZM0bmzp0rAwcOlJ07d8oll1wiixYtikjvKeIjgpkPIQESIAESIAESiCECFPHOHuyQRPyMGTPknHPOkeOPP15KSkrUG//WW2/JXXfdJQ0bNgw7AYr4sCPmA0iABEiABEiABGKMAEW8swe8WhH/6aefygcffCAQ8WeffbaccMIJ2tsdO3bI/Pnz5ddff5XWrVuHnQBFfNgR8wEkQAIkQAIkQAIxRoAi3tkDXq2If/rpp2XcuHF+e3jaaafJ2rVrA/a+rKxM8vPzJT09PeA12BibmZkp8fHx1VKkiHf2JGPrSYAESIAESIAE7EeAIt5+Y1KTFlUr4nHAE4T4ZZddJnfccYecf/753rpho3G5XH6fNXv2bJk2bZq0adNG7Tfz5s2TZs2aea/95ZdfZNiwYfpdQkKC9OzZUyZMmBCw3RTxNRlSXksCJEACJEACJEACwQlQxAdnZOcrQvLE44TW119/XZYuXareeJzSCkHvzw8P0Y6/Hzx4UP+OQ6JatQt3XSQAAB8/SURBVGol48eP93J47LHHBKkrJ06cKAUFBZKamlqtNYci3s5TiG0jARIgARIgARJwIgGKeCeOWkWbQxLxSCv58MMP610Q4ytXrtTPEPVxcXE+BLZt26YCf+vWrfr99OnTZd26dTJr1izvdYjuI4qfkpIib7/9ttxzzz2yZcuWgJF9inhnTzK2ngRIgARIgARIwH4EKOLtNyY1aVFQEY8oPCLqSC0J0Y2o+nHHHSfXX3+9Zqnp0qWLz/PWr18vQ4YMkY0bN+r3SEu5bNkymTlzps91RUVF8sQTT8jkyZNl4cKFcu655+rfsUBYtWpVlT6gThYSIAESIAESIAESIAHrCHTu3Nm6ylhTRAkEFfEQ28nJyYJo+L59+3QTKjLV9O/fX7Zv364nt5oLouxpaWmCja2Itk+dOlX/jDzzRoGFZujQoXqAFCL1WBhUVxiJj+ic4MNIgARIgARIgARigAAj8c4e5KAiHt27+OKL5b333pOMjAztbW5urgp5pKD0V7p3765pKbt166ZiH973fv36yZo1a/S7f/3rX/Luu++GfFgURbyzJxlbTwIkQAIkQAIkYD8CFPH2G5OatCgkEY8I/Kuvviqvvfaa/Pjjj3LGGWfIs88+q7YafwUnuY4YMUL/BBsOcsojKo90khDySF05Z84cn1s3bdokRx99tN/6KOJrMqS8lgRIgARIgARIgASCE6CID87IzlcEFfHIIgM/et++fX0sMcE6lZeXJzk5OUGtMsHqwd8p4kOhxGtIgARIgARIgARIIHQCFPGhs7LjlUFFPBoNO83y5cv1pFZ/aSXD3TGK+HATZv0kQAIkQAIkQAKxRoAi3tkjHpKIR254pJNEMe9iRiaa6k5ktQoNRbxVJFkPCZAACZAACZAACbgJUMQ7eyaEJOIRiYcvvnL55JNPNBNNuAtFfLgJs34SIAESIAESIIFYI0AR7+wRD0nE13cXKeLrewT4fBIgARIgARIggWgjQBHv7BGliHf2+LH1JEACJEACJEACJFArAhTxtcJmm5so4m0zFGwICZAACZAACZAACUSOAEV85FiH40kU8eGgyjpJgARIgAR8COw7lC+7snNl977DsmtfruzOPiwlZWXSOCNVGmemSpNM90/37ynSqEEKCZIACYSZAEV8mAGHuXqK+DADZvUkQAIkECsEINR378uVXdkQ6oe9n/FdYXFpjTDEx7ncot4j7L0i3xD8GSmSlZEqGWlJNaqXF5MACVQQoIh39mygiHf2+LH1JEACJBBRAvsRUTdF0zWqjt+zqxfqGalJ0qpphrRu0sD7s2F6skD4o078sy8XPwu8v5eVlwftW1JivDTxRPMN0d8kI6ViAZCZKlkNUiQtJTFoXbyABGKNAEW8s0ecIt7Z48fWkwAJkIDlBAyhXhFVD02oN0hNktZNG0jrJhnSqkkDad3U87NJRq0i5gcOVwh6FfkQ+x6hb4j/g4cLQuo/RHyFdccj8k1WHth3sjJSJCUpIaT6eBEJRAMBinhnjyJFvLPHj60nARIggVoRgBiGLx2RdLW+eD4jql5QVBKwThXqpmi6CnaPcK8va0t2Tp5vRF/FfsUCAIL/cH5RSJwy05I9UfyUKn59RPQbwcbTIEXwBoCFBJxOgCLe2SNIEe/s8WPrSYAESCAggQO5BW6Rnu3xp3tsL6EIdY2kewV6xWeIXCeW0rJyyT6YJ9mH8rx2HVh33BYej53nUH61CxhzvxG11w25law8+F7FvieynxAf50RcbHOMEKCId/ZAU8Q7e/zYehIggRgnYAh136i6O7peXUQ93RNR9xdVd6pQt2IqFBWXCiL7FdF9d0S/stgvKS0L+ri4OJc7606lDDxeoW8I/owUiXO5gtbHC0jAagIU8VYTjWx9FPGR5c2nkQAJkECNCUCoqz/dFEk3Plcr1FMSfXzp8Ku3auLeXJqZ7syIeo3hhemG/MISr9jPzvFE83M9vn3TZt3gW3NFrTkQ+hUZeNxWHoh9RPSNqD7TboZpMGO4Wop4Zw8+Rbyzx4+tJwESiBICZqFuZHsx0jRCMAYq6SmJbmFeaUMphbo9Jga8+Ijq74WVxyT2vRt1D+VLzpHCkBqblpxoyrqTolYeePTNIh9WHi7QQsLJi0SEIt7Z04Ai3tnjx9aTAAk4iAAyqfjzp8O3HqpQN7zqRlQdaRpZnE8AQh6e/b0+Vp4Krz5E/5GC4pA6ig3G3gO0TBF9I7Jv/MQmZZbYJkAR7+zxp4h39vix9SRAAjYjoEJds714sr6YDj/KLwwswpACUf3pfqLqFOo2G+R6bA7EvEb2c9w/8Y95Yy4+h3qwlm7ONTbmIqJv2pTr/ZyRIngDwBKdBCjinT2uFPHOHj+2ngRIoB4IQKgblhf9aTr8KK8GQt3wpyMLTMMGjKjXw1BG5SNxRpYh8DWyr1aeijSc7hz7BVJaFtrmXMOvrxty/dh3DMGfzBz7jptPFPGOGzKfBlPEO3v82HoSIIEwEcg5XFiRQ71Smsa8amwNiFoaedPdkfWKQ4+4MTFMg8Vqa0UAGXbcYj/fx8pTEd0v0MO1QilJCfHe/Prq0Tfl1DdH9fF9YgJz7IfCNBLXUMRHgnL4nkERHz62rJkESMDmBOBD3pXtOY20BkI9NdltfTFne2nV1J31hULd5oPO5tWYAOw5KvY9EX23b98t/I2Tcw/lhbY5F//uNMnEZlxsyk32Ffue3Pr4W1ZGssTHMcd+jQerhjdQxNcQmM0up4i32YDUtTmXjH9D/Yvw16YmJ+hP/V2/S9Cfqd7v3H/Hf1SNe9KSE/R33MtDSuo6GrzfDgQg1DU9o+lEUmNzaXUbBfHvgB525Imkm/3qFOp2GFm2wW4EYCVzC33Dt18h/I3MPNXZzcz9weZcdzQ/VbIaJAf062c1SBWm2K/9TKCIrz07O9xJEW+HUbCwDRDxVhZ4HCHsK0Q+FgGe3z2LBUP4excMngWEe3HgXhQk84hyK4eFdVUicAgRdZ8c6hWnlAYT6l5felOPYPdsLoX3l4UESMB6Arl57rSbXt++Sfirdz8nX4pKSkN6cEPDutMg2evXv/Gik0O6lxcxxaTT5wBFvNNHsFL7kaYuv6hY09UV6OcSQUYM/d34rD8rvsc17mvd17nrwHfFgqPKrSqJCXHuNwEm8W8If/d3vosDRELNCwHz7y6GXqwaFsfUYwj1qlH13GpT76UkJeiBR2Z/uhFVp1B3zPCzoTFIABvIjai+Of2m29qTL9mH8qTMz/+j3nliWAzSql2XGYmvHTe73EURb5eRsGE7iktKJc8k9t2LAI/4N332fm9aMBiLgIpFQbEUlwTPhBAqBhxnHqpNqLrFABYJWFyw2IMAfLW7PbYXc5pGfD6SXxSwkSrUEUH3iHW1wXgOP6JQt8fYshUkEC4C8OWbPfuD+xwbrkdFXb0U8c4e0rCJ+LKyMsnPz5f09PSAhEpKSqSoqEjS0tKqpfjUU0/JuHHjnE06xltfXl7usyDA2wFjgVCxOPB9G1BQ6c0A7jHeLlR31HxtULvfEJj2EOi+gQTv/oFgCwHj76lMsRYUf1WhjhSN7s2lON0yUIFQ9+dPh2CnUA+KnReQAAmQQBUCFPHOnhRhEfGzZ8+WadOmSZs2bQRCfd68edKsWTMvqdLSUtmwYYPMmjVL4uPjZerUqRTxzp5HEW89siUYNiHzgqCyTch7jectQYXFqOKNAr4rQ2Jliwr8/742oYq9AbpQ8CwYjA3E1f0eH+eyqFWRrQaeVxXmfqLqIQl1byS9gXtzadMGeigNCwmQAAmQgHUEKOKtY1kfNVku4iHaExMT5eDBg9KwYUMZPXq0tGrVSsaPH+/t3+HDh+Whhx6SL7/8Uk455RSK+PoYeT6zYlFZVu5dECBzgs9CwPTGwJ+VyLufwLSnALmXrSrIEFR1w7BpIZDk2WiMn6bMQv72Eli9udgr1P1sKK1OqKMd8KhrVN1zOqmxuRRHxbOQAAmQAAlEhgBFfGQ4h+splov4bdu2yfnnny9bt27VNk+fPl3WrVunUffK5fnnn5ctW7ZQxIdrdFlvvRCA1afqYsDfdxWWIvOGZOMz3hCEenx6KB2Nc7m8qUcDbRg23g5UfktwILdAs7/szs71/sytxvpSWaibDz+iUA9ltHgNCZAACYSfAEV8+BmH8wmWi/j169fLkCFDZOPGjdruuXPnyrJly2TmzJkU8eEcSdYdlQQQ1a+8IAjpbUEhFg3mTcjuNwxWFgh1jaA3xamk7uwvxucmjKhbiZp1kQAJkEBYCFDEhwVrxCq1XMRjMys2qmJjK9IAGn73MWPGhCTiV65cKatWrapyLRYGLCRAAnUjUFBcKoVFpVJQXKZRfr+/4/si99/d15RJcmKcNM1MkWaZydKsoftnw/SkujWGd5MACZAACdQ7gc6dO9d7G9iA2hGwXMSjGd27d5cZM2ZIt27dpH///jJx4kTp16+frFmzRr8zstHQTlO7QeNdJEACJEACJEACJFBXAozE15Vg/d4fFhG/aNEiGTFihPZs4MCBMn/+fI3KZ2ZmqpA//vjj9W8Q8fDOT5kypVoKTDFZv5OETycBEiABEiABEog+AhTxzh7TsIh4IMnLy5OcnBzNTFPXQhFfV4K8nwRIgARIgARIgAR8CVDEO3tGhE3EW4mFIt5KmqyLBEiABEiABEiABEQo4p09CyjinT1+bD0JkAAJkAAJkAAJ1IoARXytsNnmJop42wwFG0ICJEACJEACJEACkSNAER851uF4EkV8OKiyThIgARIgARIgARKwOQGKeJsPUJDmUcQ7e/zYehIgARIgARIgARKoFQGK+Fphs81NFPG2GQo2hARIgARIgARIgAQiR4AiPnKsw/EkivhwUGWdJEACJEACJEACJGBzAhTxNh+gIM2jiHf2+LH1JEACJEACJEACJFArAhTxtcJmm5so4m0zFGwICZAACZAACZAACUSOAEV85FiH40kU8eGgyjpJgARIgARIgARIwOYEKOJtPkBBmkcR7+zxY+tJgARIgARIgARIoFYEKOJrhc02N1HE22Yo2BASIAESIAESIAESiBwBivjIsQ7Hkyjiw0GVdZIACZAACZAACZCAzQlQxNt8gII0jyLe2ePH1pMACZAACZAACZBArQhQxNcKm21uooi3zVCwISRAAiRAAiRAAiQQOQIU8ZFjHY4nUcSHgyrrJAESIAESIAESIAGbE6CIt/kABWkeRbyzx4+tJwESIAESIAESIIFaEaCIrxU229xEEW+boWBDSIAESIAESIAESCByBCjiI8c6HE+iiA8HVdZJAiRAAiRAAiRAAjYnQBFv8wEK0jyKeGePH1tPAiRAAiRAAiRAArUiQBFfK2y2uYki3jZDwYaQAAmQAAmQAAmQQOQIUMRHjnU4nkQRHw6qrJMESIAESIAESIAEbE6AIt7mAxSkeRTxzh4/tp4ESIAESIAESIAEakWAIr5W2GxzE0W8bYaCDSEBEiABEiABEiCByBGgiI8c63A8iSI+HFRZJwmQAAmQAAmQAAnYnABFvM0HKEjzwibiy8rKJD8/X9LT0wM24ciRI5KamipxcXHVNvOpp56ScePGOZs0W08CJEACJEACJEACNiJAEW+jwahFU8Ii4mfPni3Tpk2TNm3aSElJicybN0+aNWvm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AiTgdAIU8U4fQbafBEiABEiABEiABEgg5ghQxMfckLPDJEACJEACJEACJEACTidAEe/0EWT7SYAESIAESIAESIAEYo4ARXzMDTk7TAIkQAIkQAIkQAIk4HQCFPFOH0G2nwRIwNEEvvvuO1m0aJFcd9110q5dO0f3hY0nARIgARKIHAGK+Mix5pNIgARIoAqB1157Ta6++mpZtWqV/OEPfyAhEiABEiABEgiJAEV8SJh4EQmQQKwR+OWXX+Tuu+9WcX3KKafIbbfdJpdcconk5+fLAw88IPPnz9fPAwYMkOnTp0tpaalceumlcsMNN8jtt98u77zzjkyaNEn+8Y9/yOHDh2Xs2LFyzjnnyJIlSyQ5OVkefPBB6dq1q1x44YWyadMm6dmzp7zxxhvSpUuXWEPN/pIACZAACdSCAEV8LaDxFhIggegnMHLkSJkzZ46K8s8++0x2794tu3btktdff11uueUWjZ7jePdp06apaL/vvvukU6dOMmHCBBXvuBd1LFu2TA4ePCiDBw+WjIwM+dOf/iQvvfSSNGvWTL744gu5//77ZdasWTJu3Dj9zNMmo39usYckQAIkYAUBingrKLIOEiCBqCJQVFQkTZs21cj6q6++Kj///LN8++230rt3bxk2bJh89dVXKszj4uKkX79+snr1av3umGOOqVbE/+tf/5JrrrlGbr31VhXy+/btkw8++IB2mqiaPewMCZAACUSGAEV8ZDjzKSRAAg4isHfvXo2y33nnnWqVOXDggOzYsUMj7X369JH9+/fr7yiXX365/Oc//5EffvhBTjjhBI2oP/nkk/L888/r/eZI/Pvvv6/2mbvuukuee+45ingHzQk2lQRIgATsRoAi3m4jwvaQAAnYggDE+vr161VsL1iwQN577z2108ybN0+tM48//ri0atVKLTPDhw/XiH1SUpJG4yHk//rXv8pPP/0UsojHc2666SZJSUmxRf/ZCBIgARIgAXsToIi39/iwdSRAAvVEABtQETU3CkT2HXfcIYjSX3bZZbrhFaVt27ayePFiOfHEE1W8P/300/r9mWeeKStWrJDly5drJB+eeFyHjbCjR4/WCD/sNKjvtNNOk9zcXFm3bp107969nnrMx5IACZAACTiJAEW8k0aLbSUBEogogcLCQkGWmjZt2khaWprPs7HRFX9v3769euONgkw0LpdL0tPTQ25rcXGxZrDJzMyU+Pj4kO/jhSRAAiRAArFLgCI+dseePScBEiABEiABEiABEnAoAYp4hw4cm00CJEACJEACJEACJBC7BCjiY3fs2XMSIAESIAESIAESIAGHEqCId+jAsdkkQAIkQAIkQAIkQAKxS4AiPnbHnj0nARIgARIgARIgARJwKAGKeIcOHJtNAiRAAiRAAiRAAiQQuwT+HyrFEv53xj0LAAAAAElFTkSuQmCC",
"text/plain": [
"<VegaLite 4 object>\n",
"\n",
"If you see this message, it means the renderer has not been properly enabled\n",
"for the frontend that you are using. For more information, see\n",
"https://altair-viz.github.io/user_guide/troubleshooting.html\n"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mapBaselineTypes = ['baseline','helpMapTotal','_helpMapMap','_helpMapObject']\n",
"alt.Chart(footprintDF[footprintDF.type.isin(mapBaselineTypes)]).mark_line().encode(\n",
" x = \"count:N\",\n",
" y = \"retainedSizePct:Q\",\n",
" color = \"type\"\n",
").properties(width=600, height=200)"
]
},
{
"cell_type": "markdown",
"id": "33e7dddd-7f56-4629-ae0a-b12e91b0c339",
"metadata": {},
"source": [
"--------\n",
"\n",
".\n",
"\n",
".\n",
"\n",
".\n",
"\n",
".\n",
"\n",
".\n",
"\n",
".\n",
"\n",
".\n",
"\n",
"------\n",
"\n",
"# Testing Instances with Help\n",
"\n",
"@TODO\n",
"\n",
"If we want to ask `myPointInstance.radix.help()`\n",
"\n",
"Then there should be only once instance of help for `radix` that should be shared by all PointClass instances.\n",
"\n",
"## TLDR;\n",
"\n",
"Only DocString and HelpFunction worked well on standard libraries\n",
"(because otherwise class instances did not have the help available)\n",
"\n",
"So this was no longer needed.\n",
"\n",
"As a quick test though, we created an instance of a function that DOES have help available, and then made many pointer instances to them.\n",
"\n",
"The numbers quickly converged, so the difference was negiligable after 100 or so functions, so it didn't matter much anyway.\n"
]
},
{
"cell_type": "raw",
"id": "34564686-3e0d-42a3-869a-102d98b099f6",
"metadata": {},
"source": [
"//-- note that this needs to be run in the browser / like chrome to get the memory footprint\n",
"//-- create a new blank tab, paste in the console and then run the memory footprint analyzer\n",
"\n",
"/*\n",
"* What does this do?\n",
"* \n",
"* We have a couple different implementations, and then the most important stuff is at the bottom.\n",
"* \n",
"* Create a factory\n",
"* functionFactory = {\n",
"* bind: generateFunctionWithBind, // generates a function that has a .help method bound to another\n",
"* arrow: generateFunctionWithArrow, // generates a help function by calling an arrow function\n",
"* docString: generateFunctionWithDocString, // generates a function that has a jsdoc comment INSIDE to support docstring\n",
"* map: generateFunctionWithMap, // generates a function that is used as a key in helpMap to get docs\n",
"* baseline: generateFunctionBaseline, // generates a function that returns documentation with an argument\n",
"* empty: generateFunctionEmpty, // generates an empty function and returns it\n",
"* ...\n",
"* }\n",
"* \n",
"* // create an object that stores all the functions - so we can get a footprint\n",
"* generateBigObject = (numberOfFunctions, type) => {\n",
"* const result = { numberOfFunctions };\n",
"* for (let i = 0; i < numberOfFunctions; i++ ) {\n",
"* result[`function${i}`] = functionFactory[type]();\n",
"* }\n",
"* return result;\n",
"* }\n",
"* \n",
"* \n",
"* //-- configure your test here\n",
"* setupTest = () => {\n",
"* let numberOfObjects = 100;\n",
"* let type = 'empty';\n",
"* window.bigObject = generateBigObject(numberOfObjects, type);\n",
"* }\n",
"* \n",
"* \n",
"* In all cases (except empty) - we can get help documentation:\n",
"* \n",
"* generateFunctionWithBind().help();\n",
"* generateFunctionWithArrow().help();\n",
"* generateFunctionWithDocString().toString() -- or using the .__doc__ with docString library\n",
"* \n",
"* someFn = generateFunctionWithMap();\n",
"* helpMap.get(someFn)\n",
"* \n",
"* generateFunctionBaseline()(true);\n",
"*/\n",
"\n",
"\n",
"//-- bind implementation\n",
"printHelp = (message) => console.log(message);\n",
"generateFunctionWithBind = () => {\n",
" const result = () => 'hello';\n",
" result.help = printHelp.bind(this, `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Praesent elementum facilisis leo vel. Est placerat in egestas erat imperdiet sed euismod. Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Tellus elementum sagittis vitae et leo. Libero volutpat sed cras ornare. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Quis imperdiet massa tincidunt nunc. Mattis nunc sed blandit libero volutpat sed cras ornare. In iaculis nunc sed augue lacus viverra. Arcu cursus euismod quis viverra nibh cras pulvinar. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Orci nulla pellentesque dignissim enim. Nulla posuere sollicitudin aliquam ultrices sagittis. Ut enim blandit volutpat maecenas volutpat blandit. Et tortor consequat id porta nibh venenatis cras sed. Sit amet mattis vulputate enim nulla. Risus ultricies tristique nulla aliquet enim tortor at. Augue neque gravida in fermentum. Quam vulputate dignissim suspendisse in est ante.\n",
"\n",
"Nunc non blandit massa enim nec. Aliquam faucibus purus in massa. Tincidunt lobortis feugiat vivamus at. Habitasse platea dictumst vestibulum rhoncus. Proin sed libero enim sed. Lectus urna duis convallis convallis tellus. Cras adipiscing enim eu turpis egestas pretium aenean pharetra magna. Lobortis elementum nibh tellus molestie nunc non blandit massa. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Non nisi est sit amet facilisis magna etiam tempor. Nunc consequat interdum varius sit amet mattis vulputate enim nulla. Egestas purus viverra accumsan in nisl nisi scelerisque. Nunc mattis enim ut tellus elementum sagittis vitae et leo. Cras semper auctor neque vitae tempus quam. Ultricies mi eget mauris pharetra. Tincidunt dui ut ornare lectus sit amet est placerat in. Tristique sollicitudin nibh sit amet.\n",
"\n",
"Egestas maecenas pharetra convallis posuere. Sodales neque sodales ut etiam. Tristique sollicitudin nibh sit amet commodo. Adipiscing at in tellus integer feugiat scelerisque varius. Neque volutpat ac tincidunt vitae semper quis lectus. Eu scelerisque felis imperdiet proin. At urna condimentum mattis pellentesque id nibh tortor id. Eleifend donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum. Gravida neque convallis a cras semper. Commodo sed egestas egestas fringilla phasellus faucibus. Duis ultricies lacus sed turpis tincidunt. Ornare aenean euismod elementum nisi quis eleifend quam. Lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum et sollicitudin ac orci phasellus egestas.\n",
"\n",
"Habitant morbi tristique senectus et netus et malesuada. Nunc vel risus commodo viverra maecenas accumsan. Tincidunt eget nullam non nisi est. Vel fringilla est ullamcorper eget nulla. Nibh sit amet commodo nulla facilisi. Metus aliquam eleifend mi in nulla posuere sollicitudin. Ipsum consequat nisl vel pretium lectus quam id leo in. Ipsum dolor sit amet consectetur adipiscing elit pellentesque habitant morbi. Quam adipiscing vitae proin sagittis nisl rhoncus mattis. Amet nisl suscipit adipiscing bibendum est ultricies integer quis. Mollis aliquam ut porttitor leo. Nisi est sit amet facilisis magna etiam tempor orci eu. Ac turpis egestas maecenas pharetra convallis posuere morbi leo. Varius sit amet mattis vulputate.\n",
"\n",
"Tincidunt dui ut ornare lectus sit amet est. Elit eget gravida cum sociis natoque penatibus et. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Id eu nisl nunc mi ipsum faucibus vitae aliquet. Eu augue ut lectus arcu bibendum at. Porta non pulvinar neque laoreet. Diam vulputate ut pharetra sit amet aliquam id. Aliquet bibendum enim facilisis gravida. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus. Diam donec adipiscing tristique risus nec feugiat in fermentum. Odio ut enim blandit volutpat maecenas.`);\n",
" return result;\n",
"};\n",
"\n",
"//-- arrow function implementation\n",
"helpTemplate = (message) => () => printHelp(message);\n",
"\n",
"generateFunctionWithArrow = () => {\n",
" const result = () => 'hello';\n",
" result.help = helpTemplate(`Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Praesent elementum facilisis leo vel. Est placerat in egestas erat imperdiet sed euismod. Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Tellus elementum sagittis vitae et leo. Libero volutpat sed cras ornare. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Quis imperdiet massa tincidunt nunc. Mattis nunc sed blandit libero volutpat sed cras ornare. In iaculis nunc sed augue lacus viverra. Arcu cursus euismod quis viverra nibh cras pulvinar. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Orci nulla pellentesque dignissim enim. Nulla posuere sollicitudin aliquam ultrices sagittis. Ut enim blandit volutpat maecenas volutpat blandit. Et tortor consequat id porta nibh venenatis cras sed. Sit amet mattis vulputate enim nulla. Risus ultricies tristique nulla aliquet enim tortor at. Augue neque gravida in fermentum. Quam vulputate dignissim suspendisse in est ante.\n",
"\n",
"Nunc non blandit massa enim nec. Aliquam faucibus purus in massa. Tincidunt lobortis feugiat vivamus at. Habitasse platea dictumst vestibulum rhoncus. Proin sed libero enim sed. Lectus urna duis convallis convallis tellus. Cras adipiscing enim eu turpis egestas pretium aenean pharetra magna. Lobortis elementum nibh tellus molestie nunc non blandit massa. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Non nisi est sit amet facilisis magna etiam tempor. Nunc consequat interdum varius sit amet mattis vulputate enim nulla. Egestas purus viverra accumsan in nisl nisi scelerisque. Nunc mattis enim ut tellus elementum sagittis vitae et leo. Cras semper auctor neque vitae tempus quam. Ultricies mi eget mauris pharetra. Tincidunt dui ut ornare lectus sit amet est placerat in. Tristique sollicitudin nibh sit amet.\n",
"\n",
"Egestas maecenas pharetra convallis posuere. Sodales neque sodales ut etiam. Tristique sollicitudin nibh sit amet commodo. Adipiscing at in tellus integer feugiat scelerisque varius. Neque volutpat ac tincidunt vitae semper quis lectus. Eu scelerisque felis imperdiet proin. At urna condimentum mattis pellentesque id nibh tortor id. Eleifend donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum. Gravida neque convallis a cras semper. Commodo sed egestas egestas fringilla phasellus faucibus. Duis ultricies lacus sed turpis tincidunt. Ornare aenean euismod elementum nisi quis eleifend quam. Lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum et sollicitudin ac orci phasellus egestas.\n",
"\n",
"Habitant morbi tristique senectus et netus et malesuada. Nunc vel risus commodo viverra maecenas accumsan. Tincidunt eget nullam non nisi est. Vel fringilla est ullamcorper eget nulla. Nibh sit amet commodo nulla facilisi. Metus aliquam eleifend mi in nulla posuere sollicitudin. Ipsum consequat nisl vel pretium lectus quam id leo in. Ipsum dolor sit amet consectetur adipiscing elit pellentesque habitant morbi. Quam adipiscing vitae proin sagittis nisl rhoncus mattis. Amet nisl suscipit adipiscing bibendum est ultricies integer quis. Mollis aliquam ut porttitor leo. Nisi est sit amet facilisis magna etiam tempor orci eu. Ac turpis egestas maecenas pharetra convallis posuere morbi leo. Varius sit amet mattis vulputate.\n",
"\n",
"Tincidunt dui ut ornare lectus sit amet est. Elit eget gravida cum sociis natoque penatibus et. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Id eu nisl nunc mi ipsum faucibus vitae aliquet. Eu augue ut lectus arcu bibendum at. Porta non pulvinar neque laoreet. Diam vulputate ut pharetra sit amet aliquam id. Aliquet bibendum enim facilisis gravida. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus. Diam donec adipiscing tristique risus nec feugiat in fermentum. Odio ut enim blandit volutpat maecenas.`);\n",
" return result;\n",
"};\n",
"\n",
"//-- docString implementation\n",
"generateFunctionWithDocString = () => {\n",
" const result = (message) => (returnMessage) => {\n",
" /**\n",
" * Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Praesent elementum facilisis leo vel. Est placerat in egestas erat imperdiet sed euismod. Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Tellus elementum sagittis vitae et leo. Libero volutpat sed cras ornare. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Quis imperdiet massa tincidunt nunc. Mattis nunc sed blandit libero volutpat sed cras ornare. In iaculis nunc sed augue lacus viverra. Arcu cursus euismod quis viverra nibh cras pulvinar. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Orci nulla pellentesque dignissim enim. Nulla posuere sollicitudin aliquam ultrices sagittis. Ut enim blandit volutpat maecenas volutpat blandit. Et tortor consequat id porta nibh venenatis cras sed. Sit amet mattis vulputate enim nulla. Risus ultricies tristique nulla aliquet enim tortor at. Augue neque gravida in fermentum. Quam vulputate dignissim suspendisse in est ante.\n",
" * \n",
" * Nunc non blandit massa enim nec. Aliquam faucibus purus in massa. Tincidunt lobortis feugiat vivamus at. Habitasse platea dictumst vestibulum rhoncus. Proin sed libero enim sed. Lectus urna duis convallis convallis tellus. Cras adipiscing enim eu turpis egestas pretium aenean pharetra magna. Lobortis elementum nibh tellus molestie nunc non blandit massa. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Non nisi est sit amet facilisis magna etiam tempor. Nunc consequat interdum varius sit amet mattis vulputate enim nulla. Egestas purus viverra accumsan in nisl nisi scelerisque. Nunc mattis enim ut tellus elementum sagittis vitae et leo. Cras semper auctor neque vitae tempus quam. Ultricies mi eget mauris pharetra. Tincidunt dui ut ornare lectus sit amet est placerat in. Tristique sollicitudin nibh sit amet.\n",
" * \n",
" * Egestas maecenas pharetra convallis posuere. Sodales neque sodales ut etiam. Tristique sollicitudin nibh sit amet commodo. Adipiscing at in tellus integer feugiat scelerisque varius. Neque volutpat ac tincidunt vitae semper quis lectus. Eu scelerisque felis imperdiet proin. At urna condimentum mattis pellentesque id nibh tortor id. Eleifend donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum. Gravida neque convallis a cras semper. Commodo sed egestas egestas fringilla phasellus faucibus. Duis ultricies lacus sed turpis tincidunt. Ornare aenean euismod elementum nisi quis eleifend quam. Lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum et sollicitudin ac orci phasellus egestas.\n",
" * \n",
" * Habitant morbi tristique senectus et netus et malesuada. Nunc vel risus commodo viverra maecenas accumsan. Tincidunt eget nullam non nisi est. Vel fringilla est ullamcorper eget nulla. Nibh sit amet commodo nulla facilisi. Metus aliquam eleifend mi in nulla posuere sollicitudin. Ipsum consequat nisl vel pretium lectus quam id leo in. Ipsum dolor sit amet consectetur adipiscing elit pellentesque habitant morbi. Quam adipiscing vitae proin sagittis nisl rhoncus mattis. Amet nisl suscipit adipiscing bibendum est ultricies integer quis. Mollis aliquam ut porttitor leo. Nisi est sit amet facilisis magna etiam tempor orci eu. Ac turpis egestas maecenas pharetra convallis posuere morbi leo. Varius sit amet mattis vulputate.\n",
" * \n",
" * Tincidunt dui ut ornare lectus sit amet est. Elit eget gravida cum sociis natoque penatibus et. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Id eu nisl nunc mi ipsum faucibus vitae aliquet. Eu augue ut lectus arcu bibendum at. Porta non pulvinar neque laoreet. Diam vulputate ut pharetra sit amet aliquam id. Aliquet bibendum enim facilisis gravida. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus. Diam donec adipiscing tristique risus nec feugiat in fermentum. Odio ut enim blandit volutpat maecenas.\n",
" */\n",
"\n",
" if (returnMessage === true) {\n",
" return message;\n",
" }\n",
" helper.printHelp(message);\n",
" };\n",
" return result;\n",
"}\n",
"\n",
"//-- map implementation\n",
"helpMap = new Map();\n",
"\n",
"generateFunctionWithMap = () => {\n",
" const result = () => 'hello';\n",
" helpMap.set(result, `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Praesent elementum facilisis leo vel. Est placerat in egestas erat imperdiet sed euismod. Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Tellus elementum sagittis vitae et leo. Libero volutpat sed cras ornare. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Quis imperdiet massa tincidunt nunc. Mattis nunc sed blandit libero volutpat sed cras ornare. In iaculis nunc sed augue lacus viverra. Arcu cursus euismod quis viverra nibh cras pulvinar. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Orci nulla pellentesque dignissim enim. Nulla posuere sollicitudin aliquam ultrices sagittis. Ut enim blandit volutpat maecenas volutpat blandit. Et tortor consequat id porta nibh venenatis cras sed. Sit amet mattis vulputate enim nulla. Risus ultricies tristique nulla aliquet enim tortor at. Augue neque gravida in fermentum. Quam vulputate dignissim suspendisse in est ante.\n",
"\n",
"Nunc non blandit massa enim nec. Aliquam faucibus purus in massa. Tincidunt lobortis feugiat vivamus at. Habitasse platea dictumst vestibulum rhoncus. Proin sed libero enim sed. Lectus urna duis convallis convallis tellus. Cras adipiscing enim eu turpis egestas pretium aenean pharetra magna. Lobortis elementum nibh tellus molestie nunc non blandit massa. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Non nisi est sit amet facilisis magna etiam tempor. Nunc consequat interdum varius sit amet mattis vulputate enim nulla. Egestas purus viverra accumsan in nisl nisi scelerisque. Nunc mattis enim ut tellus elementum sagittis vitae et leo. Cras semper auctor neque vitae tempus quam. Ultricies mi eget mauris pharetra. Tincidunt dui ut ornare lectus sit amet est placerat in. Tristique sollicitudin nibh sit amet.\n",
"\n",
"Egestas maecenas pharetra convallis posuere. Sodales neque sodales ut etiam. Tristique sollicitudin nibh sit amet commodo. Adipiscing at in tellus integer feugiat scelerisque varius. Neque volutpat ac tincidunt vitae semper quis lectus. Eu scelerisque felis imperdiet proin. At urna condimentum mattis pellentesque id nibh tortor id. Eleifend donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum. Gravida neque convallis a cras semper. Commodo sed egestas egestas fringilla phasellus faucibus. Duis ultricies lacus sed turpis tincidunt. Ornare aenean euismod elementum nisi quis eleifend quam. Lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum et sollicitudin ac orci phasellus egestas.\n",
"\n",
"Habitant morbi tristique senectus et netus et malesuada. Nunc vel risus commodo viverra maecenas accumsan. Tincidunt eget nullam non nisi est. Vel fringilla est ullamcorper eget nulla. Nibh sit amet commodo nulla facilisi. Metus aliquam eleifend mi in nulla posuere sollicitudin. Ipsum consequat nisl vel pretium lectus quam id leo in. Ipsum dolor sit amet consectetur adipiscing elit pellentesque habitant morbi. Quam adipiscing vitae proin sagittis nisl rhoncus mattis. Amet nisl suscipit adipiscing bibendum est ultricies integer quis. Mollis aliquam ut porttitor leo. Nisi est sit amet facilisis magna etiam tempor orci eu. Ac turpis egestas maecenas pharetra convallis posuere morbi leo. Varius sit amet mattis vulputate.\n",
"\n",
"Tincidunt dui ut ornare lectus sit amet est. Elit eget gravida cum sociis natoque penatibus et. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Id eu nisl nunc mi ipsum faucibus vitae aliquet. Eu augue ut lectus arcu bibendum at. Porta non pulvinar neque laoreet. Diam vulputate ut pharetra sit amet aliquam id. Aliquet bibendum enim facilisis gravida. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus. Diam donec adipiscing tristique risus nec feugiat in fermentum. Odio ut enim blandit volutpat maecenas.`);\n",
" return result;\n",
"};\n",
"\n",
"generateFunctionBaseline = () => (printHelp) => !printHelp ? '' : `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Praesent elementum facilisis leo vel. Est placerat in egestas erat imperdiet sed euismod. Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Tellus elementum sagittis vitae et leo. Libero volutpat sed cras ornare. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque. Quis imperdiet massa tincidunt nunc. Mattis nunc sed blandit libero volutpat sed cras ornare. In iaculis nunc sed augue lacus viverra. Arcu cursus euismod quis viverra nibh cras pulvinar. Amet mattis vulputate enim nulla aliquet porttitor lacus luctus. Orci nulla pellentesque dignissim enim. Nulla posuere sollicitudin aliquam ultrices sagittis. Ut enim blandit volutpat maecenas volutpat blandit. Et tortor consequat id porta nibh venenatis cras sed. Sit amet mattis vulputate enim nulla. Risus ultricies tristique nulla aliquet enim tortor at. Augue neque gravida in fermentum. Quam vulputate dignissim suspendisse in est ante.\n",
"\n",
"Nunc non blandit massa enim nec. Aliquam faucibus purus in massa. Tincidunt lobortis feugiat vivamus at. Habitasse platea dictumst vestibulum rhoncus. Proin sed libero enim sed. Lectus urna duis convallis convallis tellus. Cras adipiscing enim eu turpis egestas pretium aenean pharetra magna. Lobortis elementum nibh tellus molestie nunc non blandit massa. Bibendum at varius vel pharetra vel turpis nunc eget lorem. Non nisi est sit amet facilisis magna etiam tempor. Nunc consequat interdum varius sit amet mattis vulputate enim nulla. Egestas purus viverra accumsan in nisl nisi scelerisque. Nunc mattis enim ut tellus elementum sagittis vitae et leo. Cras semper auctor neque vitae tempus quam. Ultricies mi eget mauris pharetra. Tincidunt dui ut ornare lectus sit amet est placerat in. Tristique sollicitudin nibh sit amet.\n",
"\n",
"Egestas maecenas pharetra convallis posuere. Sodales neque sodales ut etiam. Tristique sollicitudin nibh sit amet commodo. Adipiscing at in tellus integer feugiat scelerisque varius. Neque volutpat ac tincidunt vitae semper quis lectus. Eu scelerisque felis imperdiet proin. At urna condimentum mattis pellentesque id nibh tortor id. Eleifend donec pretium vulputate sapien nec sagittis aliquam malesuada bibendum. Gravida neque convallis a cras semper. Commodo sed egestas egestas fringilla phasellus faucibus. Duis ultricies lacus sed turpis tincidunt. Ornare aenean euismod elementum nisi quis eleifend quam. Lorem ipsum dolor sit amet consectetur adipiscing elit. Fermentum et sollicitudin ac orci phasellus egestas.\n",
"\n",
"Habitant morbi tristique senectus et netus et malesuada. Nunc vel risus commodo viverra maecenas accumsan. Tincidunt eget nullam non nisi est. Vel fringilla est ullamcorper eget nulla. Nibh sit amet commodo nulla facilisi. Metus aliquam eleifend mi in nulla posuere sollicitudin. Ipsum consequat nisl vel pretium lectus quam id leo in. Ipsum dolor sit amet consectetur adipiscing elit pellentesque habitant morbi. Quam adipiscing vitae proin sagittis nisl rhoncus mattis. Amet nisl suscipit adipiscing bibendum est ultricies integer quis. Mollis aliquam ut porttitor leo. Nisi est sit amet facilisis magna etiam tempor orci eu. Ac turpis egestas maecenas pharetra convallis posuere morbi leo. Varius sit amet mattis vulputate.\n",
"\n",
"Tincidunt dui ut ornare lectus sit amet est. Elit eget gravida cum sociis natoque penatibus et. Posuere sollicitudin aliquam ultrices sagittis orci a scelerisque purus. Id eu nisl nunc mi ipsum faucibus vitae aliquet. Eu augue ut lectus arcu bibendum at. Porta non pulvinar neque laoreet. Diam vulputate ut pharetra sit amet aliquam id. Aliquet bibendum enim facilisis gravida. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus. Diam donec adipiscing tristique risus nec feugiat in fermentum. Odio ut enim blandit volutpat maecenas.`;\n",
"\n",
"generateFunctionEmpty = () => () => 'hello';\n",
"\n",
"functionFactory = {\n",
" bind: generateFunctionWithBind,\n",
" arrow: generateFunctionWithArrow,\n",
" docString: generateFunctionWithDocString,\n",
" map: generateFunctionWithMap,\n",
" baseline: generateFunctionBaseline,\n",
" empty: generateFunctionEmpty\n",
"}\n",
"\n",
"generateBigObject = (numberOfFunctions, type) => {\n",
" const targetFn = functionFactory[type]();\n",
" const result = { numberOfFunctions };\n",
" for (let i = 0; i < numberOfFunctions; i++ ) {\n",
" result[`function${i}`] = targetFn;\n",
" }\n",
" return result;\n",
"}\n",
"\n",
"\n",
"//-- configure your test here\n",
"setupTest = () => {\n",
" let numberOfObjects = 100000;\n",
" let type = 'bind';\n",
" window.bigObject = generateBigObject(numberOfObjects, type);\n",
"}\n",
"\n",
"//-- actually run the test\n",
"setupTest();"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "873343c2-5905-443a-81ba-90d7b4af99e3",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"class MemoryFootprint2:\n",
" def __init__(self, type, count, systemSize, windowSize, retainedSize, componentOf = None):\n",
" self.type = type\n",
" self.count = count\n",
" self.systemSize = systemSize;\n",
" self.windowSize = windowSize;\n",
" self.retainedSize = retainedSize\n",
" self.componentOf = componentOf\n",
" \n",
" def __repr__(self):\n",
" return f\"<MemoryFootprint type={self.type} count={self.count} systemSize={self.systemSize} windowSize={self.windowSize} retainedSize={self.retainedSize} componentOf={self.componentOf} />\"\n",
" \n",
" def toDict(self):\n",
" return {\n",
" 'type': self.type,\n",
" 'count': self.count,\n",
" 'systemSize': self.systemSize,\n",
" 'windowSize': self.windowSize,\n",
" 'retainedSize': self.retainedSize,\n",
" 'componentOf': self.componentOf\n",
" }"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "326ef0cf-8a08-43d1-ac65-1830f32e921b",
"metadata": {},
"outputs": [],
"source": [
"footprintResults2 = [\n",
" MemoryFootprint2('bind', 100, 742772, 93232, 5728),\n",
" MemoryFootprint2('bind', 1000, 707820, 133492, 48832),\n",
" MemoryFootprint2('bind', 10000, 704688, 521544, 436864),\n",
" MemoryFootprint2('bind', 100000, 707844, 5990648, 5905984),\n",
" MemoryFootprint2('arrow', 100, 707900, 90576, 5740),\n",
" MemoryFootprint2('arrow', 1000, 704828, 133704, 48844),\n",
" MemoryFootprint2('arrow', 10000, 706120, 521720, 436876),\n",
" MemoryFootprint2('arrow', 100000, 706568, 5990840, 5905996),\n",
" MemoryFootprint2('docString', 100, 739136, 88972, 5580),\n",
" MemoryFootprint2('docString', 1000, 707604, 129396, 48684),\n",
" MemoryFootprint2('docString', 10000, 706108, 517428, 436716),\n",
" MemoryFootprint2('docString', 100000, 706016, 5986548, 5905836),\n",
" MemoryFootprint2('map', 100, 704516, 90232, 5552),\n",
" MemoryFootprint2('map', 1000, 704520, 133340, 48656),\n",
" MemoryFootprint2('map', 10000, 695096, 521124, 436688),\n",
" MemoryFootprint2('map', 100000, 706540, 5990480, 5905808),\n",
" MemoryFootprint2('baseline', 100, 705996, 86264, 5580),\n",
" MemoryFootprint2('baseline', 1000, 698168, 128772, 48684),\n",
" MemoryFootprint2('baseline', 10000, 705488, 517408, 436716),\n",
" MemoryFootprint2('baseline', 100000, 706020, 5986528, 5905836)\n",
"]"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "43bff350-0ea8-4713-a2e5-d6adbe27c59b",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"footprintDF2 = pd.DataFrame(data = [footprint.toDict() for footprint in footprintResults2])"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "f26bb804-3482-42ff-b8fe-9088ac71dd98",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>type</th>\n",
" <th>count</th>\n",
" <th>systemSize</th>\n",
" <th>windowSize</th>\n",
" <th>retainedSize</th>\n",
" <th>componentOf</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>bind</td>\n",
" <td>100</td>\n",
" <td>742772</td>\n",
" <td>93232</td>\n",
" <td>5728</td>\n",
" <td>None</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>bind</td>\n",
" <td>1000</td>\n",
" <td>707820</td>\n",
" <td>133492</td>\n",
" <td>48832</td>\n",
" <td>None</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" type count systemSize windowSize retainedSize componentOf\n",
"0 bind 100 742772 93232 5728 None\n",
"1 bind 1000 707820 133492 48832 None"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"footprintDF2.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "1f177c91-e8ef-42b7-9566-e91023e4e50e",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# Normalize based on the max size for that count\n",
"maxFootprint2 = footprintDF2.groupby('count').max('retainedSize')\n",
"# footprintDF2.apply(lambda row: row['retainedSize'] / maxFootprint2.loc[row['count']], axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "b177e39d-82ce-4843-b245-b3f16d77ec28",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>windowSize</th>\n",
" </tr>\n",
" <tr>\n",
" <th>count</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>100</th>\n",
" <td>93232</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1000</th>\n",
" <td>133704</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10000</th>\n",
" <td>521720</td>\n",
" </tr>\n",
" <tr>\n",
" <th>100000</th>\n",
" <td>5990840</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" windowSize\n",
"count \n",
"100 93232\n",
"1000 133704\n",
"10000 521720\n",
"100000 5990840"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"footprintDF2.groupby('count')[['windowSize']].max()"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "5fce40f6-cab7-4ec6-ae7c-ae1b781efdf9",
"metadata": {},
"outputs": [],
"source": [
"makeNormalizedPct(footprintDF2, 'count', 'systemSize')"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "47df1f97-ac0b-4a00-b587-faa22d42fe70",
"metadata": {},
"outputs": [],
"source": [
"makeNormalizedPct(footprintDF2, 'count', 'windowSize')"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "0f3e7fd8-5c2d-4557-ac9b-fa59e07111d1",
"metadata": {},
"outputs": [],
"source": [
"makeNormalizedPct(footprintDF2, 'count', 'retainedSize')"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "25b1c53f-c749-4e5a-932d-0637ee2dd6ea",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>type</th>\n",
" <th>count</th>\n",
" <th>systemSize</th>\n",
" <th>windowSize</th>\n",
" <th>retainedSize</th>\n",
" <th>componentOf</th>\n",
" <th>systemSizePct</th>\n",
" <th>windowSizePct</th>\n",
" <th>retainedSizePct</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>bind</td>\n",
" <td>100</td>\n",
" <td>742772</td>\n",
" <td>93232</td>\n",
" <td>5728</td>\n",
" <td>None</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>0.997909</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>bind</td>\n",
" <td>1000</td>\n",
" <td>707820</td>\n",
" <td>133492</td>\n",
" <td>48832</td>\n",
" <td>None</td>\n",
" <td>1.000000</td>\n",
" <td>0.998414</td>\n",
" <td>0.999754</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>bind</td>\n",
" <td>10000</td>\n",
" <td>704688</td>\n",
" <td>521544</td>\n",
" <td>436864</td>\n",
" <td>None</td>\n",
" <td>0.997972</td>\n",
" <td>0.999663</td>\n",
" <td>0.999973</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>bind</td>\n",
" <td>100000</td>\n",
" <td>707844</td>\n",
" <td>5990648</td>\n",
" <td>5905984</td>\n",
" <td>None</td>\n",
" <td>1.000000</td>\n",
" <td>0.999968</td>\n",
" <td>0.999998</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>arrow</td>\n",
" <td>100</td>\n",
" <td>707900</td>\n",
" <td>90576</td>\n",
" <td>5740</td>\n",
" <td>None</td>\n",
" <td>0.953052</td>\n",
" <td>0.971512</td>\n",
" <td>1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>arrow</td>\n",
" <td>1000</td>\n",
" <td>704828</td>\n",
" <td>133704</td>\n",
" <td>48844</td>\n",
" <td>None</td>\n",
" <td>0.995773</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>arrow</td>\n",
" <td>10000</td>\n",
" <td>706120</td>\n",
" <td>521720</td>\n",
" <td>436876</td>\n",
" <td>None</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>arrow</td>\n",
" <td>100000</td>\n",
" <td>706568</td>\n",
" <td>5990840</td>\n",
" <td>5905996</td>\n",
" <td>None</td>\n",
" <td>0.998197</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>docString</td>\n",
" <td>100</td>\n",
" <td>739136</td>\n",
" <td>88972</td>\n",
" <td>5580</td>\n",
" <td>None</td>\n",
" <td>0.995105</td>\n",
" <td>0.954308</td>\n",
" <td>0.972125</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>docString</td>\n",
" <td>1000</td>\n",
" <td>707604</td>\n",
" <td>129396</td>\n",
" <td>48684</td>\n",
" <td>None</td>\n",
" <td>0.999695</td>\n",
" <td>0.967780</td>\n",
" <td>0.996724</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>docString</td>\n",
" <td>10000</td>\n",
" <td>706108</td>\n",
" <td>517428</td>\n",
" <td>436716</td>\n",
" <td>None</td>\n",
" <td>0.999983</td>\n",
" <td>0.991773</td>\n",
" <td>0.999634</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>docString</td>\n",
" <td>100000</td>\n",
" <td>706016</td>\n",
" <td>5986548</td>\n",
" <td>5905836</td>\n",
" <td>None</td>\n",
" <td>0.997418</td>\n",
" <td>0.999284</td>\n",
" <td>0.999973</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>map</td>\n",
" <td>100</td>\n",
" <td>704516</td>\n",
" <td>90232</td>\n",
" <td>5552</td>\n",
" <td>None</td>\n",
" <td>0.948496</td>\n",
" <td>0.967822</td>\n",
" <td>0.967247</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>map</td>\n",
" <td>1000</td>\n",
" <td>704520</td>\n",
" <td>133340</td>\n",
" <td>48656</td>\n",
" <td>None</td>\n",
" <td>0.995338</td>\n",
" <td>0.997278</td>\n",
" <td>0.996151</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>map</td>\n",
" <td>10000</td>\n",
" <td>695096</td>\n",
" <td>521124</td>\n",
" <td>436688</td>\n",
" <td>None</td>\n",
" <td>0.984388</td>\n",
" <td>0.998858</td>\n",
" <td>0.999570</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>map</td>\n",
" <td>100000</td>\n",
" <td>706540</td>\n",
" <td>5990480</td>\n",
" <td>5905808</td>\n",
" <td>None</td>\n",
" <td>0.998158</td>\n",
" <td>0.999940</td>\n",
" <td>0.999968</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>baseline</td>\n",
" <td>100</td>\n",
" <td>705996</td>\n",
" <td>86264</td>\n",
" <td>5580</td>\n",
" <td>None</td>\n",
" <td>0.950488</td>\n",
" <td>0.925262</td>\n",
" <td>0.972125</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>baseline</td>\n",
" <td>1000</td>\n",
" <td>698168</td>\n",
" <td>128772</td>\n",
" <td>48684</td>\n",
" <td>None</td>\n",
" <td>0.986364</td>\n",
" <td>0.963113</td>\n",
" <td>0.996724</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>baseline</td>\n",
" <td>10000</td>\n",
" <td>705488</td>\n",
" <td>517408</td>\n",
" <td>436716</td>\n",
" <td>None</td>\n",
" <td>0.999105</td>\n",
" <td>0.991735</td>\n",
" <td>0.999634</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>baseline</td>\n",
" <td>100000</td>\n",
" <td>706020</td>\n",
" <td>5986528</td>\n",
" <td>5905836</td>\n",
" <td>None</td>\n",
" <td>0.997423</td>\n",
" <td>0.999280</td>\n",
" <td>0.999973</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" type count systemSize windowSize retainedSize componentOf \\\n",
"0 bind 100 742772 93232 5728 None \n",
"1 bind 1000 707820 133492 48832 None \n",
"2 bind 10000 704688 521544 436864 None \n",
"3 bind 100000 707844 5990648 5905984 None \n",
"4 arrow 100 707900 90576 5740 None \n",
"5 arrow 1000 704828 133704 48844 None \n",
"6 arrow 10000 706120 521720 436876 None \n",
"7 arrow 100000 706568 5990840 5905996 None \n",
"8 docString 100 739136 88972 5580 None \n",
"9 docString 1000 707604 129396 48684 None \n",
"10 docString 10000 706108 517428 436716 None \n",
"11 docString 100000 706016 5986548 5905836 None \n",
"12 map 100 704516 90232 5552 None \n",
"13 map 1000 704520 133340 48656 None \n",
"14 map 10000 695096 521124 436688 None \n",
"15 map 100000 706540 5990480 5905808 None \n",
"16 baseline 100 705996 86264 5580 None \n",
"17 baseline 1000 698168 128772 48684 None \n",
"18 baseline 10000 705488 517408 436716 None \n",
"19 baseline 100000 706020 5986528 5905836 None \n",
"\n",
" systemSizePct windowSizePct retainedSizePct \n",
"0 1.000000 1.000000 0.997909 \n",
"1 1.000000 0.998414 0.999754 \n",
"2 0.997972 0.999663 0.999973 \n",
"3 1.000000 0.999968 0.999998 \n",
"4 0.953052 0.971512 1.000000 \n",
"5 0.995773 1.000000 1.000000 \n",
"6 1.000000 1.000000 1.000000 \n",
"7 0.998197 1.000000 1.000000 \n",
"8 0.995105 0.954308 0.972125 \n",
"9 0.999695 0.967780 0.996724 \n",
"10 0.999983 0.991773 0.999634 \n",
"11 0.997418 0.999284 0.999973 \n",
"12 0.948496 0.967822 0.967247 \n",
"13 0.995338 0.997278 0.996151 \n",
"14 0.984388 0.998858 0.999570 \n",
"15 0.998158 0.999940 0.999968 \n",
"16 0.950488 0.925262 0.972125 \n",
"17 0.986364 0.963113 0.996724 \n",
"18 0.999105 0.991735 0.999634 \n",
"19 0.997423 0.999280 0.999973 "
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"footprintDF2"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "49f16260-daf3-41d4-8b82-d1ca2f75e05d",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.vegalite.v4+json": {
"$schema": "https://vega.github.io/schema/vega-lite/v4.8.1.json",
"config": {
"view": {
"continuousHeight": 300,
"continuousWidth": 400
}
},
"data": {
"name": "data-846afac2a270f36745175bd46569e332"
},
"datasets": {
"data-846afac2a270f36745175bd46569e332": [
{
"componentOf": null,
"count": 100,
"retainedSize": 5728,
"retainedSizePct": 0.9979094076655052,
"systemSize": 742772,
"systemSizePct": 1,
"type": "bind",
"windowSize": 93232,
"windowSizePct": 1
},
{
"componentOf": null,
"count": 1000,
"retainedSize": 48832,
"retainedSizePct": 0.9997543198755221,
"systemSize": 707820,
"systemSizePct": 1,
"type": "bind",
"windowSize": 133492,
"windowSizePct": 0.9984144079459104
},
{
"componentOf": null,
"count": 10000,
"retainedSize": 436864,
"retainedSizePct": 0.9999725322517145,
"systemSize": 704688,
"systemSizePct": 0.9979720160879171,
"type": "bind",
"windowSize": 521544,
"windowSizePct": 0.9996626542973243
},
{
"componentOf": null,
"count": 100000,
"retainedSize": 5905984,
"retainedSizePct": 0.9999979681665887,
"systemSize": 707844,
"systemSizePct": 1,
"type": "bind",
"windowSize": 5990648,
"windowSizePct": 0.9999679510719699
},
{
"componentOf": null,
"count": 100,
"retainedSize": 5740,
"retainedSizePct": 1,
"systemSize": 707900,
"systemSizePct": 0.9530515420613593,
"type": "arrow",
"windowSize": 90576,
"windowSizePct": 0.971511927235284
},
{
"componentOf": null,
"count": 1000,
"retainedSize": 48844,
"retainedSizePct": 1,
"systemSize": 704828,
"systemSizePct": 0.9957729366223051,
"type": "arrow",
"windowSize": 133704,
"windowSizePct": 1
},
{
"componentOf": null,
"count": 10000,
"retainedSize": 436876,
"retainedSizePct": 1,
"systemSize": 706120,
"systemSizePct": 1,
"type": "arrow",
"windowSize": 521720,
"windowSizePct": 1
},
{
"componentOf": null,
"count": 100000,
"retainedSize": 5905996,
"retainedSizePct": 1,
"systemSize": 706568,
"systemSizePct": 0.998197342917366,
"type": "arrow",
"windowSize": 5990840,
"windowSizePct": 1
},
{
"componentOf": null,
"count": 100,
"retainedSize": 5580,
"retainedSizePct": 0.9721254355400697,
"systemSize": 739136,
"systemSizePct": 0.9951048235528533,
"type": "docString",
"windowSize": 88972,
"windowSizePct": 0.954307533893942
},
{
"componentOf": null,
"count": 1000,
"retainedSize": 48684,
"retainedSizePct": 0.996724265006961,
"systemSize": 707604,
"systemSizePct": 0.9996948376705942,
"type": "docString",
"windowSize": 129396,
"windowSizePct": 0.9677795727876504
},
{
"componentOf": null,
"count": 10000,
"retainedSize": 436716,
"retainedSizePct": 0.9996337633561926,
"systemSize": 706108,
"systemSizePct": 0.9999830057214071,
"type": "docString",
"windowSize": 517428,
"windowSizePct": 0.9917733650233842
},
{
"componentOf": null,
"count": 100000,
"retainedSize": 5905836,
"retainedSizePct": 0.9999729088878488,
"systemSize": 706016,
"systemSizePct": 0.997417510072841,
"type": "docString",
"windowSize": 5986548,
"windowSizePct": 0.9992835729213265
},
{
"componentOf": null,
"count": 100,
"retainedSize": 5552,
"retainedSizePct": 0.9672473867595819,
"systemSize": 704516,
"systemSizePct": 0.9484956352689654,
"type": "map",
"windowSize": 90232,
"windowSizePct": 0.9678222069675648
},
{
"componentOf": null,
"count": 1000,
"retainedSize": 48656,
"retainedSizePct": 0.9961510113831791,
"systemSize": 704520,
"systemSizePct": 0.9953377977451895,
"type": "map",
"windowSize": 133340,
"windowSizePct": 0.9972775683599593
},
{
"componentOf": null,
"count": 10000,
"retainedSize": 436688,
"retainedSizePct": 0.9995696719435263,
"systemSize": 695096,
"systemSizePct": 0.9843879227326799,
"type": "map",
"windowSize": 521124,
"windowSizePct": 0.9988576247795753
},
{
"componentOf": null,
"count": 100000,
"retainedSize": 5905808,
"retainedSizePct": 0.9999681679432224,
"systemSize": 706540,
"systemSizePct": 0.9981577861788755,
"type": "map",
"windowSize": 5990480,
"windowSizePct": 0.9999399082599435
},
{
"componentOf": null,
"count": 100,
"retainedSize": 5580,
"retainedSizePct": 0.9721254355400697,
"systemSize": 705996,
"systemSizePct": 0.9504881713365608,
"type": "baseline",
"windowSize": 86264,
"windowSizePct": 0.9252617127166638
},
{
"componentOf": null,
"count": 1000,
"retainedSize": 48684,
"retainedSizePct": 0.996724265006961,
"systemSize": 698168,
"systemSizePct": 0.9863637647989602,
"type": "baseline",
"windowSize": 128772,
"windowSizePct": 0.9631125471190092
},
{
"componentOf": null,
"count": 10000,
"retainedSize": 436716,
"retainedSizePct": 0.9996337633561926,
"systemSize": 705488,
"systemSizePct": 0.9991049679941086,
"type": "baseline",
"windowSize": 517408,
"windowSizePct": 0.9917350302844438
},
{
"componentOf": null,
"count": 100000,
"retainedSize": 5905836,
"retainedSizePct": 0.9999729088878488,
"systemSize": 706020,
"systemSizePct": 0.9974231610354823,
"type": "baseline",
"windowSize": 5986528,
"windowSizePct": 0.9992802344913234
}
]
},
"encoding": {
"color": {
"field": "type",
"type": "nominal"
},
"x": {
"field": "count",
"type": "nominal"
},
"y": {
"field": "windowSizePct",
"scale": {
"domain": [
0.94,
1
]
},
"type": "quantitative"
}
},
"height": 200,
"mark": "line",
"width": 600
},
"image/png": "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",
"text/plain": [
"<VegaLite 4 object>\n",
"\n",
"If you see this message, it means the renderer has not been properly enabled\n",
"for the frontend that you are using. For more information, see\n",
"https://altair-viz.github.io/user_guide/troubleshooting.html\n"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"alt.Chart(footprintDF2).mark_line().encode(\n",
" x = alt.X(\"count:N\"),\n",
" y = alt.Y(\"windowSizePct:Q\", scale=alt.Scale(domain=[0.94, 1])),\n",
" color = \"type\"\n",
").properties(width=600, height=200)"
]
}
],
"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.8.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment