diff --git a/parallel-java.ipynb b/parallel-java.ipynb new file mode 100644 index 0000000..49d6fc5 --- /dev/null +++ b/parallel-java.ipynb @@ -0,0 +1,288 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "def plot_result(single, threads, manager, streams, sizes, xLab=\"Tasks\", yLab=\"Execution Time (MS)\", title=\"Execution Times\"):\n", + " plt.title(title)\n", + " if len(sizes) == len(single):\n", + " plt.plot(sizes, single, label=\"Single Threaded\")\n", + " if len(sizes) == len(threads):\n", + " plt.plot(sizes, threads, label=\"Vanilla Threads\")\n", + " plt.plot(sizes, manager, label=\"Parallel Task Queue\")\n", + " plt.plot(sizes, streams, label=\"Parallel Stream\")\n", + " plt.legend(bbox_to_anchor=(0.6, 0.95), loc='upper left', borderaxespad=0.)\n", + " plt.xlabel(xLab)\n", + " plt.ylabel(yLab)\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "single = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n", + "threads = [2, 10, 45, 31, 42, 36, 55, 66, 59, 85, 171, 98, 126, 138, 105, 111, 107, 121, 122, 134]\n", + "manager = [1, 1, 2, 10, 1, 3, 2, 1, 2, 1, 4, 3, 3, 1, 2, 2, 2, 2, 2, 2]\n", + "streams = [4, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n", + "sizes = [1, 101, 201, 301, 401, 501, 601, 701, 801, 901, 1001, 1101, 1201, 1301, 1401, 1501, 1601, 1701, 1801, 1901]\n", + "plot_result(single, threads, manager, streams, sizes, title='Operational Overhead')" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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