Created
April 21, 2020 13:50
-
-
Save alexarchambault/b3423fc3704f017bceb505939f77fd61 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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