algorithm-engineering/plots.ipynb

877 lines
1.0 MiB
Plaintext
Raw Normal View History

{
"cells": [
{
"cell_type": "code",
"execution_count": 57,
"id": "77f6c627",
"metadata": {},
"outputs": [],
"source": [
"def load(file = \"./result.txt\", omit=False):\n",
" plots = dict()\n",
" maxDuration = 0\n",
" result_file = open(file, 'r')\n",
" for line in result_file:\n",
" if line.startswith(\"RESULT\"):\n",
" line = line[len(\"RESULT \"):].strip()\n",
" parts = line.split()\n",
" measurement = {}\n",
" for part in parts:\n",
" key, value = part.split('=')\n",
" measurement[key] = value\n",
"\n",
" n = int(round(int(measurement[\"n\"]), -1))\n",
" t = int(measurement[\"t\"])\n",
" if not omit:\n",
" r = int(measurement[\"r\"])\n",
" name = measurement[\"name\"]\n",
" durationNanoseconds = int(measurement[\"durationNanoseconds\"])\n",
" constructorNanoseconds = int(measurement[\"constructorNanoseconds\"])\n",
"\n",
" if name not in plots:\n",
" plots[name] = list()\n",
" plots[name + \" (constructor)\"] = list()\n",
" plots[name].append((n, durationNanoseconds / n))\n",
" plots[name + \" (constructor)\"].append((n, constructorNanoseconds / n))\n",
" maxDuration = max(maxDuration, max(durationNanoseconds, constructorNanoseconds))\n",
" return plots"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "ba392218",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'t12r-1': [(100, 3208.6),\n",
" (1000, 1194.151),\n",
" (10000, 224.6682),\n",
" (100000, 222.37976),\n",
" (1000000, 81.411108),\n",
" (10000000, 126.5144485),\n",
" (100000000, 220.28335046),\n",
" (200000000, 160.10567987)],\n",
" 't12r-1 (constructor)': [(100, 11.67),\n",
" (1000, 45.04),\n",
" (10000, 11.561),\n",
" (100000, 12.05211),\n",
" (1000000, 13.06244),\n",
" (10000000, 13.5130337),\n",
" (100000000, 13.10657687),\n",
" (200000000, 12.954903465)],\n",
" 't12r-2': [(100, 5044.0),\n",
" (1000, 962.91),\n",
" (10000, 94.6311),\n",
" (100000, 38.36613),\n",
" (1000000, 45.204953),\n",
" (10000000, 41.1877655),\n",
" (100000000, 59.04964133),\n",
" (200000000, 40.8212539)],\n",
" 't12r-2 (constructor)': [(100, 9.8),\n",
" (1000, 18.425),\n",
" (10000, 7.587),\n",
" (100000, 12.3484),\n",
" (1000000, 17.277072),\n",
" (10000000, 13.2345014),\n",
" (100000000, 12.78449745),\n",
" (200000000, 13.57673176)],\n",
" 't12r12': [(100, 3440.66),\n",
" (1000, 7330.685),\n",
" (10000, 677.8685),\n",
" (100000, 124.30239),\n",
" (1000000, 4049.188336),\n",
" (10000000, 450.4506622),\n",
" (100000000, 80.02503314),\n",
" (200000000, 51.471560365)],\n",
" 't12r12 (constructor)': [(100, 5.8),\n",
" (1000, 11.99),\n",
" (10000, 11.355),\n",
" (100000, 20.13931),\n",
" (1000000, 11.575549),\n",
" (10000000, 13.2007544),\n",
" (100000000, 13.43666131),\n",
" (200000000, 13.70210075)],\n",
" 't12r4': [(100, 3341.76),\n",
" (1000, 1164.681),\n",
" (10000, 100.647),\n",
" (100000, 39.99223),\n",
" (1000000, 35.329376),\n",
" (200000000, 35.07940464)],\n",
" 't12r4 (constructor)': [(100, 14.7),\n",
" (1000, 30.96),\n",
" (10000, 11.086),\n",
" (100000, 12.95021),\n",
" (1000000, 12.498308),\n",
" (200000000, 13.61509049)],\n",
" 't12r6': [(100, 3164.1),\n",
" (1000, 1112.061),\n",
" (10000, 323.2132),\n",
" (100000, 38.47783),\n",
" (1000000, 96.096078),\n",
" (10000000, 25.4463662),\n",
" (100000000, 66.5392428),\n",
" (200000000, 38.556153625)],\n",
" 't12r6 (constructor)': [(100, 11.05),\n",
" (1000, 35.96),\n",
" (10000, 12.713),\n",
" (100000, 12.0057),\n",
" (1000000, 13.36319),\n",
" (10000000, 13.4414736),\n",
" (100000000, 12.94797516),\n",
" (200000000, 13.567364305)],\n",
" 't12r8': [(100, 5168.4),\n",
" (1000, 706.485),\n",
" (10000, 171.1461),\n",
" (100000, 199.32525),\n",
" (1000000, 38.822188),\n",
" (100000000, 65.64686276),\n",
" (200000000, 40.638510515)],\n",
" 't12r8 (constructor)': [(100, 28.45),\n",
" (1000, 11.93),\n",
" (10000, 14.429),\n",
" (100000, 12.6684),\n",
" (1000000, 14.87902),\n",
" (100000000, 13.02517401),\n",
" (200000000, 13.150913505)],\n",
" 't16r-1': [(100, 6369.85),\n",
" (1000, 904.59),\n",
" (10000, 221.9091),\n",
" (100000, 221.76726),\n",
" (1000000, 83.162789),\n",
" (10000000, 135.7386701),\n",
" (100000000, 274.95563986),\n",
" (200000000, 173.32324352)],\n",
" 't16r-1 (constructor)': [(100, 28.05),\n",
" (1000, 10.385),\n",
" (10000, 12.647),\n",
" (100000, 13.46491),\n",
" (1000000, 12.447259),\n",
" (10000000, 14.1522251),\n",
" (100000000, 13.09979897),\n",
" (200000000, 13.299795115)],\n",
" 't16r-2': [(100, 7010.65),\n",
" (1000, 960.121),\n",
" (10000, 127.6851),\n",
" (100000, 38.93103),\n",
" (1000000, 32.399273),\n",
" (10000000, 43.348756),\n",
" (100000000, 58.22007605),\n",
" (200000000, 38.70290468)],\n",
" 't16r-2 (constructor)': [(100, 31.9),\n",
" (1000, 9.865),\n",
" (10000, 10.503),\n",
" (100000, 11.95951),\n",
" (1000000, 12.629609),\n",
" (10000000, 14.022475),\n",
" (100000000, 12.93594835),\n",
" (200000000, 13.54772634)],\n",
" 't16r12': [(100, 4681.4),\n",
" (1000, 8891.007),\n",
" (10000, 703.6395),\n",
" (100000, 79.09726),\n",
" (1000000, 4195.164911),\n",
" (10000000, 587.8941955),\n",
" (100000000, 82.94348363),\n",
" (200000000, 52.11079982)],\n",
" 't16r12 (constructor)': [(100, 5.7),\n",
" (1000, 12.04),\n",
" (10000, 12.955),\n",
" (100000, 12.26411),\n",
" (1000000, 12.779659),\n",
" (10000000, 14.4207043),\n",
" (100000000, 12.85511609),\n",
" (200000000, 13.47701654)],\n",
" 't16r4': [(100, 6457.35),\n",
" (1000, 3169.832),\n",
" (10000, 121.619),\n",
" (100000, 33.31643),\n",
" (1000000, 32.270043),\n",
" (200000000, 33.807976485)],\n",
" 't16r4 (constructor)': [(100, 27.15),\n",
" (1000, 18.09),\n",
" (10000, 10.7761),\n",
" (100000, 12.50531),\n",
" (1000000, 12.508589),\n",
" (200000000, 13.59597037)],\n",
" 't16r6': [(100, 6529.4),\n",
" (1000, 1396.281),\n",
" (10000, 389.4923),\n",
" (100000, 38.19402),\n",
" (1000000, 80.541948),\n",
" (10000000, 26.6477841),\n",
" (100000000, 60.80759209),\n",
" (200000000, 38.46740061)],\n",
" 't16r6 (constructor)': [(100, 31.1),\n",
" (1000, 9.51),\n",
" (10000, 10.995),\n",
" (100000, 15.43512),\n",
" (1000000, 12.735079),\n",
" (10000000, 12.9332532),\n",
" (100000000, 13.02187952),\n",
" (200000000, 13.779389205)],\n",
" 't16r8': [(100, 4557.8),\n",
" (1000, 1412.321),\n",
" (10000, 107.3451),\n",
" (100000, 191.48044),\n",
" (1000000, 34.575355),\n",
" (100000000, 74.72639035),\n",
" (200000000, 40.044205345)],\n",
" 't16r8 (constructor)': [(100, 13.8),\n",
" (1000, 9.955),\n",
" (10000, 11.156),\n",
" (100000, 12.06701),\n",
" (1000000, 12.632199),\n",
" (100000000, 13.61116744),\n",
" (200000000, 13.470579185)],\n",
" 't1r-1': [(100, 68.82),\n",
" (1000, 51.267),\n",
" (10000, 102.3681),\n",
" (100000, 131.3771),\n",
" (1000000, 82.126778),\n",
" (10000000, 115.2254264),\n",
" (100000000, 161.78903102),\n",
" (200000000, 120.289818535)],\n",
" 't1r-1 (constructor)': [(100, 1.68),\n",
" (1000, 2.115),\n",
" (10000, 12.667),\n",
" (100000, 12.5664),\n",
" (1000000, 12.571969),\n",
" (10000000, 13.4086086),\n",
" (100000000, 12.99034529),\n",
" (200000000, 13.65792972)],\n",
" 't1r-2': [(100, 70.75),\n",
" (1000, 103.341),\n",
" (10000, 69.553),\n",
" (100000, 68.39815),\n",
" (1000000, 72.404171),\n",
" (10000000, 73.2117254),\n",
" (100000000, 83.01397007),\n",
" (200000000, 74.427671935)],\n",
" 't1r-2 (constructor)': [(100, 1.74),\n",
" (1000, 5.133),\n",
" (10000, 7.4805),\n",
" (100000, 12.95551),\n",
" (1000000, 12.72505),\n",
" (10000000, 12.7857871),\n",
" (100000000, 12.90297483),\n",
" (200000000, 13.688172795)],\n",
" 't1r12': [(100, 71.95),\n",
" (1000, 377.7),\n",
" (10000, 157.6402),\n",
" (100000, 61.47185),\n",
" (1000000, 791.510807),\n",
" (10000000, 224.8207988),\n",
" (100000000, 85.63662135),\n",
" (200000000, 79.459634435)],\n",
" 't1r12 (constructor)': [(100, 1.71),\n",
" (1000, 6.416),\n",
" (10000, 12.733),\n",
" (100000, 12.3977),\n",
" (1000000, 11.981028),\n",
" (10000000, 13.3854396),\n",
" (100000000, 13.06359044),\n",
" (200000000, 13.76026289)],\n",
" 't1r4': [(100, 114.05),\n",
" (1000, 53.587),\n",
" (10000, 72.6655),\n",
" (100000, 71.71895),\n",
" (1000000, 76.279194),\n",
" (200000000, 86.32397599)],\n",
" 't1r4 (constructor)': [(100, 3.08),\n",
" (1000, 2.352),\n",
" (10000, 6.9505),\n",
" (100000, 12.11621),\n",
" (1000000, 12.72773),\n",
" (200000000, 12.926080995)],\n",
" 't1r6': [(100, 68.92),\n",
" (1000, 64.241),\n",
" (10000, 105.4141),\n",
" (100000, 59.55495),\n",
" (1000000, 89.868695),\n",
" (10000000, 79.9530182),\n",
" (100000000, 83.78597182),\n",
" (200000000, 74.512054445)],\n",
" 't1r6 (constructor)': [(100, 1.8),\n",
" (1000, 5.47),\n",
" (10000, 11.28),\n",
" (100000, 11.71511),\n",
" (1000000, 13.450819),\n",
" (10000000, 13.6797588),\n",
" (100000000, 13.02310882),\n",
" (200000000, 13.496335555)],\n",
" 't1r8': [(100, 74.12),\n",
" (1000, 71.71),\n",
" (10000, 64.857),\n",
" (100000, 132.26889),\n",
" (1000000, 56.860641),\n",
" (100000000, 75.61844149),\n",
" (200000000, 65.618249485)],\n",
" 't1r8 (constructor)': [(100, 1.73),\n",
" (1000, 6.837),\n",
" (10000, 7.984),\n",
" (100000, 12.30531),\n",
" (1000000, 12.677819),\n",
" (100000000, 13.10073517),\n",
" (200000000, 12.80540106)],\n",
" 't2r-1': [(100, 637.18),\n",
" (1000, 244.124),\n",
" (10000, 197.2401),\n",
" (100000, 452.51732),\n",
" (1000000, 193.956199),\n",
" (10000000, 319.3878065),\n",
" (100000000, 509.12748896),\n",
" (200000000, 430.862424625)],\n",
" 't2r-1 (constructor)': [(100, 4.59),\n",
" (1000, 11.212),\n",
" (10000, 10.571),\n",
" (100000, 11.94691),\n",
" (1000000, 12.487569),\n",
" (10000000, 13.1946494),\n",
" (100000000, 12.78603634),\n",
" (200000000, 13.007768905)],\n",
" 't2r-2': [(100, 657.68),\n",
" (1000, 171.158),\n",
" (10000, 91.5111),\n",
" (100000, 63.16315),\n",
" (1000000, 87.410793),\n",
" (10000000, 109.4305362),\n",
" (100000000, 148.39768804),\n",
" (200000000, 91.414868935)],\n",
" 't2r-2 (constructor)': [(100, 4.55),\n",
" (1000, 4.726),\n",
" (10000, 8.221),\n",
" (100000, 13.51681),\n",
" (1000000, 12.889059),\n",
" (10000000, 12.9415393),\n",
" (100000000, 12.90147473),\n",
" (200000000, 13.61517764)],\n",
" 't2r12': [(100, 979.01),\n",
" (1000, 1549.281),\n",
" (10000, 320.6102),\n",
" (100000, 60.38915),\n",
" (1000000, 7827.888069),\n",
" (10000000, 967.8686762),\n",
" (100000000, 156.61259552),\n",
" (200000000, 94.18875907)],\n",
" 't2r12 (constructor)': [(100, 8.23),\n",
" (1000, 11.25),\n",
" (10000, 13.472),\n",
" (100000, 12.78631),\n",
" (1000000, 12.947149),\n",
" (10000000, 13.877821),\n",
" (100000000, 13.76028224),\n",
" (200000000, 13.609187135)],\n",
" 't2r4': [(100, 635.75),\n",
" (1000, 148.68),\n",
" (10000, 65.9595),\n",
" (100000, 60.33095),\n",
" (1000000, 80.257168),\n",
" (200000000, 93.85613598)],\n",
" 't2r4 (constructor)': [(100, 2.93),\n",
" (1000, 5.117),\n",
" (10000, 7.324),\n",
" (100000, 12.0692),\n",
" (1000000, 12.575619),\n",
" (200000000, 13.398972235)],\n",
" 't2r6': [(100, 720.29),\n",
" (1000, 157.294),\n",
" (10000, 348.4442),\n",
" (100000, 58.24474),\n",
" (1000000, 231.810895),\n",
" (10000000, 60.3647372),\n",
" (100000000, 147.17657957),\n",
" (200000000, 81.325901165)],\n",
" 't2r6 (constructor)': [(100, 3.61),\n",
" (1000, 10.398),\n",
" (10000, 11.28),\n",
" (100000, 11.58411),\n",
" (1000000, 12.89011),\n",
" (10000000, 13.7011388),\n",
" (100000000, 13.02212831),\n",
" (200000000, 13.480678995)],\n",
" 't2r8': [(100, 1171.91),\n",
" (1000, 256.587),\n",
" (10000, 51.736),\n",
" (100000, 466.61584),\n",
" (1000000, 74.993594),\n",
" (100000000, 116.83535397),\n",
" (200000000, 79.475310495)],\n",
" 't2r8 (constructor)': [(100, 10.78),\n",
" (1000, 12.18),\n",
" (10000, 7.908),\n",
" (100000, 12.10431),\n",
" (1000000, 11.687748),\n",
" (100000000, 12.93915926),\n",
" (200000000, 12.819809665)],\n",
" 't4r-1': [(100, 1462.01),\n",
" (1000, 353.606),\n",
" (10000, 223.5642),\n",
" (100000, 302.06291),\n",
" (1000000, 133.896136),\n",
" (10000000, 221.7821896),\n",
" (100000000, 339.63433633),\n",
" (200000000, 282.353758655)],\n",
" 't4r-1 (constructor)': [(100, 5.01),\n",
" (1000, 10.516),\n",
" (10000, 12.362),\n",
" (100000, 13.61541),\n",
" (1000000, 12.831729),\n",
" (10000000, 14.2787782),\n",
" (100000000, 13.38019727),\n",
" (200000000, 12.899298975)],\n",
" 't4r-2': [(100, 1707.71),\n",
" (1000, 223.354),\n",
" (10000, 55.723),\n",
" (100000, 55.75504),\n",
" (1000000, 62.341834),\n",
" (10000000, 68.527251),\n",
" (100000000, 93.1236586),\n",
" (200000000, 64.54959567)],\n",
" 't4r-2 (constructor)': [(100, 5.6),\n",
" (1000, 6.81),\n",
" (10000, 6.765),\n",
" (100000, 12.54881),\n",
" (1000000, 12.719099),\n",
" (10000000, 13.4177526),\n",
" (100000000, 12.89113003),\n",
" (200000000, 13.71893136)],\n",
" 't4r12': [(100, 1958.05),\n",
" (1000, 5456.484),\n",
" (10000, 566.8204),\n",
" (100000, 57.73834),\n",
" (1000000, 6382.944706),\n",
" (10000000, 710.4106881),\n",
" (100000000, 101.73295676),\n",
" (200000000, 73.384390135)],\n",
" 't4r12 (constructor)': [(100, 6.28),\n",
" (1000, 13.36),\n",
" (10000, 10.853),\n",
" (100000, 12.82331),\n",
" (1000000, 12.763209),\n",
" (10000000, 13.6717478),\n",
" (100000000, 13.25864459),\n",
" (200000000, 13.4915803)],\n",
" 't4r4': [(100, 1175.41),\n",
" (1000, 287.0),\n",
" (10000, 51.666),\n",
" (100000, 42.26743),\n",
" (1000000, 67.331208),\n",
" (200000000, 67.466145205)],\n",
" 't4r4 (constructor)': [(100, 5.62),\n",
" (1000, 11.945),\n",
" (10000, 7.4465),\n",
" (100000, 12.25991),\n",
" (1000000, 12.485199),\n",
" (200000000, 13.443475215)],\n",
" 't4r6': [(100, 1443.35),\n",
" (1000, 341.363),\n",
" (10000, 253.9931),\n",
" (100000, 39.24943),\n",
" (1000000, 170.713432),\n",
" (10000000, 40.9464663),\n",
" (100000000, 94.40132412),\n",
" (200000000, 59.052363485)],\n",
" 't4r6 (constructor)': [(100, 11.24),\n",
" (1000, 13.736),\n",
" (10000, 12.0051),\n",
" (100000, 11.69761),\n",
" (1000000, 12.507789),\n",
" (10000000, 13.4037346),\n",
" (100000000, 13.21437365),\n",
" (200000000, 13.53199143)],\n",
" 't4r8': [(100, 1249.01),\n",
" (1000, 280.787),\n",
" (10000, 43.8063),\n",
" (100000, 303.22832),\n",
" (1000000, 57.815301),\n",
" (100000000, 95.15250096),\n",
" (200000000, 57.177627895)],\n",
" 't4r8 (constructor)': [(100, 4.34),\n",
" (1000, 8.387),\n",
" (10000, 5.8076),\n",
" (100000, 12.25321),\n",
" (1000000, 12.580329),\n",
" (100000000, 13.06223234),\n",
" (200000000, 12.838326285)],\n",
" 't8r-1': [(100, 2364.92),\n",
" (1000, 429.743),\n",
" (10000, 220.3152),\n",
" (100000, 261.33758),\n",
" (1000000, 101.188102),\n",
" (10000000, 155.7143434),\n",
" (100000000, 237.1196266),\n",
" (200000000, 195.63367743)],\n",
" 't8r-1 (constructor)': [(100, 4.96),\n",
" (1000, 10.563),\n",
" (10000, 10.406),\n",
" (100000, 13.29751),\n",
" (1000000, 12.749039),\n",
" (10000000, 13.5745387),\n",
" (100000000, 13.23615847),\n",
" (200000000, 13.080319155)],\n",
" 't8r-2': [(100, 3803.23),\n",
" (1000, 438.99),\n",
" (10000, 169.8201),\n",
" (100000, 39.73703),\n",
" (1000000, 50.172346),\n",
" (10000000, 52.5073755),\n",
" (100000000, 66.49576016),\n",
" (200000000, 43.29440917)],\n",
" 't8r-2 (constructor)': [(100, 20.06),\n",
" (1000, 12.773),\n",
" (10000, 7.3835),\n",
" (100000, 12.95521),\n",
" (1000000, 11.618878),\n",
" (10000000, 13.7369569),\n",
" (100000000, 12.91368484),\n",
" (200000000, 13.60558398)],\n",
" 't8r12': [(100, 2322.02),\n",
" (1000, 7602.586),\n",
" (10000, 849.5366),\n",
" (100000, 63.89355),\n",
" (1000000, 5235.584675),\n",
" (10000000, 491.4047635),\n",
" (100000000, 86.10693319),\n",
" (200000000, 58.292039145)],\n",
" 't8r12 (constructor)': [(100, 4.8),\n",
" (1000, 10.67),\n",
" (10000, 11.403),\n",
" (100000, 12.14321),\n",
" (1000000, 12.469448),\n",
" (10000000, 13.4874747),\n",
" (100000000, 12.95961137),\n",
" (200000000, 13.4233504)],\n",
" 't8r4': [(100, 2369.16),\n",
" (1000, 933.405),\n",
" (10000, 68.309),\n",
" (100000, 39.32333),\n",
" (1000000, 46.023763),\n",
" (200000000, 43.197102495)],\n",
" 't8r4 (constructor)': [(100, 9.88),\n",
" (1000, 13.865),\n",
" (10000, 7.8375),\n",
" (100000, 12.76281),\n",
" (1000000, 12.801009),\n",
" (200000000, 13.50378791)],\n",
" 't8r6': [(100, 2242.1),\n",
" (1000, 662.365),\n",
" (10000, 216.7171),\n",
" (100000, 45.98653),\n",
" (1000000, 105.219695),\n",
" (10000000, 28.0663361),\n",
" (100000000, 75.95030742),\n",
" (200000000, 45.52154591)],\n",
" 't8r6 (constructor)': [(100, 4.6),\n",
" (1000, 20.03),\n",
" (10000, 14.794),\n",
" (100000, 12.55801),\n",
" (1000000, 12.635379),\n",
" (10000000, 13.4282866),\n",
" (100000000, 13.13080609),\n",
" (200000000, 13.581683265)],\n",
" 't8r8': [(100, 2607.87),\n",
" (1000, 1261.661),\n",
" (10000, 117.6671),\n",
" (100000, 411.38359),\n",
" (1000000, 39.005178),\n",
" (100000000, 67.73879865),\n",
" (200000000, 44.1133018)],\n",
" 't8r8 (constructor)': [(100, 4.7),\n",
" (1000, 11.78),\n",
" (10000, 11.782),\n",
" (100000, 16.00661),\n",
" (1000000, 12.801279),\n",
" (100000000, 13.09120827),\n",
" (200000000, 12.910120735)]}\n"
]
}
],
"source": [
"from pprint import pprint\n",
"\n",
"pprint(load())"
]
},
{
"cell_type": "code",
"execution_count": 54,
"id": "6eef5f14",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAm8AAAHJCAYAAADTm97mAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAzjFJREFUeJzs3Xd4U+XbwPFvuvdu6aQtUPYo0LKhbAQUF4qyBHEjIojrVcABooCoP7eigCCoIFMUAYGyyt4bSlva0pbuPZPz/hEaCG2h0JS09P5cVy7tOSfPeUKSc+48435UiqIoCCGEEEKIWsHE2BUQQgghhBCVJ8GbEEIIIUQtIsGbEEIIIUQtIsGbEEIIIUQtIsGbEEIIIUQtIsGbEEIIIUQtIsGbEEIIIUQtIsGbEEIIIUQtIsGbEEIIIUQtclvB28KFC1GpVKhUKrZt21Zmv6IoNGrUCJVKRc+ePfX2paam8vbbb9O8eXNsbW1xdHSkadOmjBo1imPHjpV7DpVKhZWVFZ6envTq1YtZs2Zx5cqVO6qvSqXCzMwMLy8vnnjiCc6fP387L71SVCoV7733XpnzR0dH33GZa9euxczMjOTkZKKjo/Vej4mJCc7OzvTp04eNGzfeUfnbtm1DpVKxYsWKWx773nvvoVKp7ug8FSl9TXPnzi13/9y5c6v8b3inquP1Xu/Gz8upU6d47733yn2tPXv2pGXLlnd8ro8++ojVq1eX2V76GT1w4MAdl21I1VGfMWPGEBAQUKljb3xPbiYmJoann34ab29vLC0t8fHx4eGHH77pc959911UKlWV3svaxBDXwLuh9Dq0cOFCY1fFIG7nM1+Zsuzs7AxS1u0w9LWgomvgnSq9d5YXC90Nd9TyZm9vz08//VRme3h4OJGRkdjb2+ttz8nJoVOnTixcuJBnnnmGtWvX8uuvv/Lcc88RFRXFkSNHypS1YMECIiIi2LRpE19//TXBwcF88sknNGvWjM2bN99WfUvL2rx5My+//DJr166lW7dupKen31Y5t2vw4MFERETg5eV1x2X8+eef9OjRA3d3d922CRMmEBERwY4dO5g7dy7nz59n0KBBbN++3RDVrtAzzzxDREREtZ6jLomIiOCZZ57R/X3q1Cnef//9arnRGfrCVdedOHGC9u3bc+LECebOncumTZuYN28ezs7OFT7nyJEjzJ07l3r16t3FmhqXIa6B4vZNnTqVVatWGbsaNYqhr4Ht2rUjIiKCdu3aGazM22F2J08aNmwYv/76K19//TUODg667T/99BOdO3cmKytL7/jly5dz4cIFtmzZQq9evfT2TZ48GY1GU+YcLVu2JCQkRPf3o48+yqRJk+jWrRuPPPII58+fr/RF8PqyevbsiVqtZvr06axevZqxY8dW+nXfLnd3d72g63YVFxezdu1aZsyYobe9fv36dOrUCYCuXbsSFBREWFgYP/30Ez169KhSnW/G19cXX1/faiu/ril9D2uz/Px8rK2tjV2Nu0pRFEaNGoWfnx87duzA0tJSt2/YsGHlPqekpISxY8fy/PPPc/ToUVJSUu5WdQ2quLhY14tRGVW9Boo707BhQ2NX4Z7n4OBg1Gv4HbW8PfnkkwAsW7ZMty0zM5M///yTp59+uszxqampABX++jIxqVw16tevz6effkp2djbff//97VZbpzSQS0pK0m0rKCjgtddeIzg4GEdHR1xcXOjcuTNr1qwp8/ysrCyeffZZXF1dsbOz47777uPcuXNljruxy+D8+fM4ODjw2GOP6R23ZcsWTE1NmTp1qt72//77j8zMzFt2xZT3ekDbOvDggw/i7OyMlZUVwcHBLFq0qNwyCgoKmDx5Mp6enlhbWxMWFsbhw4f1jimvGzEgIID777+fDRs20K5dO6ytrWnatCk///zzTetcVT///DNt2rTBysoKFxcXHn74YU6fPl3muLVr19K5c2dsbGywt7enX79+5bYerl+/nuDgYCwtLQkMDKywG/dGX3/9NSYmJnrd+Z9++ikqlYrx48frtmk0GpydnXnttdd0267volu4cKHuc9GrVy9d1/iN3Tj79++ne/fu2NjY0KBBAz7++ONyf/xcT6VSkZuby6JFi3Tl3jisITs7mxdffBE3NzdcXV155JFHuHz5st4xpe/1ypUradu2LVZWVrz//vsAJCYm8vzzz+Pr64uFhQWBgYG8//77lJSU6JXx7bff0qZNG+zs7LC3t6dp06b83//9X5k6V6Y+Go2G2bNn07RpUywtLfHw8GD06NHExcXd9N8DKv8dLs/27ds5cuQIr776ql7gdjMff/wxaWlpzJw5s1LH366jR4+iUqnK7RH5559/UKlUrF27FoALFy4wduxYgoKCsLGxwcfHhwceeIDjx4/rPa+0W2jx4sW89tpr+Pj4YGlpyYULFzAzM2PWrFllzrV9+3ZUKhXLly8Hyu82LR0CUJnP8smTJ+nfvz82Nja4u7szfvx41q9fX6XuqsuXL/P4449jb2+Po6Mjw4YNIzExUe+YxYsXo1Kpyr1WfPDBB5ibm+s+j5V9Pbdzj1GpVLz88sssWLCAJk2aYG1tTUhICHv27EFRFObMmUNgYCB2dnb07t2bCxcu6D2/vG5TjUbDl19+SXBwMNbW1jg5OdGpUyfd5+JWTp48SZ8+fbC1tcXd3Z2XX36ZvLw83f6bdT2XNxzhzJkzPPnkk9SrVw9LS0vq16/P6NGjKSwsrLAOCQkJtG/fnqCgIN3Qp6ysLKZMmUJgYCAWFhb4+Pjw6quvkpubq3f+W10Db3Sra9WN3aY3Dmu68XG9zZs306dPHxwcHLCxsaFr1678999/N63Pje4oeHNwcGDo0KF6N+hly5ZhYmJS7i/Pzp07AzB69GhWr16tC+buxKBBgzA1Na1SF2FUVBQAjRs31m0rLCwkLS2NKVOmsHr1apYtW6Zr5fvll190xymKwkMPPaS7oK1atYpOnToxcODAW543KCiIH3/8kRUrVvC///0P0N70hg8fTvfu3ct8uP/88086d+6Mt7f3bb+es2fP0qVLF06ePMn//vc/Vq5cSfPmzRkzZgyzZ88uU8b//d//cfHiRebPn8/8+fO5fPkyPXv25OLFi7d8XUePHuW1115j0qRJrFmzhtatWzNu3Ljbeo80Gg0lJSVlHuUFJrNmzWLcuHG0aNGClStX8sUXX3Ds2DE6d+6sN5Zx6dKlPPjggzg4OLBs2TJ++ukn0tPT6dmzJzt37tQd999///Hggw9ib2/Pb7/9xpw5c/jjjz9YsGDBLevdt29fFEXR++Jt3rwZa2trNm3apNt24MABMjIy6Nu3b7nlDB48mI8++gjQBoQRERFEREQwePBg3TGJiYmMGDGCkSNHsnbtWgYOHMjbb7/NkiVLblrHiIgIrK2tGTRokK7cb775Ru+YZ555BnNzc5YuXcrs2bPZtm0bI0eOLFPWoUOHeP3113nllVfYsGEDjz76KImJiXTo0IF///2XadOm8c8//zBu3DhmzZrFs88+q3vub7/9xksvvURYWBirVq1i9erVTJo0Se8iezv1efHFF3nzzTfp168fa9eu5cMPP2TDhg106dLlpi1bVfkOA7rPtb29PYMGDcLKygo7Ozvuv/9+zpw5U+b4U6dOMWPGDL799ttqGzvUpk0b2rZtW+5nduHChXh4eDBo0CBAG7y4urry8ccfs2HDBr7++mvMzMzo2LEjZ8+eLfP8t99+m0uXLvHdd9+xbt06PDw8GDJkCN999x1qtVrv2K+++gpvb+9b/uCszGc5ISGBsLAwzp49y7fffssvv/xCdnY2L7/88p38EwHaluK+ffuyceNGZs2axfLly/H09Cxz3xo2bBienp58/fXXettLSkr4/vvvefjhh/Wuy5V5PZW9x5T666+/mD9/Ph9//DHLli0jOzubwYMH89prr7Fr1y6++uorfvjhB06dOsWjjz6Koig3fe1jxoxh4sSJhIaG8vvvv/Pbb78xZMiQSg3TKC4uZtCgQfTp04fVq1fz8ssv8/3331fY0nwrR48eJTQ0lD179vDBBx/wzz//MGvWLAoLCyk
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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V2dP6mO323n77be57LLL0Ol0hIWF8cADD3DixIkLPh/g+We4Mp5es84P9AAiIyNp0aIFx48fdzueUqkkICDAray/vz9KpRK9Xu9x3S7mmWeewcfHp9yPcnD8kG/evDkWiwWAr776iuuuu46IiAgMBgOdOnVi4sSJFBYWuu2XmJiIr68ve/bs4brrrsPPz4/Bgwfz+uuvo1ar3R6r0+jRowkJCaGoqAgo341bNsXj3XffpXXr1vj6+tK7d282b95c7niffvopHTp0QKfTERsby6JFi6rUhV+Rv//+mxEjRtC8eXN0Oh0tW7bkgQceoLi42FXGk+usM11m8eLFvPTSS0RGRuLv788111zDgQMH3Mru3LmTm266ibCwMHQ6HZGRkdx4442u9/WFPs8ZGRk88cQTxMbG4uvrS1hYGFdffTW///672zk8fW4TExP58MMPXed13jzpffj999+58sorMRgMREVF8corr2Cz2co9J+e3njnrdv61b8uWLdx8882EhISg1+tp27YtzzzzzAXr8Pfff9OmTRuuuOIK1zX6Yteq1NRUV1A2efJk12NOTEys9Dx2u52pU6fSsWNHDAYDgYGBdO3alVmzZrnKnB8POB9/Rbfz37NfffUVvXv3xsfHB19fX66//vpy388XJapg3rx5AhDbtm0T999/v7j88std93300UfCx8dH5OXlic6dO4sBAwa47tuwYYMARK9evcR3330nMjMzPTpHRQoKCoRKpRKDBw+uUn3L+s9//iMA8e2337q25eTkiMTERPHll1+KtWvXipUrV4oJEyYIpVIp/vvf/7rK2e12MWjQIKHT6cS0adPEr7/+KiZNmiTatGkjADFp0qRy509JSXFt+9///icAMWvWLCGEEKdPnxbNmzcXAwYMEFar1a2eY8aMEX369HH9nZKSIgDxzjvvuJXbu3evAMRTTz3l2vb3338LPz8/0bZtW/HFF1+In376SYwYMUIA4q233nKVW7dunQBEdHS0uPXWW8UPP/wgFixYINq1ayf8/f3F4cOHXWUnTZokzn/LtGrVSrRo0ULExsaKL774Qvzyyy9i+PDhAhBJSUmVvjbnP6a33npLWCyWcre33nqr3HP4xhtvCECMGDFC/PTTT+KLL74Qbdq0EQEBAeLgwYOucgsXLhSAuO6668SyZcvEV199JXr06CG0Wq34/fffXeVWr14tVCqVuOqqq8TSpUvFkiVLRK9evUTLli3LPd7z/f333wIQixYtcm274YYbhMFgEO3bt3dt27JliwDEihUrXNvKvl/S09Ndj+vDDz8UmzZtEps2bRLp6elCCCEGDBggQkJCRPv27cWcOXPEqlWrxBNPPCEAt/dnRTZt2iQMBoMYOnSo67j79u0TQpx7j7Zp00Y89dRT4pdffhFz584VQUFBYtCgQW7HadWqlYiIiBBt2rQRn3/+uVi3bp3YunWrOH36tIiOjhatWrUSH3/8sVi9erV4/fXXhU6nE4mJia79Fy9e7Hqf/vrrr2L16tVizpw54umnn3aVqUp9HnnkEQGIJ598UqxcuVLMmTNHhIaGiujoaJGRkeEqN2rUKNGqVSvX31X5DHvi/OvdxRw+fFgolUrx7LPPum0fN26c8PX1Fd99953Izc0VKSkpYsSIESIoKEgcOnSoSnW6kF27dgl
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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nR0+Pj48+uijnDt37rq/Dyj+Z7goxT1nXZvkAfj5+VG7dm3Onj2bb396vR43N7d867q6uqLX67G3ty92bDfyf//3fzg5ORX4Qg7al/iaNWuSk5MDwOzZs+nTpw++vr44ODjQpEkTXn/9ddLS0vJtN2LECJydndm/fz99+vTBxcWFXr168cEHH2BjY5PvteZ5/PHHqVGjBpmZmUDBpturu3V8+eWXBAUF4ezsTMeOHdmyZUuB/f388880atQIOzs7QkJCmDlz5i03mRXnvNCrVy+Cg4NRSuVbnteVqX///iV+PTt27GDIkCEEBgZamvyHDh3KmTNn8q2Xd41ZvXq15f3s6urKo48+SlpaGhcuXGDw4MG4u7vj6+vL2LFjLX/bPIU13UZFRfH0008TEBCAra0tfn5+3H///QWuMUWZPHlyvr/Fn3/+me/5opq/i+ruNHPmTDp27IizszPOzs60atWq0FbFq82fPx9HR0eefPJJy3lox44d3HPPPXh6emJvb0/r1q3566+/8h2/OOfhq8XGxlp+V3Z2dnh7exMWFpav5fHa92He6y/sZ8SIEZb1srOz+fDDDy3nOG9vbx577DFiY2Ov+9oLUCUwdepUBajt27erRx55RLVv397y3I8//qicnJxUcnKyatq0qerWrZvluY0bNypAhYaGqvnz56u4uLhiHaMwqampymAwqF69epUo3qt99913ClB///23ZVliYqIaMWKE+uOPP9Tq1avV8uXL1dixY5Ver1e//fabZT2z2ax69Oih7Ozs1IQJE9S///6rxo0bp+rVq6cANW7cuALHP336tGXZn3/+qQD1zTffKKWUio6OVjVr1lTdunVTubm5+eJ88sknVadOnSyPT58+rQD12Wef5VvvwIEDClDPP/+8ZdmRI0eUi4uLql+/vvr999/V0qVL1dChQxWgJk6caFlvzZo1ClABAQFqwIABavHixWr69OmqQYMGytXVVZ08edKy7rhx49S1b5m6deuq2rVrq5CQEPX777+rFStWqAceeEABat26dUX+ba59TRMnTlQ5OTkFfiZOnFjgd/jRRx8pQA0dOlQtXbpU/f7776pevXrKzc1NHTt2zLLejBkzFKD69OmjFixYoGbPnq3atm2rbG1t1YYNGyzrrVq1ShkMBtW5c2c1b948NWfOHBUaGqrq1KlT4PVe68iRIwpQM2fOtCzr27evcnBwUA0bNrQs27p1qwLUP//8Y1l29fslJibG8rq+//57tXnzZrV582YVExOjlFKqW7duqkaNGqphw4Zq0qRJauXKlWrUqFEKyPf+LMzmzZuVg4ODuvPOOy37PXjwoFLqynu0Xr166vnnn1crVqxQU6ZMUR4eHqpHjx759lO3bl3l6+ur6tWrp3799Ve1Zs0atW3bNhUdHa0CAgJU3bp11eTJk9WqVavUBx98oOzs7NSIESMs28+aNcvyPv3333/VqlWr1KRJk9QLL7xgWack8Tz99NMKUKNHj1bLly9XkyZNUt7e3iogIEDFxsZa1hs+fLiqW7eu5XFJPsPFce357kZOnjyp9Hq9eumll/Itf/HFF5Wzs7OaP3++SkpKUqdPn1ZDhw5VHh4e6vjx4yWK6Xr27t2rAPXzzz/nW56QkKDs7OzUmDFjLMs++OAD9dVXX6mlS5eqtWvXqkm
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"for rh in [64, 128, 256]:\n",
" plots=load(f\"./result.rh{rh}.txt\")\n",
" fig, ax = plt.subplots()\n",
"\n",
" # Running-time threads\n",
" for t in [1, 2, 4, 8, 12, 16]:\n",
" name = f\"t{t}r8\"\n",
" ax.plot(*zip(*plots[name]), label=name, marker='x')\n",
" ax.set_xscale('log')\n",
" ax.set_yscale('log', base=2)\n",
" ax.legend()\n",
" ax.set(xlabel='n', ylabel='Running time per element (ns)', title=f\"8-MSD-Radix/Robin-Hood with threshold {rh} - variying thread count\")\n",
" fig.savefig(f\"plots/thread-r8-rh{rh}.svg\")\n",
"\n",
" fig, ax = plt.subplots()\n",
"\n",
" # Running time different static radixes\n",
" for r in [1, 2, 4, 6, 8, 10, 12]:\n",
" name = f\"t1r{r}\"\n",
" ax.plot(*zip(*plots[name]), label=name, marker='s' if r == 1 or r == 4 else 'x')\n",
" ax.set_xscale('log')\n",
" ax.set_yscale('log', base=2)\n",
" ax.legend()\n",
" ax.set(xlabel='n', ylabel='Running time per element (ns)', title=f\"MSD-Radix/Robin-Hood with threshold {rh} - varying, constant bucket size\")\n",
" fig.savefig(f\"plots/constant-r-rh{rh}.svg\")\n",
"\n",
"\n",
" fig, ax = plt.subplots()\n",
" for r in [1,-3, 4, -2, -1]:\n",
" name = f\"t1r{r}\"\n",
" ax.plot(*zip(*plots[name]), label=name, marker='s' if r == 1 or r == 4 else 'x')\n",
" ax.set_xscale('log')\n",
" ax.set_yscale('log', base=2)\n",
" ax.legend()\n",
" ax.set(xlabel='n', ylabel='Running time per element (ns)', title=f\"MSD-Radix/Robin-Hood with threshold {rh} - varying, dynamic bucket size\")\n",
" fig.savefig(f\"plots/dynamic-r-rh{rh}.svg\")\n",
"\n",
" plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": 47,
"id": "bde93adb",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plots=[load(f\"./result.rh{rh}.txt\") for rh in [64, 128, 256]]\n",
"fig, ax = plt.subplots()\n",
"\n",
"# Threshold comparison\n",
"for i, rh in enumerate([64, 128, 256]):\n",
" for t in [1, 12]:\n",
" name = f\"t{t}r8\"\n",
" ax.plot(*zip(*plots[i][name]), label=f\"rh{rh}{name}\", marker=('x' if t == 1 else 's'))\n",
"ax.set_xscale('log')\n",
"ax.set_yscale('log', base=2)\n",
"ax.legend()\n",
"ax.set(xlabel='n', ylabel='Running time per element (ns)', title=f\"8-MSD-Radix/Robin-Hood with varying threshold\")\n",
"fig.savefig(f\"plots/varying-rh.svg\")"
]
},
{
"cell_type": "code",
"execution_count": 63,
"id": "9b5baa0a",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plots=load(f\"./result.rsh2.rh28.txt\", omit=True)\n",
"fig, ax = plt.subplots()\n",
"\n",
"# Running-time threads\n",
"for t in [1, 2, 4, 8, 12, 16]:\n",
" name = f\"t{t}r8\"\n",
" ax.plot(*zip(*plots[f\"t{t}\"]), label=name, marker='x')\n",
"ax.set_xscale('log')\n",
"ax.set_yscale('log', base=2)\n",
"ax.legend()\n",
"ax.set(xlabel='n', ylabel='Running time per element (ns)', title=f\"8-MSD-Radix/Robin-Hood with threshold 128 - Single queue\")\n",
"fig.savefig(f\"plots/old-thread-r8-rh128.svg\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "68ef9990",
"metadata": {},
"outputs": [],
"source": [
"fig, ax = plt.subplots()\n",
"\n",
"for t in [1, 2, 4, 8, 12, 16]:\n",
" name = f\"t{t}r8\"\n",
" ax.plot(*zip(*plots[name]), label=name, marker='x')\n",
" ax.set_xscale('log')\n",
" ax.legend()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e8676928",
"metadata": {},
"outputs": [],
"source": [
"fig, axs = plt.subplots(len(plots))\n",
"\n",
"for i, t in enumerate(plots):\n",
" if len(plots) > 1:\n",
" axs[i].set_title(f\"#p={t}\")\n",
" for name in plots[t]:\n",
" axs[i].plot(*zip(*plots[t][name]), label=name, marker='x')\n",
" axs[i].plot(*zip(*plots[t][name]), label=name + \" (constructor)\", marker='+')\n",
" axs[i].set_xscale('log')\n",
" else:\n",
" axs.plot(*zip(*plots[t][name]), label=name, marker='x')\n",
" axs.plot(*zip(*plots[t][name]), label=name + \" (constructor)\", marker='+')\n",
" axs.set_xscale('log')\n",
"\n",
"if len(plots) > 1:\n",
" for ax in axs.flat:\n",
" ax.set(xlabel='n', ylabel='Running time per element (ns)')\n",
" ax.legend()\n",
"else:\n",
" axs.set(xlabel='n', ylabel='Running time per element (ns)')\n",
" axs.legend()\n",
"\n",
"plt.tight_layout()\n",
"\n",
"plt.savefig(\"plot.pdf\")"
]
}
],
"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.13.7"
}
},
"nbformat": 4,
"nbformat_minor": 5
}