diff --git a/bench/.gitignore b/bench/.gitignore new file mode 100644 index 0000000..8fb1206 --- /dev/null +++ b/bench/.gitignore @@ -0,0 +1,3 @@ +/venv +/*.pb.gz +/.ipynb_checkpoints diff --git a/bench/README.md b/bench/README.md new file mode 100644 index 0000000..983a935 --- /dev/null +++ b/bench/README.md @@ -0,0 +1,23 @@ +# Go Profiler Overheads + +This page is documenting the benchmark methodology used to analyze the performance overhead of the various go profilers. The results are discussed in the documents for each individual profiler. + +Benchmarking is done by invoking the Go program included in this directory. You can look at [run.sh](./run.sh) to see the current arguments that are being used, but here is an example for block profiling with various profiling rates: + +``` +go run . \ + -workloads mutex,chan \ + -ops 100000 \ + -blockprofilerates 0,1,10,100,1000,10000,100000,1000000 \ + -runs 20 \ + -depths 16 \ + > "result.csv" +``` + +The benchmark works by spawning a new child process for the given number of `-runs` and every unique combination of parameters. The child reports the results to the parent process which then combines all the results in a CSV file. The hope is that using a new child process for every config/run eliminates scheduler, GC and other runtime state building up as a source of errors. + +Workloads are defined in the [workloads.go](./workloads.go) file. For now the workloads are designed to be **pathological**, i.e. they try to show the worst performance impact the profiler might have on applications that are not doing anything useful other than stressing the profiler. The numbers are not intended to scare you away from profiling in production, but to guide you towards universally **safe profiling rates** as a starting point. + +The CSV files are visualized using the [analysis.ipynb](./analysis.ipynb) notebook that's included in this directory. + +For now the data is only collected from my local MacBook Pro machine (using docker for mac), but more realistic environments will be included in the future. But it's probably a good setup for finding pathological scenarios : ). \ No newline at end of file diff --git a/bench/analysis.ipynb b/bench/analysis.ipynb new file mode 100644 index 0000000..b633a55 --- /dev/null +++ b/bench/analysis.ipynb @@ -0,0 +1,116 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "id": "wound-burns", + "metadata": {}, + "outputs": [], + "source": [ + "from plotnine import *\n", + "import plotnine as plotnine\n", + "import pandas as pd\n", + "import math" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "id": "viral-baking", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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/P39ee2110hPT2fatGn06dOH48ePU7VqVYKDg5k7dy7PPfccQUFBvPHGG7bvBgcH33D53bt3JzQ0lHHjxnHhwgU++eQT7r77biZOnMgLL7zA448/zvDhw1mwYAGvv/46YWFhDBo0yPb9/fv306FDBzw9PRkxYgTVqlXj+PHjzJgxgzVr1rBz5078/PyuG0NERASHDh3i119/tWuqUphvvvmGkSNH0qRJE1599VX8/f3ZsmULr732Gvv27bPdyEybNo1PPvmETZs22d2gWZsSWaWmptoSRBkZGURFRfHGG2/g7e1dpA7x5syZw2OPPUbVqlV56aWX8Pb2ZtGiRTz11FMcOHCAr7/+2jbvmTNnaNOmDefPn+ehhx7imWeeITs7m3379vHHH38wcODAAteRnZ3NiBEjmDdvHh9++CEvvvjiDeM6duwYkH8/+PTTT7l8+TKPPfYYlStXttVyefvtt5k4cSINGzZk3LhxKKX48ccfGTRoEKdOneL1118HLB3Cbtq0ia+//prXX3+dunXr3jCWgowbN4533nmHjh07Mm7cODw8PFi1ahWPPfYYJ06c4L333rvhMqw3/uXKlbObXtTjPzIykqlTp/Lcc8/Rv39/2/6X95gt6v4G2PofatmyZaExt27dmtWrVxMVFUWjRo2uW76UlBTatGnDoUOHGDRoEG3btuXkyZN8+eWXrFy5ki1btlCvXj18fX3p378/8+fP5+zZs1SpUsVuOd999x2enp488MADtmnDhw/nhx9+oG/fvgwePBiAX3/9lf79+zNjxgwef/xxu2Xs3r2bRYsWMWLECB566CFSUlJsn6WlpdGuXTvuuusuJk6cyOXLl5k6dSo9evTg1KlTdjWpirPdv/vuOy5fvszDDz9M5cqVuXr1Kt9//z19+vRhwYIFPPjgg7Z59+7dS2RkJDqdjrFjx1KlShX++usvOnToQFpa2nV/57yGDRvG3LlzadOmDZMnTyY1NZXZs2fTrVs3fvjhh3y1rc6fP09kZCR9+vTh/fff5/jx43z++ef07duXqKgotNrrv8M6f/48X3/9NQMGDODBBx/E3d2dnTt3MnPmTDZv3syuXbvy1ThZtmwZ06ZN4/HHH+exxx5DKUXDhg0xGo35jsuIiIgC1xsZGcncuXOZNGkSsbGxTJ069brzw82fv262nMXxxx9/8MknnzBmzBgeffRR1qxZw6effsr+/ftZs2aNreaNI88NAAcOHKBHjx488sgjPPjgg+zZs4fZs2eTmJjIypUrbfMV9Vi+nqKeo8Hy0qR///6UL1+eV199lYCAAJYtW0b37t2L/JvOnj2b0aNHExwczMiRIwkPD+fSpUusXLmSgwcP2vaV4hynRdW5c2cAVq9eTe/evQFLwuzw4cNotVpWr17NkCFDAMv95a5du2xJR7Dcm0RGRpKbm8uYMWOoXr06mzdv5uOPP2bNmjVs2bIFT09Pu3W+9NJLpKenM3ToUIKDg/OdR60uXLhAz549iYmJsb1wuZ7ibLclS5Zw8OBB7rvvPqpVq0ZSUhILFy5kxIgRXL16lZdfftk279mzZ2ndujWJiYk8/vjj1K1bl+3bt9OhQ4d818Rjx47RuXNnQkJCGDNmDBUrViQ2NpY9e/awbds2+vXrd4MtIoQoNUoIpdS3336rANW4cWOVmZlpm75v3z4FKI1Go37++We77/Tt21fp9XqVkpJim/bss88qvV6vtm/fbjdvQkKCqly5surQoYNt2pw5cxSgnnnmGbt5t27dqjQajQJUdHS0bfq4cePyTUtPT1cmkylfed544w0FqJ07d9qmrVu3TgGqfPnyKj4+3jbdZDKpunXrqgoVKlz/R/qf9u3bK0C98sor+T6zruPbb7/N91lB8Q8dOlQBatSoUXbzbtu2TQHqtddes5terVo11b59+wLjsi6roGmjR4+2mz516lQFKG9vb7t4MjMzVWhoqGrVqpXd/HfccYcKDw9XcXFxdtN37NihdDqdGj9+fIEx5fXLL7/YtmvNmjXV8OHD1ZdffqkOHTqUb96LFy8qd3d31a9fP2U2m+0+++ijjxSg1q9ff92yW1n37YL+1alTRx04cCDfd679nRMTE5W3t7eqUKGCunr1qm16Tk6O6tq1qwLUpk2bbNPvueceBajFixfnW3be/TXvPpGQkKA6duyojEZjvmNNKct+p9Pp1NWrV9XVq1fVuXPn1J9//qnq1KmjAPX1118rpf5/H/T391cXL160W8axY8eUVqtVjRs3VmlpabbpqampqkGDBkqn09ntD9bfbt26dXbLKWg/j46OVoAaN26cbdrevXuVRqNRTz/9dL7yPPXUU0qr1aqTJ09et4wrV65UDRo0UID66quv7JZRnOO/oPisbnZ/u3TpUr5lWc2dO1cB6scffyx0Hqu33npLAWrSpEl209evX68A1blzZ9u01atXK0C9++67dvOeOXNGabVaNWTIENu0pUuXKkB98skn+dbZu3dv5evrq5KTk23TrMfFihUr8s1vPe9NnjzZbvr8+fMVoGbOnGmbVtztnpqamm++tLQ0VbNmTVWvXj276e3atVNarVbt3r3bbvro0aMVUOj5Ma81a9YoQPXo0UPl5ubapl+5ckWFhIQof39/u+tatWrVFKDmzZtnt5wpU6YoQK1ateqG68zKylLZ2dn5ps+aNUsBauHChbZp1n3Vzc1NRUVF5ftOYcdl3u9eu5+3b99eVatWLd/8BZ07i3r+KiiO4pRTKcs+N3To0HzzF1YujUajduzYYffZ008/ne985KhzgzVGjUajtmzZYjfdus8dPXrUNq04x7J12XnLX5xzdG5urqpatary8/NTFy5csM1rNptV3759C/xtr5127tw5ZTQaVXh4uN21zSrvb1ic47Sg+53CNGjQwO7733//vdJoNGrIkCGqUqVKtunLli1TgFqwYIFtWrt27ZRGo1GbN2+2W+aECRMUoCZOnGibZt1fIyIi7I5vq7zHSFRUlKpSpYqqUqVKgcdgSbabdfq1TCaTateunfLz87M7hoYMGaIAtWTJErv5reefvMf1p59+qoB89+BCCOeT5kXCzpNPPmnXUe0dd9yBr68vFSpUsHt7CpZ+FnJycmzVutX/svqtWrUiIiKC2NhY27/c3FzuvvtuNm3aZKvau3jxYgC77D9Aq1atbG8/bsTDw8P2hjEnJ4f4+HhiY2Nt1e937NiR7zsjRowgICDA9rdWq6Vz585cvHixwOZShXnllVeKPO+NXFujoWXLlnh7e9tqMZTUCy+8YPd3+/btAejTp49dNWqj0UiLFi3s1nvw4EH279/PwIEDMZvNdtu1evXq1KhRw64pVGHuu+8+Nm/ezIMPPkh8fDzffvstY8aMoV69ekRGRnLq1CnbvIsWLSIzM5ORI0cSFxdnt85evXoBFGmdeb366qv8/fff/P3337a3penp6fTo0YNDhw5d97t//fUXqampjB07lqCgINt0Nzc33nzzTeD/9+f4+HiWL19O+/btC6zRU9Ab8TNnztC2bVsOHDjA6tWr8x1rViaTieDgYIKDg6lcuTL33HMPV65c4cMPP+Sxxx6zm3fo0KH5mmwtXboUs9nMK6+8Yvf2z8vLi5deegmTycSyZcuu+1sUx08//YRSikcffdRuG8bGxtKnTx/MZjOrV6++bhm7d+/OhQsXmDp1KqNHj7ab92aO/4IUd3+7evUqkL+vm7ysbyALan5wrcWLF+Pr65uvU9727dvTsWNH1q5dS0JCAgCdOnWiatWqtiZ1Vt9//z1ms9mu1tbcuXPx8PDgwQcfzPf79+vXj+TkZLZt22a3nMaNGxf6llyr1fLcc8/ZTbP+1nnPGcXd7l5eXrb/T0tLIy4ujvT0dDp16sShQ4dstW2uXr3Kpk2b6N69O3fddZddHG+99VaBMRfEeqy+9dZbdn2SBAcH8+STT5KYmMiaNWvsvlOxYkW72n+Flb0wBoPBVsMjNzeXxMREYmNj6dSpE1DwvnrPPffc8o6Yb+b8ldfNlLM4unbtSvPmze2mWWt+WrcrOO7cYNWqVat8tScL2v7FOZYLUpxz9J49ezhz5gxDhgyhQoUKtnk1Gk2R709++eUXsrKyePvtt+2ubVZ5t3dRj9Pi6ty5M4cOHeLixYsArFmzhkaNGjFo0CDOnz/PkSNHbNM1Go1tX7KeD7p27UqbNm3slvniiy/i5eVlt09YPfXUU9etmbx27Vratm1LuXLl2L59e5GOweJeW/P+lhkZGcTFxREfH0/37t1JSkri6NGjgKUZ5NKlS6lXr16+WirPPvtsvnL4+/vb4rm2ib0QwrmkeZGwc21bWYCAgIACq19aExdxcXEAtpvqjRs3XrfJS2xsLFWqVOHkyZMEBQUREhKSb5769evnexgriMlk4qOPPuK7777j2LFj+fq/KKgNeUFltD4gxcXFFamZUHBwsF3ipqQKi8n62zp6+dbYC9veedd7+PBhAKZMmVJofy8FLacgrVu3tt24njp1io0bNzJr1ixbe/I9e/ZgMBhs67Q+8Bbk8uXLRVqnVf369W19g4DlgaZv377UrVuXxx9/nI0bNxb6XWtCqGHDhvk+s06zNoE5ceIESilbM7qi6N27N5mZmezdu5f69esXOp9Wq7U9/Lu5uREUFESdOnUK7MC5oCZ6xSmHI1i3Y2H9+ED+7Zi3jElJSfzyyy8sWrSI3NzcfN+9meP/enE6cn9T/+vLpaD+Mq516tQp6tevX2Anlw0bNmTdunVER0cTEBBg62tn4sSJbNmyxfaw8f3331OtWjW7KvCHDx8mIyODSpUqFblc12vaWbFixXwx5j135l0vFH27x8TE8NZbb7F8+fICt1lCQgI+Pj62fbOg5hmVKlW6YRNHq5s5Dm503SiKWbNm8eWXX3Lw4MF8+3NB5S5qM1tHupnz17WKW87iKGjbh4SEUK5cObv+dRx1brAq6vYvzrFckOLsm9Z569Spk2/eojYHtSaMirK9i3qcFleXLl349NNPWbNmDQ8//DBr1qxh4MCBREZGYjAYWL16NXXq1GH16tU0bNjQdn95vd/K09OTiIiIAq9n1zuuLl++TPfu3YmIiGDjxo1FLk9xzymxsbG8/fbbLF261JZsysv6+165coWUlJQC93t3d3ciIiJITEy0TRs4cCDz58/nvffeY+rUqTRv3pzIyEgGDhwoI+kJ4WSSdBF2ChuJ4HojFFgfLqw3NZGRkdd961iUPkiK6sUXX2TatGncd999vPLKK4SEhGAwGDh//jzDhg0rsBPSopTlRq5tI2x1vQesgh4abxRTUeO5kZvZrlbW33Ds2LH06dOnwHk8PDyKHVP16tWpXr06jzzyCO3atWPr1q3s3LmTtm3b2tY5e/ZsqlWrVuD3rZ3glkT16tWpU6cOmzdvJiMj46bK4QiDBw9mxowZTJgwgZ9++qnQPg80Go1d4uh6CttHbyXrdvzjjz8KHer92oeZa8t47733MnToUF5++WUaN25s14nszRz/14uzqPub9RwWFxdXYAfQ1s+AApPKJTV06FDeffddvv/+e9q0acOWLVs4ceIEb7/9tt05yGw24+fnx6JFiwpd1rVJvuvtN0U9dxZnu6emphIZGUlSUhLPPPMMjRo1wtfXF61WyzfffMP8+fOLvB1LU0mvG59++inPPvssXbp04csvv7R1cmnt26ygMpaFY7i4bqacpcFR5wYrR9w33M5K8zht3749bm5urF69mrvuuovz58/bOspu2bIlq1ev5t577+XQoUP5atrdjOsdV4GBgTRr1oxly5YxZ84cnn322RKv71pKKbp160ZUVBRjx46lWbNmBAQEoNPpWL58OVOnTr3p39JgMLBixQr27t3LqlWr2Lx5M1OnTmXy5Ml8+OGH+Wo9CyFuHUm6CIcJDg7G39+fhISEIj0YRkREcPToUa5cuZLvweTff/8t0jq///572rVrl2/EI+uIS7eatblBQW+B8jafuVlFeWvuaHnfChX1gb84tFotLVu2ZOvWrZw/f95unQEBAUVaZ0l+l5ycHJRSpKSkFJp0sXYk+O+//+arDXHw4EG7eWrUqIFGo2Hfvn1FjuHll1+mTp06PPvss2RkZPDLL7+UytCeectx7Vuva8vhCLVq1WLlypVUqFChRG/OP/roI3799VeefvppDh48aHsAKs7xf719pLj7m/W3O378eKFJF+tIJQW9+bxWREQEJ06cICsrK1+S4uDBg2g0GtsIK9b527Zty8KFC/n0009to3JYR5vKW64jR47QpEmTfB0ulqbibPe1a9dy9uxZ5syZw4gRI+w+mzVrlt3f1n2zoOaA58+fJykpqUjx5T0OWrRoYfdZaRwHYNlXw8LCWLVqlV2TDWutoOIozevAzZy/8nJkOQtS0La/cuUKcXFxtGrVyi4OR5wbiqu4x3JB34einaOtiUtr85u8ivp7W899+/btu26H38U5TovLx8eH5s2bs2bNGu666y4MBgPt2rUDLE2PPvnkE1vtx7znZ2v5C7pfzMjI4NSpU9SoUaNYsej1ehYtWsSQIUN47rnnSEtLsxu4oDDF2W5RUVHs3buXt956i3feecdu3mtHTwsJCcHHx6fA/T4zM5OTJ08WeG6/8847befehIQEWrduzeuvv87YsWOLPFqjEMKxpE8X4TBarZaHH36YqKiofP0NWOWtUm5tLz558mS7ebZt25avPX1hdDpdvrdMOTk5hTaDKW3h4eHo9fp8TaOOHz/OkiVLSrx8b2/vElfPLq477riDhg0bMmfOnAJv5JRStj4uwPL7HzlyhDNnztjNt2LFigLfCKanp9tuqKxVaB944AHc3d0ZP358gf3sZGRk2LUftzYJK+5v888//3Ds2DGqVKly3RoJXbt2xdvbm+nTp9u1xzeZTEyaNAmw1MgAS+KtZ8+erF+/vsD+UQp7g/X0008za9Ysli9fTq9evUhPTy9WWYqiX79+aLVaPvroIzIzM23T09PT+fDDD9HpdPTt29dh67OOOvHaa6+Rk5OT7/OkpCSysrJuuJzg4GCeeuopjhw5YjdsZ3GO/+vtI8Xd3zp06ADA1q1bC41527ZtBAUFFalK94ABA0hKSuLzzz+3m75p0ybWrl1Lp06d8jVHGD58OElJScybN4+FCxcSGRmZr9bQI488AliSegUde8VtMlVUxdnu1gTatfH9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GAwGQkJCuPfeewttqvDPP/8waNAgKlasiMFgoFKlSvTt25c9e/ZcN9aUlBS6d++O0Wi0a3aXk5PDuHHjCAsLw93dnbp16zJjxozrLqco293aJPG7775jxowZ1K1bF3d3d8LCwhg/frxdM48OHTowYcIEwLIdrb/Ttfu7Uopp06ZRq1YtjEYj4eHhfPLJJ9ct980ozr70yy+/cOTIESZOnEhAQADZ2dmkp6ff1Hp/+uknWrRogZeXl62Jy4IFC/LNZ63Bdvr0ae69915bk5iuXbuyd+/eApdb2vcN1apVQ6/XF2neZcuWkZyczMiRI/H19bVNr1q1Kvfddx/r1q2zqyFU3OvDDz/8gKenJ0888YTd9BdeeMFueWA5923atIn27dvTtGlT23S9Xs/TTz9NYmIiv/32203HLoQQzuJa9ZmFKKGUlBTatGnDoUOHGDRoEG3btuXkyZN8+eWXrFy5ki1btlCvXj3AcuP08MMP06ZNG8aNG4e3tzfnz59n7dq1HD161DZfTk4OSUlJRY7Bz8+vyDdL1zp//jyRkZH06dOH999/n+PHj/P555/Tt29foqKiinzjmlfDhg357LPPeOyxx3j11Vf5+OOPAUv558yZw5gxY7j//vtvuJzZs2czevRogoODGTlyJOHh4Vy6dImVK1dy8OBBIiIibPOeO3eOjh070qdPHz744AMOHz7MV199xdatW9mzZw+VKlUqdjkAsrKybphwyCswMLDYv1lcXBxLly6lRo0atge8osQF4Onpme8z67Tt27eXeL2LFi3ixx9/xGQy4efnR69evXj33XfzNXnZsWMHWq2Wli1b5ltGq1atmD9/PvHx8QQGBtp9FhsbW+B6U1NTrxt7XklJSbRr145Tp04xYsQI7rrrLo4cOcI999xjt49YrVy5kj59+uDr68uYMWMoX748y5cv5+2332br1q38+eef+bbh4MGDcXNz48knn8Tb25vatWtjMpno2bMn69ato2fPnjz11FNcunSJGTNm0LZtW1asWFHk7ZnX6NGjMRqNfP3117z++uvUrVsXoMCyXGvFihVMnz6d0aNHM2zYMNasWcPXX3+NRqPhq6++ss2XnJxM27ZtOXHiBEOHDqVx48YkJCQwa9YsWrVqxaZNm7jzzjsBS1ONN998k549ezJy5EgMBgNnzpxh5cqVXLhwgQoVKgC35li5kfPnzwMQGhp6w3mPHTtG586dCQkJYcyYMVSsWJHY2Fj27NnDtm3b6NevHwMGDCAnJ4fJkyczatQo2rVrl2/5H3zwAS1atODJJ58kKCiI48ePM3v2bP7++2/27dtnt91WrFhB//79MRgMPProo9SpU4e4uDg2bNjA1q1bueuuuwqM9cKFC/Ts2ZOYmBhWrlxpt18NGTKEn3/+mU6dOvH8888TFxfHuHHjqFq1ar7lFGe7W02fPp1z587x+OOPExgYyLJly5gwYQInT560NVl84403CAwMZMmSJUydOpWgoCAAGjVqZLes119/neTkZIYPH463tzc//PADL7zwAhUrVrQlzODW7kt//vknAMHBwXTp0oV169ZhNpupXr06L730Eo8//niRlvP2228zceJEGjZsyLhx41BK8eOPPzJo0CBOnTrF66+/bjd/Wloa7du3p0mTJrz77rucPXuWL7/8ksjISLZs2ULjxo2BsnnfsGPHDgBat26d77PWrVvz/fffs2vXLlsz1OJcHy5fvszp06dp3bp1vsRqWFgYFSpUYOfOnUWOBWDnzp08/PDDNxW7EEI4jZNr2ghRplirwU6aNMlu+vr16xWgOnfubJvWv39/5ePjY6vCWxhrdfai/ru2yjYFNAupVq2aat++fb5pgJo3b57d9ClTpihArVq1yjbtetXDrdW3rzV48GAFqN9++00dOXJEeXt7qzvuuENlZmZet/xKKXXu3DllNBpVeHi4unr1ar7PrVXH85bjww8/tJvn119/zfdbFLcc1vmL+i9v1fro6GgFqHHjxl23rJ988okC1HvvvXfd+fJKSEhQOp1OVahQIV8zi6lTpypA+fj4lGi9TZs2VVOmTFGLFy9W8+bNU2PGjFF6vV4FBgaqw4cP283r7e2tQkJCClzOSy+9pAB14MAB27T27dsX6fcsSvOi119/XQHqiy++sJtu3f55t2lubq4KCwtTHh4e6vjx43bzDx8+PN86rdXs27Ztm++4nTNnjgLUY489Zjf96NGjymg0qpo1a9r20+vtCwXtk9fbTwtalnVaQc3NunXrpvR6vUpNTbVNe/bZZ5Ver1fbt2+3mzchIUFVrlxZdejQwTatSZMmqm7duvniKKwcN3OsXOtGTUIKkpOTo1q0aKEAtXbt2hvO/+mnnyog329wrRs1L8r7u1odPHhQ6fV6NWbM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7bffZuPGjdSpUwco/WOlMM888wyfffYZDz/8MN99912Rl2kwGFixYgV79+5l1apVbN68malTpzJ58mQ+/PBDW6ed17Nnzx46d+5M9erVmTRpEtWrV8fT0xONRsMzzzxTYAfGRRUYGEizZs1YtmwZc+bM4dlnn73pZUHxt3tpKOq2uZX7UpUqVTh48GCBSR7rtOJcjx2tLN43WM/l586ds/U5ZVXQ+b4414e8yy7IuXPn8i27sPkLi6U4sQshhLNI0kWIPCIiIjhx4kSBNxMHDx5Eo9HYPTjr9Xq6du1K165dActIFk2bNuXtt9+2PUxv3bq1WB1wrlu3rlhVvG+GtXZFQTd11rd819q4cSPjx4+nR48e+Pr68sknn9ChQwd69+59w/VZaxbs27cvX2eMBTl58mSB2+DQoUP4+vraHiSKW46ff/7ZNpJMUURHR+frZLYwycnJLFy4kGrVqtn2h7zKly+fr7p4QVW0fX197RIsixYtQilFz549b2q9N3Ls2DH0er2tBgVA8+bNOXLkCDt27LA9BFht27aNiIiIfJ3oOkr16tU5efIkubm5uLnZX6KOHDli97e1U9N///0333LOnj1LUlJSkTqstS7ryJEjXL58OV9tIevINdZlFXe/c+QoWtcKDg7G39+fhISEIr8Z9/T0pE+fPvTp0wewdEbco0cP3nvvPb777jugdI+VgiileOqpp/jyyy8ZPnw4s2fPvqkmhHfeeaet9klCQgKtW7fm9ddfZ+zYsRgMhutui59++onc3FxWrFiRrxZHXFycXQ3IvOc06+94PXq9nkWLFjFkyBCee+450tLSeOONN+zmse5fhw4dolmzZnafXbuP38x2ty67sGl5m+g5cp+9lftSy5YtWbFiRYEj1lin3ag2YN7zyrW1pK49F1glJiZy4cKFfLVdrL9t3vnL2n1D8+bN+eqrr9i2bVu+a4i1qVje/bE414fQ0FCqVq3K/v378zV1O336NBcvXrS7tjVv3txuvQXFYp3nZmIXQghnkSGjhchjwIABJCUl8fnnn9tN37RpE2vXrqVTp062B+Vrm4oA1K1bFy8vL7vq1da22UX9dyuaL1gfGFavXm03fdOmTQWOknP16lUGDRpE+fLl+eGHH5g1axY1atRg2LBhRRqO8f7778doNDJx4sQCH1Stb22tUlJS8m2DJUuWcPjwYbt2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EEIIIYQQQgghRClwc3YAznDs2DFnhyCEEEKUGbVq1Sq1Zcs1VwghhLAozeutKLukposQQgghhBBCCCFEKZCkixBCCCGEEEIIIUQpkKSLEEIIIYQQQgghRCmQpIsQotRcunSJjh07kp2d7exQhBBCCCGEEOKWk6SLEEIIIYQQLkxeggghhPNI0kUIIYQQQgghhBCiFEjSRQjhELGxsbzzzjsMGDCA3r178+abb9o+W79+PYMGDaJ379588cUXtukXL17k+eefp2/fvvTt25eJEyeSkpJi+3zgwIEsXLiQUaNGcc899/Dqq6/afS6EEEK4soEDB7JgwQJGjRpFjx49ePvtt0lJSWHy5Mncc889jBgxgujoaAA6duzImTNnbN/9+uuvee+99wB46qmnAOjbty89evRg586dAOzcuZPRo0fTq1cvRo0axT///APA4cOH6dWrF2fPngXg8uXL9O3bl/3799+qogshhMuQpIsQosRMJhOvv/46Pj4+zJ07lyVLlnDffffZPt+zZw/ffPMNM2fOZMWKFezduxcApRSDBg3il19+4YcffiAuLo5vvvnGbtl///03EydOZNGiRaSmpvLLL7/c0rIJIYQQzrR27VomTZrEggULiI6OZsyYMXTp0oXffvuNO+64gy+//PKGy5g+fToAy5YtY8WKFTRv3pwTJ04wadIknnrqKX777TeGDx/OW2+9RVJSEnXr1uXBBx9k0qRJZGdnM2XKFHr16sUdd9xRyqUVQgjXI0kXIUSJHT16lEuXLvHUU0/h5eWFm5ub3Y3Z8OHD8fDwoGLFijRu3Jjjx48DULFiRZo1a4bBYMDPz4/77ruPAwcO2C373nvvJTQ0FA8PDyIjI23fFUIIIf4LBgwYQHBwMH5+fjRr1owKFSrQvHlzdDodnTp14tixYze13N9//52ePXvSsGFDtFotrVq1IiIigu3btwPw0EMPYTAYeOKJJ8jMzGT48OGOLJYQQvxnuDk7ACHE7e/y5cuEhISg1+sL/DwwMND2/0ajkYyMDADi4+OZPn06UVFRpKenYzab8fT0LPS77u7utu8KIYQQ/wXXXgcddV28fPky+/fv5/fff7dNM5lMNG3aFACdTsc999zDe++9xxtvvIGbmzw2CCHEzZCzpxCixEJDQ7ly5Qq5ubnFuimbPXs2ZrOZ2bNn4+fnx+bNm/nkk09K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VqsVOyyjkPMeUznnBsg7P+YmTXLOrT1hzZUmuX8+5Jwfc5MuOecn59xIOth0uccmTpwIpVKJ+Ph4vPXWWxg1apSkLgzXlM2bNyMmJgaZmZnIy8tDTEwMVq1aJXZYRnHnHtM6ctljKufcAHnnx9ykSc65tTesudIj98+HnPNjbtIl5/zknBtJB5su95idnR1mz56NzMxMZGRkSO4WiE2Ji4vDzp07DX6kdk5rY3sO5bDHVM65AfLOj7kxN2od1tz2S+6fDznnx9ykmRsg7/zknBtJn0IQBEHsIIjai40bN+KLL74wmBYcHIzp06dDrVZj1apV+PHHH2FtbY3o6GhJbcDLOTdA3vkxN+ZGJDdy/3zIOT/mJs3cAHnnJ+fcSPrYdCEiIiIiIiIiMgGeXkREREREREREZAJsuhARERERERERmQCbLkREREREREREJsCmCxERERERERGRCbDpQkRERERERERkAmy6EBERERERERGZAJsuREREREREREQmwKYLEREREREREZEJsOlCRERERERERGQCbLoQEZHkxcfHw8/Pr9n5vLy8MGXKFKOvPygoCJGRkUYftzVmzpwJd3d3mJmZYfr06UhPT4dCocDVq1cBAOfPn4dCocCXX355T+Pavn071qxZY/RxV69ejb59+xp93NDQUCxevNjo4xIREdH9RSV2AERERGQce/fuRWpqKpYvX47+/fujc+fOsLGxQX5+Pjp27ChqbNu3b8fRo0cxefJko41ZVVWFRYsWYdWqVUYbs86cOXMQHR2NyZMnw9HR0ejjExER0f2BTRciIqJ2TKPRwNra+q7mPX36NABg2rRpMDP738GsDzzwgOixmcLmzZtRU1ODqKgoo489ePBgODo6IiMjA9OnTzf6+ERERHR/4OlFREQkG9nZ2fDz84OVlRX69OmDH374odlltm7disceewxWVlbo3LkzZsyYgdu3bxvMU1lZialTp8LDwwOWlpbw9vZGYmJio2NqNBpERETAx8cHhYWFAP53alNqaiq6dOkCGxsbREVFoaSkRL9c3ak/6enpePnll+Hs7Ix+/foBAMrLy/HCCy+gU6dOsLa2RmBgIL7//nv9skFBQZg6dSoAQKlUQqFQ4Lvvvqt3elFj0tPT0bNnT1hZWaFLly5ISkqCTqczeF6hUCA/Px+hoaGwtbVFQkICAOC9995D3759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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 119, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plotnine.options.figure_size = (12, 4.8)\n", + "df = pd.read_csv('block_linux_x86_64.csv') \n", + "df['blockprofilerate'] = [('10$^{'+str(int(math.log10(x)))+'}$') if x > 1 else str(x) for x in df['blockprofilerate']]\n", + "\n", + "compare = df.groupby(['blockprofilerate', 'workload']).median()\n", + "# calculate overhead compared to blockprofilerate=0 for same workload\n", + "compare['overhead'] = [\n", + " (x['ms'] / compare.loc['0'].loc[x['workload']]['ms'] - 1) * 100\n", + " for _, x in compare.reset_index().iterrows()\n", + "]\n", + "compare = compare.reset_index()\n", + "\n", + "def plot_title(df):\n", + " return (\n", + " 'median runtime.SetBlockProfileRate() overhead on artificial pathological workloads\\n\\n' +\n", + " 'os={} cpu={} goroutines={} stackdepth={} ops={}'.format(\n", + " 'linux',\n", + " 'i7-9750H',\n", + " val_range(df, 'goroutines'),\n", + " val_range(df, 'depth'),\n", + " val_range(df, 'ops'),\n", + " )\n", + " )\n", + "\n", + "def val_range(df, col):\n", + " min = int(df[col].min())\n", + " max = int(df[col].max())\n", + " return '{}-{}'.format(min, max) if min != max else min\n", + "\n", + "(\n", + "ggplot(df)\n", + "+ aes(x='blockprofilerate',y='ms',ymin=0)\n", + "+ ggtitle(plot_title(compare))\n", + "+ ylab('time (ms)')\n", + "+ xlab('blockprofilerate (ns)')\n", + "+ geom_label(\n", + " aes(label='overhead',color='overhead'),\n", + " data=compare,\n", + " y=0,\n", + " size=9,\n", + " format_string='{:.1f}%'\n", + ")\n", + "+ scale_color_gradient(low=\"green\",high=\"red\")\n", + "+ geom_boxplot(outlier_shape='')\n", + "+ facet_wrap('workload', scales='free')\n", + "+ theme(subplots_adjust={'wspace': 0.05})\n", + "+ geom_point(color='blue',shape='o',alpha=0.3, size=1)\n", + ")" + ] + } + ], + "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.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/bench/block_darwin_x86_64.csv b/bench/block_darwin_x86_64.csv new file mode 100644 index 0000000..5bf8112 --- /dev/null +++ b/bench/block_darwin_x86_64.csv @@ -0,0 +1,321 @@ +workload,ops,goroutines,depth,blockprofilerate,run,ms +mutex,100000,12,16,0,1,49.681104 +mutex,100000,12,16,0,2,50.078913 +mutex,100000,12,16,0,3,47.927359 +mutex,100000,12,16,0,4,59.656092 +mutex,100000,12,16,0,5,50.291591 +mutex,100000,12,16,0,6,65.488211 +mutex,100000,12,16,0,7,58.640640 +mutex,100000,12,16,0,8,65.101864 +mutex,100000,12,16,0,9,49.520904 +mutex,100000,12,16,0,10,65.811132 +mutex,100000,12,16,0,11,42.707750 +mutex,100000,12,16,0,12,64.331059 +mutex,100000,12,16,0,13,63.190112 +mutex,100000,12,16,0,14,64.777749 +mutex,100000,12,16,0,15,39.752394 +mutex,100000,12,16,0,16,47.413504 +mutex,100000,12,16,0,17,43.184214 +mutex,100000,12,16,0,18,65.530894 +mutex,100000,12,16,0,19,50.728438 +mutex,100000,12,16,0,20,58.386635 +mutex,100000,12,16,1,1,50.944243 +mutex,100000,12,16,1,2,42.542311 +mutex,100000,12,16,1,3,50.638888 +mutex,100000,12,16,1,4,48.546566 +mutex,100000,12,16,1,5,40.317764 +mutex,100000,12,16,1,6,65.192313 +mutex,100000,12,16,1,7,52.266073 +mutex,100000,12,16,1,8,46.385730 +mutex,100000,12,16,1,9,52.624183 +mutex,100000,12,16,1,10,45.297780 +mutex,100000,12,16,1,11,60.336353 +mutex,100000,12,16,1,12,52.750945 +mutex,100000,12,16,1,13,47.256072 +mutex,100000,12,16,1,14,56.113491 +mutex,100000,12,16,1,15,59.158761 +mutex,100000,12,16,1,16,43.212372 +mutex,100000,12,16,1,17,50.031352 +mutex,100000,12,16,1,18,67.085131 +mutex,100000,12,16,1,19,66.665573 +mutex,100000,12,16,1,20,47.070331 +mutex,100000,12,16,10,1,57.264136 +mutex,100000,12,16,10,2,67.843495 +mutex,100000,12,16,10,3,45.464245 +mutex,100000,12,16,10,4,53.264239 +mutex,100000,12,16,10,5,52.047079 +mutex,100000,12,16,10,6,62.050308 +mutex,100000,12,16,10,7,41.263293 +mutex,100000,12,16,10,8,54.802473 +mutex,100000,12,16,10,9,51.945275 +mutex,100000,12,16,10,10,61.168683 +mutex,100000,12,16,10,11,51.177096 +mutex,100000,12,16,10,12,48.406307 +mutex,100000,12,16,10,13,49.220852 +mutex,100000,12,16,10,14,60.442277 +mutex,100000,12,16,10,15,51.963914 +mutex,100000,12,16,10,16,66.966394 +mutex,100000,12,16,10,17,41.372235 +mutex,100000,12,16,10,18,42.587658 +mutex,100000,12,16,10,19,49.171039 +mutex,100000,12,16,10,20,51.542382 +mutex,100000,12,16,100,1,68.791788 +mutex,100000,12,16,100,2,51.846772 +mutex,100000,12,16,100,3,48.625480 +mutex,100000,12,16,100,4,68.580630 +mutex,100000,12,16,100,5,60.722834 +mutex,100000,12,16,100,6,44.417033 +mutex,100000,12,16,100,7,47.027116 +mutex,100000,12,16,100,8,48.420106 +mutex,100000,12,16,100,9,59.013143 +mutex,100000,12,16,100,10,50.902912 +mutex,100000,12,16,100,11,46.468126 +mutex,100000,12,16,100,12,68.390484 +mutex,100000,12,16,100,13,62.588615 +mutex,100000,12,16,100,14,60.629303 +mutex,100000,12,16,100,15,67.084802 +mutex,100000,12,16,100,16,58.628457 +mutex,100000,12,16,100,17,67.506226 +mutex,100000,12,16,100,18,43.632227 +mutex,100000,12,16,100,19,59.380773 +mutex,100000,12,16,100,20,49.425766 +mutex,100000,12,16,1000,1,50.404625 +mutex,100000,12,16,1000,2,42.048149 +mutex,100000,12,16,1000,3,56.374296 +mutex,100000,12,16,1000,4,43.777660 +mutex,100000,12,16,1000,5,66.811352 +mutex,100000,12,16,1000,6,55.521177 +mutex,100000,12,16,1000,7,52.749122 +mutex,100000,12,16,1000,8,67.634553 +mutex,100000,12,16,1000,9,68.680265 +mutex,100000,12,16,1000,10,52.183400 +mutex,100000,12,16,1000,11,66.177865 +mutex,100000,12,16,1000,12,46.797660 +mutex,100000,12,16,1000,13,65.397480 +mutex,100000,12,16,1000,14,54.648316 +mutex,100000,12,16,1000,15,53.222728 +mutex,100000,12,16,1000,16,56.852040 +mutex,100000,12,16,1000,17,49.813221 +mutex,100000,12,16,1000,18,53.560966 +mutex,100000,12,16,1000,19,50.489613 +mutex,100000,12,16,1000,20,44.719812 +mutex,100000,12,16,10000,1,51.217334 +mutex,100000,12,16,10000,2,47.542253 +mutex,100000,12,16,10000,3,39.239273 +mutex,100000,12,16,10000,4,53.096943 +mutex,100000,12,16,10000,5,51.599820 +mutex,100000,12,16,10000,6,58.732492 +mutex,100000,12,16,10000,7,56.722604 +mutex,100000,12,16,10000,8,58.905575 +mutex,100000,12,16,10000,9,56.649334 +mutex,100000,12,16,10000,10,58.762068 +mutex,100000,12,16,10000,11,47.574787 +mutex,100000,12,16,10000,12,66.860659 +mutex,100000,12,16,10000,13,59.622704 +mutex,100000,12,16,10000,14,54.709976 +mutex,100000,12,16,10000,15,60.568121 +mutex,100000,12,16,10000,16,45.257157 +mutex,100000,12,16,10000,17,55.519563 +mutex,100000,12,16,10000,18,55.277471 +mutex,100000,12,16,10000,19,48.347631 +mutex,100000,12,16,10000,20,58.185999 +mutex,100000,12,16,100000,1,50.658573 +mutex,100000,12,16,100000,2,51.870714 +mutex,100000,12,16,100000,3,58.421035 +mutex,100000,12,16,100000,4,51.292373 +mutex,100000,12,16,100000,5,57.245658 +mutex,100000,12,16,100000,6,46.146581 +mutex,100000,12,16,100000,7,48.557333 +mutex,100000,12,16,100000,8,47.831668 +mutex,100000,12,16,100000,9,51.397730 +mutex,100000,12,16,100000,10,48.835914 +mutex,100000,12,16,100000,11,42.140227 +mutex,100000,12,16,100000,12,40.080772 +mutex,100000,12,16,100000,13,57.205709 +mutex,100000,12,16,100000,14,51.206220 +mutex,100000,12,16,100000,15,51.223188 +mutex,100000,12,16,100000,16,59.830204 +mutex,100000,12,16,100000,17,49.893225 +mutex,100000,12,16,100000,18,53.510641 +mutex,100000,12,16,100000,19,60.542843 +mutex,100000,12,16,100000,20,44.301078 +mutex,100000,12,16,1000000,1,66.655018 +mutex,100000,12,16,1000000,2,60.439144 +mutex,100000,12,16,1000000,3,60.095797 +mutex,100000,12,16,1000000,4,60.363989 +mutex,100000,12,16,1000000,5,56.208243 +mutex,100000,12,16,1000000,6,68.455244 +mutex,100000,12,16,1000000,7,55.554970 +mutex,100000,12,16,1000000,8,50.359371 +mutex,100000,12,16,1000000,9,54.162726 +mutex,100000,12,16,1000000,10,60.034517 +mutex,100000,12,16,1000000,11,39.253178 +mutex,100000,12,16,1000000,12,50.693452 +mutex,100000,12,16,1000000,13,67.508558 +mutex,100000,12,16,1000000,14,52.433383 +mutex,100000,12,16,1000000,15,51.282912 +mutex,100000,12,16,1000000,16,43.642607 +mutex,100000,12,16,1000000,17,41.722618 +mutex,100000,12,16,1000000,18,65.895850 +mutex,100000,12,16,1000000,19,57.618387 +mutex,100000,12,16,1000000,20,50.055619 +chan,100000,12,16,0,1,40.127441 +chan,100000,12,16,0,2,41.455001 +chan,100000,12,16,0,3,36.714570 +chan,100000,12,16,0,4,40.933785 +chan,100000,12,16,0,5,41.266292 +chan,100000,12,16,0,6,40.234146 +chan,100000,12,16,0,7,39.892225 +chan,100000,12,16,0,8,41.455500 +chan,100000,12,16,0,9,40.033096 +chan,100000,12,16,0,10,38.649510 +chan,100000,12,16,0,11,41.825958 +chan,100000,12,16,0,12,39.205938 +chan,100000,12,16,0,13,39.995307 +chan,100000,12,16,0,14,41.446220 +chan,100000,12,16,0,15,34.960096 +chan,100000,12,16,0,16,39.238390 +chan,100000,12,16,0,17,40.386993 +chan,100000,12,16,0,18,41.067920 +chan,100000,12,16,0,19,40.729058 +chan,100000,12,16,0,20,38.150088 +chan,100000,12,16,1,1,223.907638 +chan,100000,12,16,1,2,224.186200 +chan,100000,12,16,1,3,222.084690 +chan,100000,12,16,1,4,225.533614 +chan,100000,12,16,1,5,220.717298 +chan,100000,12,16,1,6,224.827734 +chan,100000,12,16,1,7,224.738237 +chan,100000,12,16,1,8,222.894227 +chan,100000,12,16,1,9,225.341929 +chan,100000,12,16,1,10,221.645462 +chan,100000,12,16,1,11,221.707640 +chan,100000,12,16,1,12,217.618091 +chan,100000,12,16,1,13,226.229364 +chan,100000,12,16,1,14,220.475431 +chan,100000,12,16,1,15,226.986811 +chan,100000,12,16,1,16,223.550684 +chan,100000,12,16,1,17,219.462757 +chan,100000,12,16,1,18,222.596380 +chan,100000,12,16,1,19,224.815037 +chan,100000,12,16,1,20,251.754326 +chan,100000,12,16,10,1,257.372765 +chan,100000,12,16,10,2,236.868647 +chan,100000,12,16,10,3,227.049072 +chan,100000,12,16,10,4,226.898790 +chan,100000,12,16,10,5,232.118180 +chan,100000,12,16,10,6,231.541822 +chan,100000,12,16,10,7,234.792215 +chan,100000,12,16,10,8,225.647944 +chan,100000,12,16,10,9,227.758307 +chan,100000,12,16,10,10,225.524614 +chan,100000,12,16,10,11,227.264732 +chan,100000,12,16,10,12,226.755865 +chan,100000,12,16,10,13,238.960593 +chan,100000,12,16,10,14,232.485852 +chan,100000,12,16,10,15,245.820344 +chan,100000,12,16,10,16,236.798622 +chan,100000,12,16,10,17,230.580822 +chan,100000,12,16,10,18,242.449093 +chan,100000,12,16,10,19,257.890520 +chan,100000,12,16,10,20,295.985658 +chan,100000,12,16,100,1,261.136609 +chan,100000,12,16,100,2,252.078825 +chan,100000,12,16,100,3,246.238164 +chan,100000,12,16,100,4,247.750855 +chan,100000,12,16,100,5,254.491770 +chan,100000,12,16,100,6,250.919761 +chan,100000,12,16,100,7,250.302032 +chan,100000,12,16,100,8,255.029772 +chan,100000,12,16,100,9,253.592142 +chan,100000,12,16,100,10,248.644975 +chan,100000,12,16,100,11,245.904687 +chan,100000,12,16,100,12,244.819163 +chan,100000,12,16,100,13,237.814405 +chan,100000,12,16,100,14,234.217106 +chan,100000,12,16,100,15,232.469570 +chan,100000,12,16,100,16,238.851532 +chan,100000,12,16,100,17,234.777584 +chan,100000,12,16,100,18,279.274536 +chan,100000,12,16,100,19,264.663054 +chan,100000,12,16,100,20,245.324167 +chan,100000,12,16,1000,1,248.366516 +chan,100000,12,16,1000,2,244.915217 +chan,100000,12,16,1000,3,251.256402 +chan,100000,12,16,1000,4,257.033927 +chan,100000,12,16,1000,5,244.988459 +chan,100000,12,16,1000,6,246.223655 +chan,100000,12,16,1000,7,246.739936 +chan,100000,12,16,1000,8,247.733433 +chan,100000,12,16,1000,9,243.534361 +chan,100000,12,16,1000,10,244.229115 +chan,100000,12,16,1000,11,241.631071 +chan,100000,12,16,1000,12,248.066545 +chan,100000,12,16,1000,13,246.004506 +chan,100000,12,16,1000,14,258.074152 +chan,100000,12,16,1000,15,285.097017 +chan,100000,12,16,1000,16,261.730586 +chan,100000,12,16,1000,17,249.478010 +chan,100000,12,16,1000,18,257.300198 +chan,100000,12,16,1000,19,249.390272 +chan,100000,12,16,1000,20,249.321477 +chan,100000,12,16,10000,1,50.979799 +chan,100000,12,16,10000,2,54.086199 +chan,100000,12,16,10000,3,53.419140 +chan,100000,12,16,10000,4,51.705684 +chan,100000,12,16,10000,5,53.428333 +chan,100000,12,16,10000,6,53.513013 +chan,100000,12,16,10000,7,52.756857 +chan,100000,12,16,10000,8,52.737539 +chan,100000,12,16,10000,9,54.526229 +chan,100000,12,16,10000,10,54.683371 +chan,100000,12,16,10000,11,49.746521 +chan,100000,12,16,10000,12,54.400111 +chan,100000,12,16,10000,13,50.665225 +chan,100000,12,16,10000,14,54.629914 +chan,100000,12,16,10000,15,54.911260 +chan,100000,12,16,10000,16,66.959642 +chan,100000,12,16,10000,17,141.198709 +chan,100000,12,16,10000,18,66.301375 +chan,100000,12,16,10000,19,67.760641 +chan,100000,12,16,10000,20,66.273444 +chan,100000,12,16,100000,1,51.768910 +chan,100000,12,16,100000,2,51.049230 +chan,100000,12,16,100000,3,54.008867 +chan,100000,12,16,100000,4,50.219752 +chan,100000,12,16,100000,5,52.629875 +chan,100000,12,16,100000,6,52.502319 +chan,100000,12,16,100000,7,52.029321 +chan,100000,12,16,100000,8,52.309561 +chan,100000,12,16,100000,9,53.655503 +chan,100000,12,16,100000,10,52.028376 +chan,100000,12,16,100000,11,52.477284 +chan,100000,12,16,100000,12,53.906940 +chan,100000,12,16,100000,13,51.966575 +chan,100000,12,16,100000,14,48.919888 +chan,100000,12,16,100000,15,52.520428 +chan,100000,12,16,100000,16,51.418556 +chan,100000,12,16,100000,17,51.322284 +chan,100000,12,16,100000,18,52.619286 +chan,100000,12,16,100000,19,50.113266 +chan,100000,12,16,100000,20,51.770223 +chan,100000,12,16,1000000,1,49.424379 +chan,100000,12,16,1000000,2,46.381429 +chan,100000,12,16,1000000,3,47.912844 +chan,100000,12,16,1000000,4,44.600584 +chan,100000,12,16,1000000,5,45.776060 +chan,100000,12,16,1000000,6,43.522351 +chan,100000,12,16,1000000,7,49.256773 +chan,100000,12,16,1000000,8,45.960914 +chan,100000,12,16,1000000,9,43.723385 +chan,100000,12,16,1000000,10,43.966708 +chan,100000,12,16,1000000,11,46.964555 +chan,100000,12,16,1000000,12,44.939054 +chan,100000,12,16,1000000,13,44.300620 +chan,100000,12,16,1000000,14,48.752618 +chan,100000,12,16,1000000,15,43.285205 +chan,100000,12,16,1000000,16,50.477541 +chan,100000,12,16,1000000,17,48.662168 +chan,100000,12,16,1000000,18,43.123251 +chan,100000,12,16,1000000,19,47.569443 +chan,100000,12,16,1000000,20,46.944097 diff --git a/bench/block_linux_x86_64.csv b/bench/block_linux_x86_64.csv new file mode 100644 index 0000000..2039014 --- /dev/null +++ b/bench/block_linux_x86_64.csv @@ -0,0 +1,321 @@ +workload,ops,goroutines,depth,blockprofilerate,run,ms +mutex,100000,12,16,0,1,46.467006 +mutex,100000,12,16,0,2,44.290682 +mutex,100000,12,16,0,3,60.522433 +mutex,100000,12,16,0,4,43.181006 +mutex,100000,12,16,0,5,66.170038 +mutex,100000,12,16,0,6,53.691183 +mutex,100000,12,16,0,7,60.011052 +mutex,100000,12,16,0,8,40.319046 +mutex,100000,12,16,0,9,65.361119 +mutex,100000,12,16,0,10,51.639923 +mutex,100000,12,16,0,11,59.055253 +mutex,100000,12,16,0,12,43.185502 +mutex,100000,12,16,0,13,48.958826 +mutex,100000,12,16,0,14,41.164255 +mutex,100000,12,16,0,15,55.206372 +mutex,100000,12,16,0,16,41.935746 +mutex,100000,12,16,0,17,37.673853 +mutex,100000,12,16,0,18,62.385450 +mutex,100000,12,16,0,19,59.583401 +mutex,100000,12,16,0,20,54.834707 +mutex,100000,12,16,1,1,58.657674 +mutex,100000,12,16,1,2,52.858070 +mutex,100000,12,16,1,3,59.098276 +mutex,100000,12,16,1,4,38.037816 +mutex,100000,12,16,1,5,41.329989 +mutex,100000,12,16,1,6,45.926589 +mutex,100000,12,16,1,7,66.885038 +mutex,100000,12,16,1,8,71.064418 +mutex,100000,12,16,1,9,39.864812 +mutex,100000,12,16,1,10,58.841239 +mutex,100000,12,16,1,11,41.621457 +mutex,100000,12,16,1,12,54.008223 +mutex,100000,12,16,1,13,43.136109 +mutex,100000,12,16,1,14,55.008887 +mutex,100000,12,16,1,15,59.459737 +mutex,100000,12,16,1,16,40.826485 +mutex,100000,12,16,1,17,55.233407 +mutex,100000,12,16,1,18,41.926122 +mutex,100000,12,16,1,19,41.365361 +mutex,100000,12,16,1,20,46.630824 +mutex,100000,12,16,10,1,43.069553 +mutex,100000,12,16,10,2,38.297855 +mutex,100000,12,16,10,3,52.256908 +mutex,100000,12,16,10,4,60.145081 +mutex,100000,12,16,10,5,56.299579 +mutex,100000,12,16,10,6,60.084497 +mutex,100000,12,16,10,7,54.629164 +mutex,100000,12,16,10,8,42.944174 +mutex,100000,12,16,10,9,54.674537 +mutex,100000,12,16,10,10,39.989021 +mutex,100000,12,16,10,11,50.573836 +mutex,100000,12,16,10,12,55.384098 +mutex,100000,12,16,10,13,53.032156 +mutex,100000,12,16,10,14,44.197028 +mutex,100000,12,16,10,15,42.568158 +mutex,100000,12,16,10,16,52.525550 +mutex,100000,12,16,10,17,53.649684 +mutex,100000,12,16,10,18,49.050458 +mutex,100000,12,16,10,19,45.225980 +mutex,100000,12,16,10,20,44.752093 +mutex,100000,12,16,100,1,45.931160 +mutex,100000,12,16,100,2,37.846390 +mutex,100000,12,16,100,3,60.378127 +mutex,100000,12,16,100,4,44.674935 +mutex,100000,12,16,100,5,52.985250 +mutex,100000,12,16,100,6,45.260076 +mutex,100000,12,16,100,7,54.978621 +mutex,100000,12,16,100,8,42.909708 +mutex,100000,12,16,100,9,42.451431 +mutex,100000,12,16,100,10,49.504010 +mutex,100000,12,16,100,11,55.671905 +mutex,100000,12,16,100,12,43.706222 +mutex,100000,12,16,100,13,60.108024 +mutex,100000,12,16,100,14,49.619005 +mutex,100000,12,16,100,15,40.618539 +mutex,100000,12,16,100,16,42.889189 +mutex,100000,12,16,100,17,67.473317 +mutex,100000,12,16,100,18,51.419243 +mutex,100000,12,16,100,19,45.107350 +mutex,100000,12,16,100,20,40.771357 +mutex,100000,12,16,1000,1,62.574475 +mutex,100000,12,16,1000,2,59.028890 +mutex,100000,12,16,1000,3,39.201583 +mutex,100000,12,16,1000,4,43.290072 +mutex,100000,12,16,1000,5,59.420073 +mutex,100000,12,16,1000,6,49.342441 +mutex,100000,12,16,1000,7,39.942119 +mutex,100000,12,16,1000,8,64.363938 +mutex,100000,12,16,1000,9,58.400210 +mutex,100000,12,16,1000,10,56.234503 +mutex,100000,12,16,1000,11,59.669313 +mutex,100000,12,16,1000,12,49.968124 +mutex,100000,12,16,1000,13,54.138841 +mutex,100000,12,16,1000,14,66.744277 +mutex,100000,12,16,1000,15,62.178203 +mutex,100000,12,16,1000,16,37.697144 +mutex,100000,12,16,1000,17,60.903586 +mutex,100000,12,16,1000,18,55.463893 +mutex,100000,12,16,1000,19,59.107085 +mutex,100000,12,16,1000,20,59.657245 +mutex,100000,12,16,10000,1,38.351896 +mutex,100000,12,16,10000,2,55.266675 +mutex,100000,12,16,10000,3,39.394658 +mutex,100000,12,16,10000,4,39.566490 +mutex,100000,12,16,10000,5,45.919325 +mutex,100000,12,16,10000,6,53.719078 +mutex,100000,12,16,10000,7,40.126134 +mutex,100000,12,16,10000,8,44.742102 +mutex,100000,12,16,10000,9,58.435704 +mutex,100000,12,16,10000,10,49.598292 +mutex,100000,12,16,10000,11,40.291477 +mutex,100000,12,16,10000,12,38.899508 +mutex,100000,12,16,10000,13,41.012172 +mutex,100000,12,16,10000,14,53.289262 +mutex,100000,12,16,10000,15,42.360970 +mutex,100000,12,16,10000,16,48.811259 +mutex,100000,12,16,10000,17,48.897078 +mutex,100000,12,16,10000,18,66.828307 +mutex,100000,12,16,10000,19,53.383452 +mutex,100000,12,16,10000,20,55.778016 +mutex,100000,12,16,100000,1,42.022044 +mutex,100000,12,16,100000,2,54.665914 +mutex,100000,12,16,100000,3,64.361148 +mutex,100000,12,16,100000,4,38.066262 +mutex,100000,12,16,100000,5,42.734374 +mutex,100000,12,16,100000,6,46.523299 +mutex,100000,12,16,100000,7,53.598462 +mutex,100000,12,16,100000,8,55.809807 +mutex,100000,12,16,100000,9,54.619479 +mutex,100000,12,16,100000,10,53.632052 +mutex,100000,12,16,100000,11,42.486463 +mutex,100000,12,16,100000,12,54.097662 +mutex,100000,12,16,100000,13,55.159648 +mutex,100000,12,16,100000,14,62.351892 +mutex,100000,12,16,100000,15,58.009944 +mutex,100000,12,16,100000,16,44.162679 +mutex,100000,12,16,100000,17,59.226323 +mutex,100000,12,16,100000,18,47.907346 +mutex,100000,12,16,100000,19,58.379319 +mutex,100000,12,16,100000,20,39.935513 +mutex,100000,12,16,1000000,1,62.233427 +mutex,100000,12,16,1000000,2,51.523759 +mutex,100000,12,16,1000000,3,52.125536 +mutex,100000,12,16,1000000,4,42.658314 +mutex,100000,12,16,1000000,5,58.751405 +mutex,100000,12,16,1000000,6,60.473855 +mutex,100000,12,16,1000000,7,63.479988 +mutex,100000,12,16,1000000,8,45.191694 +mutex,100000,12,16,1000000,9,59.018170 +mutex,100000,12,16,1000000,10,40.870761 +mutex,100000,12,16,1000000,11,58.517260 +mutex,100000,12,16,1000000,12,39.826999 +mutex,100000,12,16,1000000,13,49.954863 +mutex,100000,12,16,1000000,14,63.449030 +mutex,100000,12,16,1000000,15,48.601972 +mutex,100000,12,16,1000000,16,54.753241 +mutex,100000,12,16,1000000,17,51.878619 +mutex,100000,12,16,1000000,18,57.975290 +mutex,100000,12,16,1000000,19,59.064562 +mutex,100000,12,16,1000000,20,40.398516 +chan,100000,12,16,0,1,38.930788 +chan,100000,12,16,0,2,38.962047 +chan,100000,12,16,0,3,34.126573 +chan,100000,12,16,0,4,38.575680 +chan,100000,12,16,0,5,39.382191 +chan,100000,12,16,0,6,38.717870 +chan,100000,12,16,0,7,33.401885 +chan,100000,12,16,0,8,37.744891 +chan,100000,12,16,0,9,38.056009 +chan,100000,12,16,0,10,37.215323 +chan,100000,12,16,0,11,39.185289 +chan,100000,12,16,0,12,39.001858 +chan,100000,12,16,0,13,37.552412 +chan,100000,12,16,0,14,38.814981 +chan,100000,12,16,0,15,33.819264 +chan,100000,12,16,0,16,33.419707 +chan,100000,12,16,0,17,38.160386 +chan,100000,12,16,0,18,37.685666 +chan,100000,12,16,0,19,37.741301 +chan,100000,12,16,0,20,38.073851 +chan,100000,12,16,1,1,206.471094 +chan,100000,12,16,1,2,231.492042 +chan,100000,12,16,1,3,231.981320 +chan,100000,12,16,1,4,229.927609 +chan,100000,12,16,1,5,226.387498 +chan,100000,12,16,1,6,227.298844 +chan,100000,12,16,1,7,232.930180 +chan,100000,12,16,1,8,291.535175 +chan,100000,12,16,1,9,229.557539 +chan,100000,12,16,1,10,233.672669 +chan,100000,12,16,1,11,272.365943 +chan,100000,12,16,1,12,277.553013 +chan,100000,12,16,1,13,245.704673 +chan,100000,12,16,1,14,236.444902 +chan,100000,12,16,1,15,225.046998 +chan,100000,12,16,1,16,228.734167 +chan,100000,12,16,1,17,224.087757 +chan,100000,12,16,1,18,223.530512 +chan,100000,12,16,1,19,229.503426 +chan,100000,12,16,1,20,237.962910 +chan,100000,12,16,10,1,223.731611 +chan,100000,12,16,10,2,227.887615 +chan,100000,12,16,10,3,231.025652 +chan,100000,12,16,10,4,224.036089 +chan,100000,12,16,10,5,227.921960 +chan,100000,12,16,10,6,227.370712 +chan,100000,12,16,10,7,226.022368 +chan,100000,12,16,10,8,224.131028 +chan,100000,12,16,10,9,225.217383 +chan,100000,12,16,10,10,279.362075 +chan,100000,12,16,10,11,291.887899 +chan,100000,12,16,10,12,275.184338 +chan,100000,12,16,10,13,252.618587 +chan,100000,12,16,10,14,262.680865 +chan,100000,12,16,10,15,260.281824 +chan,100000,12,16,10,16,257.447121 +chan,100000,12,16,10,17,264.377578 +chan,100000,12,16,10,18,263.156864 +chan,100000,12,16,10,19,265.330119 +chan,100000,12,16,10,20,261.613324 +chan,100000,12,16,100,1,264.683930 +chan,100000,12,16,100,2,248.410978 +chan,100000,12,16,100,3,247.333410 +chan,100000,12,16,100,4,243.845980 +chan,100000,12,16,100,5,239.822354 +chan,100000,12,16,100,6,237.553585 +chan,100000,12,16,100,7,239.254743 +chan,100000,12,16,100,8,247.328360 +chan,100000,12,16,100,9,240.923141 +chan,100000,12,16,100,10,271.284629 +chan,100000,12,16,100,11,301.878625 +chan,100000,12,16,100,12,251.946864 +chan,100000,12,16,100,13,269.313950 +chan,100000,12,16,100,14,271.742718 +chan,100000,12,16,100,15,255.162142 +chan,100000,12,16,100,16,257.510921 +chan,100000,12,16,100,17,262.474641 +chan,100000,12,16,100,18,252.028231 +chan,100000,12,16,100,19,250.937361 +chan,100000,12,16,100,20,248.552703 +chan,100000,12,16,1000,1,248.275829 +chan,100000,12,16,1000,2,251.210887 +chan,100000,12,16,1000,3,261.993810 +chan,100000,12,16,1000,4,251.872439 +chan,100000,12,16,1000,5,259.897580 +chan,100000,12,16,1000,6,253.564443 +chan,100000,12,16,1000,7,256.638895 +chan,100000,12,16,1000,8,268.917462 +chan,100000,12,16,1000,9,300.712656 +chan,100000,12,16,1000,10,261.745801 +chan,100000,12,16,1000,11,265.995695 +chan,100000,12,16,1000,12,251.408058 +chan,100000,12,16,1000,13,247.174449 +chan,100000,12,16,1000,14,243.270778 +chan,100000,12,16,1000,15,253.691616 +chan,100000,12,16,1000,16,249.893182 +chan,100000,12,16,1000,17,254.181993 +chan,100000,12,16,1000,18,244.305181 +chan,100000,12,16,1000,19,255.793142 +chan,100000,12,16,1000,20,253.440143 +chan,100000,12,16,10000,1,49.174187 +chan,100000,12,16,10000,2,52.105591 +chan,100000,12,16,10000,3,50.705801 +chan,100000,12,16,10000,4,53.687918 +chan,100000,12,16,10000,5,47.649914 +chan,100000,12,16,10000,6,49.906878 +chan,100000,12,16,10000,7,52.485732 +chan,100000,12,16,10000,8,52.100545 +chan,100000,12,16,10000,9,47.447707 +chan,100000,12,16,10000,10,50.818564 +chan,100000,12,16,10000,11,52.480842 +chan,100000,12,16,10000,12,50.284561 +chan,100000,12,16,10000,13,49.105261 +chan,100000,12,16,10000,14,46.196857 +chan,100000,12,16,10000,15,47.066741 +chan,100000,12,16,10000,16,46.997165 +chan,100000,12,16,10000,17,52.446521 +chan,100000,12,16,10000,18,45.764945 +chan,100000,12,16,10000,19,50.824254 +chan,100000,12,16,10000,20,51.996919 +chan,100000,12,16,100000,1,44.288153 +chan,100000,12,16,100000,2,43.813236 +chan,100000,12,16,100000,3,43.250038 +chan,100000,12,16,100000,4,44.461900 +chan,100000,12,16,100000,5,44.226336 +chan,100000,12,16,100000,6,44.792520 +chan,100000,12,16,100000,7,46.235535 +chan,100000,12,16,100000,8,46.886577 +chan,100000,12,16,100000,9,45.389115 +chan,100000,12,16,100000,10,44.910575 +chan,100000,12,16,100000,11,45.848624 +chan,100000,12,16,100000,12,45.041405 +chan,100000,12,16,100000,13,45.046831 +chan,100000,12,16,100000,14,44.356991 +chan,100000,12,16,100000,15,45.245524 +chan,100000,12,16,100000,16,44.935766 +chan,100000,12,16,100000,17,44.303058 +chan,100000,12,16,100000,18,42.888595 +chan,100000,12,16,100000,19,43.469088 +chan,100000,12,16,100000,20,44.596701 +chan,100000,12,16,1000000,1,42.360033 +chan,100000,12,16,1000000,2,44.479671 +chan,100000,12,16,1000000,3,42.649025 +chan,100000,12,16,1000000,4,37.405249 +chan,100000,12,16,1000000,5,41.038673 +chan,100000,12,16,1000000,6,40.985792 +chan,100000,12,16,1000000,7,43.482838 +chan,100000,12,16,1000000,8,38.535429 +chan,100000,12,16,1000000,9,40.347623 +chan,100000,12,16,1000000,10,41.903392 +chan,100000,12,16,1000000,11,42.033115 +chan,100000,12,16,1000000,12,41.610760 +chan,100000,12,16,1000000,13,38.156949 +chan,100000,12,16,1000000,14,42.229382 +chan,100000,12,16,1000000,15,38.951487 +chan,100000,12,16,1000000,16,44.341920 +chan,100000,12,16,1000000,17,39.614923 +chan,100000,12,16,1000000,18,37.024286 +chan,100000,12,16,1000000,19,37.958312 +chan,100000,12,16,1000000,20,37.434442 diff --git a/bench/csv.go b/bench/csv.go new file mode 100644 index 0000000..56fccd0 --- /dev/null +++ b/bench/csv.go @@ -0,0 +1,65 @@ +package main + +import ( + "fmt" + "time" +) + +type Record struct { + Workload string + Ops int + Goroutines int + Depth int + Blockprofilerate int + Run int + Duration time.Duration +} + +type Column struct { + Name string + MarshalValue func(*Record) (string, error) +} + +var Columns = []Column{ + {"workload", func(r *Record) (string, error) { + return fmt.Sprintf("%s", r.Workload), nil + }}, + {"ops", func(r *Record) (string, error) { + return fmt.Sprintf("%d", r.Ops), nil + }}, + {"goroutines", func(r *Record) (string, error) { + return fmt.Sprintf("%d", r.Goroutines), nil + }}, + {"depth", func(r *Record) (string, error) { + return fmt.Sprintf("%d", r.Depth), nil + }}, + {"blockprofilerate", func(r *Record) (string, error) { + return fmt.Sprintf("%d", r.Blockprofilerate), nil + }}, + {"run", func(r *Record) (string, error) { + return fmt.Sprintf("%d", r.Run), nil + }}, + {"ms", func(r *Record) (string, error) { + return fmt.Sprintf("%f", r.Duration.Seconds()*1000), nil + }}, +} + +func (r *Record) MarshalRecord() ([]string, error) { + record := make([]string, len(Columns)) + for i, col := range Columns { + val, err := col.MarshalValue(r) + if err != nil { + return nil, err + } + record[i] = val + } + return record, nil +} + +func Headers() []string { + headers := make([]string, len(Columns)) + for i, col := range Columns { + headers[i] = col.Name + } + return headers +} diff --git a/bench/main.go b/bench/main.go new file mode 100644 index 0000000..a6491da --- /dev/null +++ b/bench/main.go @@ -0,0 +1,197 @@ +package main + +import ( + "bytes" + "encoding/csv" + "flag" + "fmt" + "os" + "os/exec" + "runtime" + "runtime/pprof" + "strconv" + "strings" + "time" +) + +func main() { + if err := run(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func run() error { + if os.Getenv("WORKER") == "" { + return leader() + } else { + return worker() + } +} + +func leader() error { + var ( + blockprofilerates = flagIntSlice("blockprofilerates", []int{0, 1, 10, 100, 1000, 10000, 100000, 1000000}, "The runtime.SetBlockProfileRate() values to benchmark.") + workloads = flagStringSlice("workloads", []string{"mutex", "chan"}, "The workloads to benchmark.") + ops = flag.Int("ops", 1000, "The number of operations to perform for each workload.") + goroutines = flagIntSlice("goroutines", []int{runtime.NumCPU()}, "The number of goroutine values to use for each workloads.") + runs = flag.Int("runs", 3, "The number of times to repeat the same benchmark to understand variance.") + depths = flagIntSlice("depths", []int{2, 4, 8, 16, 32}, "The different frame depths values to use for each workload.") + ) + flag.Parse() + + cw := csv.NewWriter(os.Stdout) + cw.Write(Headers()) + cw.Flush() + + for _, workload := range *workloads { + for _, goroutine := range *goroutines { + for _, blockprofilerate := range *blockprofilerates { + for _, depth := range *depths { + for run := 1; run <= *runs; run++ { + cmd := exec.Command(os.Args[0], + "-run", fmt.Sprintf("%d", run), + "-blockprofilerate", fmt.Sprintf("%d", blockprofilerate), + "-ops", fmt.Sprintf("%d", *ops), + "-goroutines", fmt.Sprintf("%d", goroutine), + "-depth", fmt.Sprintf("%d", depth), + "-workload", workload, + ) + + buf := &bytes.Buffer{} + cmd.Stdout = buf + cmd.Stderr = os.Stderr + cmd.Env = append(cmd.Env, "WORKER=yeah") + + if err := cmd.Run(); err != nil { + return err + } + + buf.WriteTo(os.Stdout) + } + } + } + } + } + + return nil +} + +func worker() error { + var ( + run = flag.Int("run", 1, "The number of run. Has no impact on the benchmark, but gets included in the csv output line.") + blockprofilerate = flag.Int("blockprofilerate", 1, "The block profile rate to use.") + workload = flag.String("workload", "mutex", "The workload to simulate.") + out = flag.String("blockprofile", "", "Path to a file for writing the block profile.") + depth = flag.Int("depth", 16, "The stack depth at which to perform blocking events.") + ops = flag.Int("ops", 100000, "The number of operations to perform.") + goroutines = flag.Int("goroutines", runtime.NumCPU(), "The number of goroutines to utilize.") + ) + flag.Parse() + + if *blockprofilerate > 0 { + runtime.SetBlockProfileRate(*blockprofilerate) + } + + start := time.Now() + switch *workload { + case "mutex": + if err := mutexWorkload(*goroutines, *ops, *depth); err != nil { + return err + } + case "chan": + if err := chanWorkload(*goroutines, *ops, *depth); err != nil { + return err + } + default: + return fmt.Errorf("unknown workload: %q", *workload) + } + duration := time.Since(start) + + if *blockprofilerate > 0 && *out != "" { + f, err := os.Create(*out) + if err != nil { + return err + } + defer f.Close() + if err := pprof.Lookup("block").WriteTo(f, 0); err != nil { + return err + } + } + + cw := csv.NewWriter(os.Stdout) + record, err := (&Record{ + Workload: *workload, + Ops: *ops, + Goroutines: *goroutines, + Depth: *depth, + Blockprofilerate: *blockprofilerate, + Run: *run, + Duration: duration, + }).MarshalRecord() + if err != nil { + return err + } + cw.Write(record) + cw.Flush() + return cw.Error() +} + +func atStackDepth(depth int, fn func()) { + pcs := make([]uintptr, depth*10) + n := runtime.Callers(1, pcs) + if n > depth { + panic("depth exceeded") + } else if n < depth { + atStackDepth(depth, fn) + return + } + + fn() +} + +func flagIntSlice(name string, value []int, usage string) *[]int { + val := &intSlice{vals: value} + flag.Var(val, name, usage) + return &val.vals +} + +type intSlice struct { + vals []int +} + +func (i *intSlice) Set(val string) error { + var vals []int + for _, val := range strings.Split(val, ",") { + num, err := strconv.Atoi(val) + if err != nil { + return err + } + vals = append(vals, num) + } + i.vals = vals + return nil +} + +func (i *intSlice) String() string { + return fmt.Sprintf("%v", i.vals) +} + +func flagStringSlice(name string, value []string, usage string) *[]string { + val := &strSlice{vals: value} + flag.Var(val, name, usage) + return &val.vals +} + +type strSlice struct { + vals []string +} + +func (s *strSlice) Set(val string) error { + s.vals = strings.Split(val, ",") + return nil +} + +func (s *strSlice) String() string { + return fmt.Sprintf("%v", s.vals) +} diff --git a/bench/run.sh b/bench/run.sh new file mode 100755 index 0000000..66db4db --- /dev/null +++ b/bench/run.sh @@ -0,0 +1,11 @@ +os_arch() { + echo "$(uname | tr '[:upper:]' '[:lower:]')_$(uname -m)" +} + +go run . \ + -workloads mutex,chan \ + -ops 100000 \ + -blockprofilerates 0,1,10,100,1000,10000,100000,1000000 \ + -runs 20 \ + -depths 16 \ + > "block_$(os_arch).csv" diff --git a/bench/workloads.go b/bench/workloads.go new file mode 100644 index 0000000..537e1bd --- /dev/null +++ b/bench/workloads.go @@ -0,0 +1,62 @@ +package main + +import ( + "fmt" + "sync" +) + +func chanWorkload(goroutines, ops, depth int) error { + if goroutines%2 != 0 { + return fmt.Errorf("bad goroutines: %d: must be a multiple of 2", goroutines) + } + + wg := &sync.WaitGroup{} + for j := 0; j < goroutines/2; j++ { + ch := make(chan struct{}) + wg.Add(1) + go atStackDepth(depth, func() { + defer wg.Done() + for i := 0; i < ops; i++ { + ch <- struct{}{} + } + }) + wg.Add(1) + go atStackDepth(depth, func() { + defer wg.Done() + for i := 0; i < ops; i++ { + <-ch + } + }) + } + wg.Wait() + return nil +} + +func mutexWorkload(goroutines, ops, depth int) error { + if goroutines%2 != 0 { + return fmt.Errorf("bad goroutines: %d: must be a multiple of 2", goroutines) + } + + wg := &sync.WaitGroup{} + for j := 0; j < goroutines/2; j++ { + m := &sync.Mutex{} + wg.Add(1) + go atStackDepth(depth, func() { + defer wg.Done() + for i := 0; i < ops; i++ { + m.Lock() + m.Unlock() + } + }) + wg.Add(1) + go atStackDepth(depth, func() { + defer wg.Done() + for i := 0; i < ops; i++ { + m.Lock() + m.Unlock() + } + }) + } + wg.Wait() + return nil +}