Skip to content

Instantly share code, notes, and snippets.

@alexarchambault
Created April 21, 2020 13:50
Show Gist options
  • Save alexarchambault/b3423fc3704f017bceb505939f77fd61 to your computer and use it in GitHub Desktop.
Save alexarchambault/b3423fc3704f017bceb505939f77fd61 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## How to run the benchmark\n",
"\n",
"Get data for the latest release (`before`):\n",
"```bash\n",
"$ cs launch coursier -- resolve --checksum none org.apache.spark:spark-repl_2.12:2.4.4 -B -100 2>&1 | tee before\n",
"```\n",
"\n",
"Get data for the PR (`after`):\n",
"```bash\n",
"$ sbt cli/pack # ensure #1677 is checked-out before that\n",
"$ modules/cli/target/pack/bin/coursier resolve --checksum none org.apache.spark:spark-repl_2.12:2.4.4 -B -100 2>&1 | tee after\n",
"```\n",
"\n",
"`int-map` data is obtained with the same command as `after`, but with just the IntMap changes.\n",
"\n",
"`before-2` data is obtained with the same command as `after` too, with the changes of #1677 reverted."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\u001b[32mimport \u001b[39m\u001b[36mjava.nio.file._\n",
"\u001b[39m\n",
"\u001b[32mimport \u001b[39m\u001b[36mjava.nio.charset.StandardCharsets\n",
"\n",
"\u001b[39m\n",
"defined \u001b[32mfunction\u001b[39m \u001b[36mbefore\u001b[39m\n",
"defined \u001b[32mfunction\u001b[39m \u001b[36mbefore2\u001b[39m\n",
"defined \u001b[32mfunction\u001b[39m \u001b[36mintMap\u001b[39m\n",
"defined \u001b[32mfunction\u001b[39m \u001b[36mafter\u001b[39m"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import java.nio.file._\n",
"import java.nio.charset.StandardCharsets\n",
"\n",
"private val drop = 20\n",
"\n",
"private def load(file: Path): Seq[Int] = {\n",
" val input = new String(Files.readAllBytes(file), StandardCharsets.UTF_8)\n",
" input\n",
" .linesIterator\n",
" .map(_.trim)\n",
" .filter(_.endsWith(\" ms\"))\n",
" .map(_.stripSuffix(\" ms\"))\n",
" .drop(drop)\n",
" .map(_.toInt)\n",
" .toVector\n",
"}\n",
"\n",
"private val dir = Paths.get(\"/Users/alexandre/projects/coursier\")\n",
"def before = load(dir.resolve(\"before\"))\n",
"def before2 = load(dir.resolve(\"before-2\"))\n",
"def intMap = load(dir.resolve(\"int-map\"))\n",
"def after = load(dir.resolve(\"after\"))"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <script type=\"text/javascript\">\n",
" require.config({\n",
" paths: {\n",
" d3: 'https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.17/d3.min',\n",
" plotly: 'https://cdn.plot.ly/plotly-1.41.3.min',\n",
" jquery: 'https://code.jquery.com/jquery-3.3.1.min'\n",
" },\n",
"\n",
" shim: {\n",
" plotly: {\n",
" deps: ['d3', 'jquery'],\n",
" exports: 'plotly'\n",
" }\n",
" }\n",
"});\n",
" \n",
"\n",
" require(['plotly'], function(Plotly) {\n",
" window.Plotly = Plotly;\n",
" });\n",
" </script>\n",
" "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.plotly.v1+json": {
"data": [
{
"name": "after",
"type": "box",
"x": [
468,
416,
438,
376,
460,
381,
373,
394,
429,
382,
401,
445,
365,
368,
354,
368,
387,
345,
379,
369,
361,
374,
371,
427,
347,
321,
322,
323,
324,
320,
321,
319,
342,
319,
319,
333,
401,
353,
366,
368,
365,
393,
353,
370,
374,
363,
349,
371,
356,
373,
362,
369,
381,
361,
371,
367,
359,
371,
347,
356,
385,
373,
351,
379,
344,
354,
371,
365,
357,
364,
373,
372,
359,
369,
368,
353,
365,
355,
364,
363,
350
]
},
{
"name": "IntMap only",
"type": "box",
"x": [
425,
448,
431,
369,
391,
436,
476,
360,
455,
367,
356,
358,
375,
395,
397,
386,
397,
368,
370,
401,
374,
374,
402,
426,
374,
403,
363,
387,
371,
372,
369,
414,
412,
414,
375,
367,
376,
373,
387,
379,
389,
381,
383,
386,
476,
419,
374,
367,
360,
400,
393,
401,
367,
361,
372,
367,
371,
388,
400,
376,
353,
324,
319,
319,
314,
359,
366,
380,
404,
385,
368,
378,
380,
379,
380,
369,
448,
381,
381,
371,
396
]
},
{
"name": "before (via sbt-pack)",
"type": "box",
"x": [
425,
485,
460,
419,
417,
386,
443,
435,
489,
371,
370,
457,
401,
382,
625,
517,
537,
488,
509,
506,
505,
467,
370,
402,
465,
357,
378,
348,
327,
347,
361,
417,
388,
413,
387,
391,
387,
451,
456,
405,
357,
412,
388,
371,
418,
393,
345,
340,
357,
386,
417,
384,
375,
323,
315,
354,
365,
395,
367,
370,
373,
372,
363,
374,
384,
414,
369,
370,
363,
333,
327,
312,
343,
359,
381,
405,
369,
373,
351,
392,
364
]
},
{
"name": "before",
"type": "box",
"x": [
420,
414,
461,
399,
545,
393,
403,
331,
391,
399,
402,
374,
453,
379,
356,
327,
355,
362,
341,
348,
386,
339,
333,
353,
335,
367,
326,
339,
335,
338,
397,
380,
335,
336,
337,
347,
336,
341,
334,
336,
336,
392,
351,
353,
326,
340,
355,
323,
313,
305,
295,
299,
295,
301,
302,
306,
299,
287,
304,
305,
292,
301,
299,
335,
334,
310,
320,
353,
333,
333,
391,
325,
329,
354,
341,
328,
340,
344,
339,
332,
332
]
}
],
"layout": {
"autosize": true,
"xaxis": {
"autorange": true,
"range": [
268.22222222222223,
643.7777777777778
],
"type": "linear"
},
"yaxis": {
"autorange": true,
"range": [
-0.5,
3.5
],
"type": "category"
}
}
},
"image/png": "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",
"text/html": [
"<div class=\"chart\" id=\"plot-6fa6aa88-e63a-4367-9666-6f288060c83e\"></div>\n",
"<script>require(['plotly'], function(Plotly) {\n",
" (function () {\n",
" var data0 = {\"x\":[468.0,416.0,438.0,376.0,460.0,381.0,373.0,394.0,429.0,382.0,401.0,445.0,365.0,368.0,354.0,368.0,387.0,345.0,379.0,369.0,361.0,374.0,371.0,427.0,347.0,321.0,322.0,323.0,324.0,320.0,321.0,319.0,342.0,319.0,319.0,333.0,401.0,353.0,366.0,368.0,365.0,393.0,353.0,370.0,374.0,363.0,349.0,371.0,356.0,373.0,362.0,369.0,381.0,361.0,371.0,367.0,359.0,371.0,347.0,356.0,385.0,373.0,351.0,379.0,344.0,354.0,371.0,365.0,357.0,364.0,373.0,372.0,359.0,369.0,368.0,353.0,365.0,355.0,364.0,363.0,350.0],\"name\":\"after\",\"type\":\"box\"};\n",
" var data1 = {\"x\":[425.0,448.0,431.0,369.0,391.0,436.0,476.0,360.0,455.0,367.0,356.0,358.0,375.0,395.0,397.0,386.0,397.0,368.0,370.0,401.0,374.0,374.0,402.0,426.0,374.0,403.0,363.0,387.0,371.0,372.0,369.0,414.0,412.0,414.0,375.0,367.0,376.0,373.0,387.0,379.0,389.0,381.0,383.0,386.0,476.0,419.0,374.0,367.0,360.0,400.0,393.0,401.0,367.0,361.0,372.0,367.0,371.0,388.0,400.0,376.0,353.0,324.0,319.0,319.0,314.0,359.0,366.0,380.0,404.0,385.0,368.0,378.0,380.0,379.0,380.0,369.0,448.0,381.0,381.0,371.0,396.0],\"name\":\"IntMap only\",\"type\":\"box\"};\n",
" var data2 = {\"x\":[425.0,485.0,460.0,419.0,417.0,386.0,443.0,435.0,489.0,371.0,370.0,457.0,401.0,382.0,625.0,517.0,537.0,488.0,509.0,506.0,505.0,467.0,370.0,402.0,465.0,357.0,378.0,348.0,327.0,347.0,361.0,417.0,388.0,413.0,387.0,391.0,387.0,451.0,456.0,405.0,357.0,412.0,388.0,371.0,418.0,393.0,345.0,340.0,357.0,386.0,417.0,384.0,375.0,323.0,315.0,354.0,365.0,395.0,367.0,370.0,373.0,372.0,363.0,374.0,384.0,414.0,369.0,370.0,363.0,333.0,327.0,312.0,343.0,359.0,381.0,405.0,369.0,373.0,351.0,392.0,364.0],\"name\":\"before (via sbt-pack)\",\"type\":\"box\"};\n",
" var data3 = {\"x\":[420.0,414.0,461.0,399.0,545.0,393.0,403.0,331.0,391.0,399.0,402.0,374.0,453.0,379.0,356.0,327.0,355.0,362.0,341.0,348.0,386.0,339.0,333.0,353.0,335.0,367.0,326.0,339.0,335.0,338.0,397.0,380.0,335.0,336.0,337.0,347.0,336.0,341.0,334.0,336.0,336.0,392.0,351.0,353.0,326.0,340.0,355.0,323.0,313.0,305.0,295.0,299.0,295.0,301.0,302.0,306.0,299.0,287.0,304.0,305.0,292.0,301.0,299.0,335.0,334.0,310.0,320.0,353.0,333.0,333.0,391.0,325.0,329.0,354.0,341.0,328.0,340.0,344.0,339.0,332.0,332.0],\"name\":\"before\",\"type\":\"box\"};\n",
"\n",
" var data = [data0, data1, data2, data3];\n",
" var layout = {};\n",
"\n",
" Plotly.plot('plot-6fa6aa88-e63a-4367-9666-6f288060c83e', data, layout);\n",
"})();\n",
"});\n",
" </script>\n",
" "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"\u001b[32mimport \u001b[39m\u001b[36m$ivy.$ \n",
"\n",
"\u001b[39m\n",
"\u001b[32mimport \u001b[39m\u001b[36mplotly._\n",
"\u001b[39m\n",
"\u001b[32mimport \u001b[39m\u001b[36mplotly.element._\n",
"\u001b[39m\n",
"\u001b[32mimport \u001b[39m\u001b[36mplotly.layout._\n",
"\u001b[39m\n",
"\u001b[32mimport \u001b[39m\u001b[36mplotly.Almond._\n",
"\n",
"\u001b[39m"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import $ivy.`org.plotly-scala::plotly-almond:0.7.4`\n",
"\n",
"import plotly._\n",
"import plotly.element._\n",
"import plotly.layout._\n",
"import plotly.Almond._\n",
"\n",
"private def data = Seq(\n",
" Box(x = before, name = \"before\"),\n",
" Box(x = before2, name = \"before (via sbt-pack)\"),\n",
" Box(x = intMap, name = \"IntMap only\"),\n",
" Box(x = after, name = \"after\")\n",
")\n",
"\n",
"{ data.reverse.plot(); () }"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Scala",
"language": "scala",
"name": "scala"
},
"language_info": {
"codemirror_mode": "text/x-scala",
"file_extension": ".scala",
"mimetype": "text/x-scala",
"name": "scala",
"nbconvert_exporter": "script",
"version": "2.13.1"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment