summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2017-06-07 19:45:14 +0200
committerMattias Andrée <maandree@kth.se>2017-06-07 19:45:14 +0200
commit768aa90a002a46b8f71157b909a68f845585416a (patch)
tree64aa384e4b10ac1d565c4e58f5dede8199192e6d
downloadpipes-are-slow-768aa90a002a46b8f71157b909a68f845585416a.tar.gz
pipes-are-slow-768aa90a002a46b8f71157b909a68f845585416a.tar.bz2
pipes-are-slow-768aa90a002a46b8f71157b909a68f845585416a.tar.xz
first commit
Signed-off-by: Mattias Andrée <maandree@kth.se>
-rw-r--r--bench.c107
-rw-r--r--graph.svg1466
-rwxr-xr-xplot45
3 files changed, 1618 insertions, 0 deletions
diff --git a/bench.c b/bench.c
new file mode 100644
index 0000000..8e0f091
--- /dev/null
+++ b/bench.c
@@ -0,0 +1,107 @@
+#define _GNU_SOURCE
+#include <sys/socket.h>
+#include <sys/uio.h>
+#include <sys/wait.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+
+#define N 100000
+
+
+static void
+print_dur(struct timespec *start, struct timespec *end, int nlog, const char *sys)
+{
+ end->tv_sec -= start->tv_sec;
+ if ((end->tv_nsec -= start->tv_nsec) < 0) {
+ end->tv_sec -= 1;
+ end->tv_nsec += 1000000000L;
+ }
+ printf("%-10s 1<<%i %li.%09li\n", sys, nlog, end->tv_sec, end->tv_nsec);
+ fflush(stdout);
+}
+
+
+int
+main(void)
+{
+ char *buf = malloc(1 << 25);
+ int i, nlog;
+ int rw[2];
+ size_t n, p;
+ ssize_t r;
+ struct timespec start, end;
+ struct iovec iov;
+
+ memset(buf, 0, 1 << 25);
+
+ for (nlog = 0; nlog <= 25; nlog++) {
+ n = 1 << nlog;
+
+ socketpair(PF_UNIX, SOCK_STREAM, 0, rw);
+ if (!fork()) {
+ close(rw[1]);
+ while (read(rw[0], buf, n) > 0);
+ exit(0);
+ } else {
+ close(rw[0]);
+ clock_gettime(CLOCK_MONOTONIC, &start);
+ for (i = 0; i < N; i++)
+ for (p = 0; p < n; p += (size_t)r)
+ if ((r = write(rw[1], buf + p, n - p)) < 0)
+ return perror("write <socket>"), 1;
+ close(rw[1]);
+ wait(NULL);
+ clock_gettime(CLOCK_MONOTONIC, &end);
+ print_dur(&start, &end, nlog, "socketpair");
+ }
+
+ pipe(rw);
+ if (!fork()) {
+ close(rw[1]);
+ while (read(rw[0], buf, n) > 0);
+ exit(0);
+ } else {
+ close(rw[0]);
+ clock_gettime(CLOCK_MONOTONIC, &start);
+ for (i = 0; i < N; i++)
+ for (p = 0; p < n; p += (size_t)r)
+ if ((r = write(rw[1], buf + p, n - p)) < 0)
+ return perror("write <pipe>"), 1;
+ close(rw[1]);
+ wait(NULL);
+ clock_gettime(CLOCK_MONOTONIC, &end);
+ print_dur(&start, &end, nlog, "pipe");
+ }
+
+ pipe(rw);
+ if (!fork()) {
+ close(rw[1]);
+ while (read(rw[0], buf, n) > 0);
+ exit(0);
+ } else {
+ close(rw[0]);
+ clock_gettime(CLOCK_MONOTONIC, &start);
+ for (i = 0; i < N; i++) {
+ iov.iov_base = buf;
+ iov.iov_len = n;
+ for (p = 0; p < n; p += (size_t)r) {
+ r = vmsplice(rw[1], &iov, 1, 0);
+ if (r < 0)
+ return perror("vmsplice <pipe>"), 1;
+ iov.iov_base += r;
+ iov.iov_len -= (size_t)r;
+ }
+ }
+ close(rw[1]);
+ wait(NULL);
+ clock_gettime(CLOCK_MONOTONIC, &end);
+ print_dur(&start, &end, nlog, "vmsplice");
+ }
+ }
+ return 0;
+}
diff --git a/graph.svg b/graph.svg
new file mode 100644
index 0000000..28ad698
--- /dev/null
+++ b/graph.svg
@@ -0,0 +1,1466 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Created with matplotlib (http://matplotlib.org/) -->
+<svg height="576pt" version="1.1" viewBox="0 0 432 576" width="432pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <style type="text/css">
+*{stroke-linecap:butt;stroke-linejoin:round;}
+ </style>
+ </defs>
+ <g id="figure_1">
+ <g id="patch_1">
+ <path d="M 0 576
+L 432 576
+L 432 0
+L 0 0
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="axes_1">
+ <g id="patch_2">
+ <path d="M 54 512.64
+L 388.8 512.64
+L 388.8 69.12
+L 54 69.12
+z
+" style="fill:#ffffff;"/>
+ </g>
+ <g id="matplotlib.axis_1">
+ <g id="xtick_1">
+ <g id="line2d_1"/>
+ <g id="line2d_2">
+ <defs>
+ <path d="M 0 0
+L 0 3.5
+" id="mc3da87a56d" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_1">
+ <!-- 0 -->
+ <defs>
+ <path d="M 31.78125 66.40625
+Q 24.171875 66.40625 20.328125 58.90625
+Q 16.5 51.421875 16.5 36.375
+Q 16.5 21.390625 20.328125 13.890625
+Q 24.171875 6.390625 31.78125 6.390625
+Q 39.453125 6.390625 43.28125 13.890625
+Q 47.125 21.390625 47.125 36.375
+Q 47.125 51.421875 43.28125 58.90625
+Q 39.453125 66.40625 31.78125 66.40625
+z
+M 31.78125 74.21875
+Q 44.046875 74.21875 50.515625 64.515625
+Q 56.984375 54.828125 56.984375 36.375
+Q 56.984375 17.96875 50.515625 8.265625
+Q 44.046875 -1.421875 31.78125 -1.421875
+Q 19.53125 -1.421875 13.0625 8.265625
+Q 6.59375 17.96875 6.59375 36.375
+Q 6.59375 54.828125 13.0625 64.515625
+Q 19.53125 74.21875 31.78125 74.21875
+z
+" id="DejaVuSans-30"/>
+ </defs>
+ <g transform="translate(50.81875 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-30"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_2">
+ <g id="line2d_3"/>
+ <g id="line2d_4">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="67.392" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_2">
+ <!-- 1 -->
+ <defs>
+ <path d="M 12.40625 8.296875
+L 28.515625 8.296875
+L 28.515625 63.921875
+L 10.984375 60.40625
+L 10.984375 69.390625
+L 28.421875 72.90625
+L 38.28125 72.90625
+L 38.28125 8.296875
+L 54.390625 8.296875
+L 54.390625 0
+L 12.40625 0
+z
+" id="DejaVuSans-31"/>
+ </defs>
+ <g transform="translate(64.21075 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-31"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_3">
+ <g id="line2d_5"/>
+ <g id="line2d_6">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="80.784" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_3">
+ <!-- 2 -->
+ <defs>
+ <path d="M 19.1875 8.296875
+L 53.609375 8.296875
+L 53.609375 0
+L 7.328125 0
+L 7.328125 8.296875
+Q 12.9375 14.109375 22.625 23.890625
+Q 32.328125 33.6875 34.8125 36.53125
+Q 39.546875 41.84375 41.421875 45.53125
+Q 43.3125 49.21875 43.3125 52.78125
+Q 43.3125 58.59375 39.234375 62.25
+Q 35.15625 65.921875 28.609375 65.921875
+Q 23.96875 65.921875 18.8125 64.3125
+Q 13.671875 62.703125 7.8125 59.421875
+L 7.8125 69.390625
+Q 13.765625 71.78125 18.9375 73
+Q 24.125 74.21875 28.421875 74.21875
+Q 39.75 74.21875 46.484375 68.546875
+Q 53.21875 62.890625 53.21875 53.421875
+Q 53.21875 48.921875 51.53125 44.890625
+Q 49.859375 40.875 45.40625 35.40625
+Q 44.1875 33.984375 37.640625 27.21875
+Q 31.109375 20.453125 19.1875 8.296875
+z
+" id="DejaVuSans-32"/>
+ </defs>
+ <g transform="translate(77.60275 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-32"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_4">
+ <g id="line2d_7"/>
+ <g id="line2d_8">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="94.176" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_4">
+ <!-- 3 -->
+ <defs>
+ <path d="M 40.578125 39.3125
+Q 47.65625 37.796875 51.625 33
+Q 55.609375 28.21875 55.609375 21.1875
+Q 55.609375 10.40625 48.1875 4.484375
+Q 40.765625 -1.421875 27.09375 -1.421875
+Q 22.515625 -1.421875 17.65625 -0.515625
+Q 12.796875 0.390625 7.625 2.203125
+L 7.625 11.71875
+Q 11.71875 9.328125 16.59375 8.109375
+Q 21.484375 6.890625 26.8125 6.890625
+Q 36.078125 6.890625 40.9375 10.546875
+Q 45.796875 14.203125 45.796875 21.1875
+Q 45.796875 27.640625 41.28125 31.265625
+Q 36.765625 34.90625 28.71875 34.90625
+L 20.21875 34.90625
+L 20.21875 43.015625
+L 29.109375 43.015625
+Q 36.375 43.015625 40.234375 45.921875
+Q 44.09375 48.828125 44.09375 54.296875
+Q 44.09375 59.90625 40.109375 62.90625
+Q 36.140625 65.921875 28.71875 65.921875
+Q 24.65625 65.921875 20.015625 65.03125
+Q 15.375 64.15625 9.8125 62.3125
+L 9.8125 71.09375
+Q 15.4375 72.65625 20.34375 73.4375
+Q 25.25 74.21875 29.59375 74.21875
+Q 40.828125 74.21875 47.359375 69.109375
+Q 53.90625 64.015625 53.90625 55.328125
+Q 53.90625 49.265625 50.4375 45.09375
+Q 46.96875 40.921875 40.578125 39.3125
+z
+" id="DejaVuSans-33"/>
+ </defs>
+ <g transform="translate(90.99475 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-33"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_5">
+ <g id="line2d_9"/>
+ <g id="line2d_10">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="107.568" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_5">
+ <!-- 4 -->
+ <defs>
+ <path d="M 37.796875 64.3125
+L 12.890625 25.390625
+L 37.796875 25.390625
+z
+M 35.203125 72.90625
+L 47.609375 72.90625
+L 47.609375 25.390625
+L 58.015625 25.390625
+L 58.015625 17.1875
+L 47.609375 17.1875
+L 47.609375 0
+L 37.796875 0
+L 37.796875 17.1875
+L 4.890625 17.1875
+L 4.890625 26.703125
+z
+" id="DejaVuSans-34"/>
+ </defs>
+ <g transform="translate(104.38675 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-34"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_6">
+ <g id="line2d_11"/>
+ <g id="line2d_12">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="120.96" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_6">
+ <!-- 5 -->
+ <defs>
+ <path d="M 10.796875 72.90625
+L 49.515625 72.90625
+L 49.515625 64.59375
+L 19.828125 64.59375
+L 19.828125 46.734375
+Q 21.96875 47.46875 24.109375 47.828125
+Q 26.265625 48.1875 28.421875 48.1875
+Q 40.625 48.1875 47.75 41.5
+Q 54.890625 34.8125 54.890625 23.390625
+Q 54.890625 11.625 47.5625 5.09375
+Q 40.234375 -1.421875 26.90625 -1.421875
+Q 22.3125 -1.421875 17.546875 -0.640625
+Q 12.796875 0.140625 7.71875 1.703125
+L 7.71875 11.625
+Q 12.109375 9.234375 16.796875 8.0625
+Q 21.484375 6.890625 26.703125 6.890625
+Q 35.15625 6.890625 40.078125 11.328125
+Q 45.015625 15.765625 45.015625 23.390625
+Q 45.015625 31 40.078125 35.4375
+Q 35.15625 39.890625 26.703125 39.890625
+Q 22.75 39.890625 18.8125 39.015625
+Q 14.890625 38.140625 10.796875 36.28125
+z
+" id="DejaVuSans-35"/>
+ </defs>
+ <g transform="translate(117.77875 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-35"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_7">
+ <g id="line2d_13"/>
+ <g id="line2d_14">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="134.352" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_7">
+ <!-- 6 -->
+ <defs>
+ <path d="M 33.015625 40.375
+Q 26.375 40.375 22.484375 35.828125
+Q 18.609375 31.296875 18.609375 23.390625
+Q 18.609375 15.53125 22.484375 10.953125
+Q 26.375 6.390625 33.015625 6.390625
+Q 39.65625 6.390625 43.53125 10.953125
+Q 47.40625 15.53125 47.40625 23.390625
+Q 47.40625 31.296875 43.53125 35.828125
+Q 39.65625 40.375 33.015625 40.375
+z
+M 52.59375 71.296875
+L 52.59375 62.3125
+Q 48.875 64.0625 45.09375 64.984375
+Q 41.3125 65.921875 37.59375 65.921875
+Q 27.828125 65.921875 22.671875 59.328125
+Q 17.53125 52.734375 16.796875 39.40625
+Q 19.671875 43.65625 24.015625 45.921875
+Q 28.375 48.1875 33.59375 48.1875
+Q 44.578125 48.1875 50.953125 41.515625
+Q 57.328125 34.859375 57.328125 23.390625
+Q 57.328125 12.15625 50.6875 5.359375
+Q 44.046875 -1.421875 33.015625 -1.421875
+Q 20.359375 -1.421875 13.671875 8.265625
+Q 6.984375 17.96875 6.984375 36.375
+Q 6.984375 53.65625 15.1875 63.9375
+Q 23.390625 74.21875 37.203125 74.21875
+Q 40.921875 74.21875 44.703125 73.484375
+Q 48.484375 72.75 52.59375 71.296875
+z
+" id="DejaVuSans-36"/>
+ </defs>
+ <g transform="translate(131.17075 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-36"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_8">
+ <g id="line2d_15"/>
+ <g id="line2d_16">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="147.744" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_8">
+ <!-- 7 -->
+ <defs>
+ <path d="M 8.203125 72.90625
+L 55.078125 72.90625
+L 55.078125 68.703125
+L 28.609375 0
+L 18.3125 0
+L 43.21875 64.59375
+L 8.203125 64.59375
+z
+" id="DejaVuSans-37"/>
+ </defs>
+ <g transform="translate(144.56275 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-37"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_9">
+ <g id="line2d_17"/>
+ <g id="line2d_18">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="161.136" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_9">
+ <!-- 8 -->
+ <defs>
+ <path d="M 31.78125 34.625
+Q 24.75 34.625 20.71875 30.859375
+Q 16.703125 27.09375 16.703125 20.515625
+Q 16.703125 13.921875 20.71875 10.15625
+Q 24.75 6.390625 31.78125 6.390625
+Q 38.8125 6.390625 42.859375 10.171875
+Q 46.921875 13.96875 46.921875 20.515625
+Q 46.921875 27.09375 42.890625 30.859375
+Q 38.875 34.625 31.78125 34.625
+z
+M 21.921875 38.8125
+Q 15.578125 40.375 12.03125 44.71875
+Q 8.5 49.078125 8.5 55.328125
+Q 8.5 64.0625 14.71875 69.140625
+Q 20.953125 74.21875 31.78125 74.21875
+Q 42.671875 74.21875 48.875 69.140625
+Q 55.078125 64.0625 55.078125 55.328125
+Q 55.078125 49.078125 51.53125 44.71875
+Q 48 40.375 41.703125 38.8125
+Q 48.828125 37.15625 52.796875 32.3125
+Q 56.78125 27.484375 56.78125 20.515625
+Q 56.78125 9.90625 50.3125 4.234375
+Q 43.84375 -1.421875 31.78125 -1.421875
+Q 19.734375 -1.421875 13.25 4.234375
+Q 6.78125 9.90625 6.78125 20.515625
+Q 6.78125 27.484375 10.78125 32.3125
+Q 14.796875 37.15625 21.921875 38.8125
+z
+M 18.3125 54.390625
+Q 18.3125 48.734375 21.84375 45.5625
+Q 25.390625 42.390625 31.78125 42.390625
+Q 38.140625 42.390625 41.71875 45.5625
+Q 45.3125 48.734375 45.3125 54.390625
+Q 45.3125 60.0625 41.71875 63.234375
+Q 38.140625 66.40625 31.78125 66.40625
+Q 25.390625 66.40625 21.84375 63.234375
+Q 18.3125 60.0625 18.3125 54.390625
+z
+" id="DejaVuSans-38"/>
+ </defs>
+ <g transform="translate(157.95475 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-38"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_10">
+ <g id="line2d_19"/>
+ <g id="line2d_20">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="174.528" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_10">
+ <!-- 9 -->
+ <defs>
+ <path d="M 10.984375 1.515625
+L 10.984375 10.5
+Q 14.703125 8.734375 18.5 7.8125
+Q 22.3125 6.890625 25.984375 6.890625
+Q 35.75 6.890625 40.890625 13.453125
+Q 46.046875 20.015625 46.78125 33.40625
+Q 43.953125 29.203125 39.59375 26.953125
+Q 35.25 24.703125 29.984375 24.703125
+Q 19.046875 24.703125 12.671875 31.3125
+Q 6.296875 37.9375 6.296875 49.421875
+Q 6.296875 60.640625 12.9375 67.421875
+Q 19.578125 74.21875 30.609375 74.21875
+Q 43.265625 74.21875 49.921875 64.515625
+Q 56.59375 54.828125 56.59375 36.375
+Q 56.59375 19.140625 48.40625 8.859375
+Q 40.234375 -1.421875 26.421875 -1.421875
+Q 22.703125 -1.421875 18.890625 -0.6875
+Q 15.09375 0.046875 10.984375 1.515625
+z
+M 30.609375 32.421875
+Q 37.25 32.421875 41.125 36.953125
+Q 45.015625 41.5 45.015625 49.421875
+Q 45.015625 57.28125 41.125 61.84375
+Q 37.25 66.40625 30.609375 66.40625
+Q 23.96875 66.40625 20.09375 61.84375
+Q 16.21875 57.28125 16.21875 49.421875
+Q 16.21875 41.5 20.09375 36.953125
+Q 23.96875 32.421875 30.609375 32.421875
+z
+" id="DejaVuSans-39"/>
+ </defs>
+ <g transform="translate(171.34675 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-39"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_11">
+ <g id="line2d_21"/>
+ <g id="line2d_22">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="187.92" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_11">
+ <!-- 10 -->
+ <g transform="translate(181.5575 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-31"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-30"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_12">
+ <g id="line2d_23"/>
+ <g id="line2d_24">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="201.312" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_12">
+ <!-- 11 -->
+ <g transform="translate(194.9495 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-31"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-31"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_13">
+ <g id="line2d_25"/>
+ <g id="line2d_26">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="214.704" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_13">
+ <!-- 12 -->
+ <g transform="translate(208.3415 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-31"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-32"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_14">
+ <g id="line2d_27"/>
+ <g id="line2d_28">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="228.096" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_14">
+ <!-- 13 -->
+ <g transform="translate(221.7335 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-31"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-33"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_15">
+ <g id="line2d_29"/>
+ <g id="line2d_30">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="241.488" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_15">
+ <!-- 14 -->
+ <g transform="translate(235.1255 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-31"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-34"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_16">
+ <g id="line2d_31"/>
+ <g id="line2d_32">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="254.88" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_16">
+ <!-- 15 -->
+ <g transform="translate(248.5175 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-31"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-35"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_17">
+ <g id="line2d_33"/>
+ <g id="line2d_34">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="268.272" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_17">
+ <!-- 16 -->
+ <g transform="translate(261.9095 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-31"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-36"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_18">
+ <g id="line2d_35"/>
+ <g id="line2d_36">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="281.664" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_18">
+ <!-- 17 -->
+ <g transform="translate(275.3015 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-31"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-37"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_19">
+ <g id="line2d_37"/>
+ <g id="line2d_38">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="295.056" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_19">
+ <!-- 18 -->
+ <g transform="translate(288.6935 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-31"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-38"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_20">
+ <g id="line2d_39"/>
+ <g id="line2d_40">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="308.448" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_20">
+ <!-- 19 -->
+ <g transform="translate(302.0855 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-31"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-39"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_21">
+ <g id="line2d_41"/>
+ <g id="line2d_42">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="321.84" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_21">
+ <!-- 20 -->
+ <g transform="translate(315.4775 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-32"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-30"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_22">
+ <g id="line2d_43"/>
+ <g id="line2d_44">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="335.232" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_22">
+ <!-- 21 -->
+ <g transform="translate(328.8695 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-32"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-31"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_23">
+ <g id="line2d_45"/>
+ <g id="line2d_46">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="348.624" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_23">
+ <!-- 22 -->
+ <g transform="translate(342.2615 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-32"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-32"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_24">
+ <g id="line2d_47"/>
+ <g id="line2d_48">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="362.016" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_24">
+ <!-- 23 -->
+ <g transform="translate(355.6535 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-32"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-33"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_25">
+ <g id="line2d_49"/>
+ <g id="line2d_50">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="375.408" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_25">
+ <!-- 24 -->
+ <g transform="translate(369.0455 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-32"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-34"/>
+ </g>
+ </g>
+ </g>
+ <g id="xtick_26">
+ <g id="line2d_51"/>
+ <g id="line2d_52">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="388.8" xlink:href="#mc3da87a56d" y="512.64"/>
+ </g>
+ </g>
+ <g id="text_26">
+ <!-- 25 -->
+ <g transform="translate(382.4375 527.238438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-32"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-35"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_27">
+ <!-- log₂(n) -->
+ <defs>
+ <path d="M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 0
+L 9.421875 0
+z
+" id="DejaVuSans-6c"/>
+ <path d="M 30.609375 48.390625
+Q 23.390625 48.390625 19.1875 42.75
+Q 14.984375 37.109375 14.984375 27.296875
+Q 14.984375 17.484375 19.15625 11.84375
+Q 23.34375 6.203125 30.609375 6.203125
+Q 37.796875 6.203125 41.984375 11.859375
+Q 46.1875 17.53125 46.1875 27.296875
+Q 46.1875 37.015625 41.984375 42.703125
+Q 37.796875 48.390625 30.609375 48.390625
+z
+M 30.609375 56
+Q 42.328125 56 49.015625 48.375
+Q 55.71875 40.765625 55.71875 27.296875
+Q 55.71875 13.875 49.015625 6.21875
+Q 42.328125 -1.421875 30.609375 -1.421875
+Q 18.84375 -1.421875 12.171875 6.21875
+Q 5.515625 13.875 5.515625 27.296875
+Q 5.515625 40.765625 12.171875 48.375
+Q 18.84375 56 30.609375 56
+z
+" id="DejaVuSans-6f"/>
+ <path d="M 45.40625 27.984375
+Q 45.40625 37.75 41.375 43.109375
+Q 37.359375 48.484375 30.078125 48.484375
+Q 22.859375 48.484375 18.828125 43.109375
+Q 14.796875 37.75 14.796875 27.984375
+Q 14.796875 18.265625 18.828125 12.890625
+Q 22.859375 7.515625 30.078125 7.515625
+Q 37.359375 7.515625 41.375 12.890625
+Q 45.40625 18.265625 45.40625 27.984375
+z
+M 54.390625 6.78125
+Q 54.390625 -7.171875 48.1875 -13.984375
+Q 42 -20.796875 29.203125 -20.796875
+Q 24.46875 -20.796875 20.265625 -20.09375
+Q 16.0625 -19.390625 12.109375 -17.921875
+L 12.109375 -9.1875
+Q 16.0625 -11.328125 19.921875 -12.34375
+Q 23.78125 -13.375 27.78125 -13.375
+Q 36.625 -13.375 41.015625 -8.765625
+Q 45.40625 -4.15625 45.40625 5.171875
+L 45.40625 9.625
+Q 42.625 4.78125 38.28125 2.390625
+Q 33.9375 0 27.875 0
+Q 17.828125 0 11.671875 7.65625
+Q 5.515625 15.328125 5.515625 27.984375
+Q 5.515625 40.671875 11.671875 48.328125
+Q 17.828125 56 27.875 56
+Q 33.9375 56 38.28125 53.609375
+Q 42.625 51.21875 45.40625 46.390625
+L 45.40625 54.6875
+L 54.390625 54.6875
+z
+" id="DejaVuSans-67"/>
+ <path d="M 13.09375 5.1875
+L 33.796875 5.1875
+L 33.796875 -0.375
+L 4.59375 -0.375
+L 4.59375 4.984375
+Q 6.25 6.5 9.328125 9.234375
+Q 26.125 24.125 26.125 28.71875
+Q 26.125 31.9375 23.578125 33.90625
+Q 21.046875 35.890625 16.890625 35.890625
+Q 14.359375 35.890625 11.375 35.03125
+Q 8.40625 34.1875 4.890625 32.484375
+L 4.890625 38.484375
+Q 8.640625 39.859375 11.890625 40.53125
+Q 15.140625 41.21875 17.921875 41.21875
+Q 25 41.21875 29.25 38
+Q 33.5 34.78125 33.5 29.5
+Q 33.5 22.71875 17.328125 8.84375
+Q 14.59375 6.5 13.09375 5.1875
+z
+" id="DejaVuSans-2082"/>
+ <path d="M 31 75.875
+Q 24.46875 64.65625 21.28125 53.65625
+Q 18.109375 42.671875 18.109375 31.390625
+Q 18.109375 20.125 21.3125 9.0625
+Q 24.515625 -2 31 -13.1875
+L 23.1875 -13.1875
+Q 15.875 -1.703125 12.234375 9.375
+Q 8.59375 20.453125 8.59375 31.390625
+Q 8.59375 42.28125 12.203125 53.3125
+Q 15.828125 64.359375 23.1875 75.875
+z
+" id="DejaVuSans-28"/>
+ <path d="M 54.890625 33.015625
+L 54.890625 0
+L 45.90625 0
+L 45.90625 32.71875
+Q 45.90625 40.484375 42.875 44.328125
+Q 39.84375 48.1875 33.796875 48.1875
+Q 26.515625 48.1875 22.3125 43.546875
+Q 18.109375 38.921875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.34375 51.125 25.703125 53.5625
+Q 30.078125 56 35.796875 56
+Q 45.21875 56 50.046875 50.171875
+Q 54.890625 44.34375 54.890625 33.015625
+z
+" id="DejaVuSans-6e"/>
+ <path d="M 8.015625 75.875
+L 15.828125 75.875
+Q 23.140625 64.359375 26.78125 53.3125
+Q 30.421875 42.28125 30.421875 31.390625
+Q 30.421875 20.453125 26.78125 9.375
+Q 23.140625 -1.703125 15.828125 -13.1875
+L 8.015625 -13.1875
+Q 14.5 -2 17.703125 9.0625
+Q 20.90625 20.125 20.90625 31.390625
+Q 20.90625 42.671875 17.703125 53.65625
+Q 14.5 64.65625 8.015625 75.875
+z
+" id="DejaVuSans-29"/>
+ </defs>
+ <g transform="translate(204.702344 540.916563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-6c"/>
+ <use x="27.783203" xlink:href="#DejaVuSans-6f"/>
+ <use x="88.964844" xlink:href="#DejaVuSans-67"/>
+ <use x="152.441406" xlink:href="#DejaVuSans-2082"/>
+ <use x="192.529297" xlink:href="#DejaVuSans-28"/>
+ <use x="231.542969" xlink:href="#DejaVuSans-6e"/>
+ <use x="294.921875" xlink:href="#DejaVuSans-29"/>
+ </g>
+ </g>
+ </g>
+ <g id="matplotlib.axis_2">
+ <g id="ytick_1">
+ <g id="line2d_53">
+ <path clip-path="url(#p20b7add641)" d="M 54 512.657098
+L 388.8 512.657098
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_54">
+ <defs>
+ <path d="M 0 0
+L -3.5 0
+" id="m5c3243ebeb" style="stroke:#000000;stroke-width:0.8;"/>
+ </defs>
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m5c3243ebeb" y="512.657098"/>
+ </g>
+ </g>
+ <g id="text_28">
+ <!-- 0 -->
+ <g transform="translate(40.6375 516.456317)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-30"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_2">
+ <g id="line2d_55">
+ <path clip-path="url(#p20b7add641)" d="M 54 429.812029
+L 388.8 429.812029
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_56">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m5c3243ebeb" y="429.812029"/>
+ </g>
+ </g>
+ <g id="text_29">
+ <!-- 20 -->
+ <g transform="translate(34.275 433.611247)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-32"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-30"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_3">
+ <g id="line2d_57">
+ <path clip-path="url(#p20b7add641)" d="M 54 346.966959
+L 388.8 346.966959
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_58">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m5c3243ebeb" y="346.966959"/>
+ </g>
+ </g>
+ <g id="text_30">
+ <!-- 40 -->
+ <g transform="translate(34.275 350.766178)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-34"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-30"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_4">
+ <g id="line2d_59">
+ <path clip-path="url(#p20b7add641)" d="M 54 264.12189
+L 388.8 264.12189
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_60">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m5c3243ebeb" y="264.12189"/>
+ </g>
+ </g>
+ <g id="text_31">
+ <!-- 60 -->
+ <g transform="translate(34.275 267.921108)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-36"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-30"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_5">
+ <g id="line2d_61">
+ <path clip-path="url(#p20b7add641)" d="M 54 181.27682
+L 388.8 181.27682
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_62">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m5c3243ebeb" y="181.27682"/>
+ </g>
+ </g>
+ <g id="text_32">
+ <!-- 80 -->
+ <g transform="translate(34.275 185.076039)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-38"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-30"/>
+ </g>
+ </g>
+ </g>
+ <g id="ytick_6">
+ <g id="line2d_63">
+ <path clip-path="url(#p20b7add641)" d="M 54 98.431751
+L 388.8 98.431751
+" style="fill:none;stroke:#b0b0b0;stroke-linecap:square;stroke-width:0.8;"/>
+ </g>
+ <g id="line2d_64">
+ <g>
+ <use style="stroke:#000000;stroke-width:0.8;" x="54" xlink:href="#m5c3243ebeb" y="98.431751"/>
+ </g>
+ </g>
+ <g id="text_33">
+ <!-- 100 -->
+ <g transform="translate(27.9125 102.230969)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-31"/>
+ <use x="63.623047" xlink:href="#DejaVuSans-30"/>
+ <use x="127.246094" xlink:href="#DejaVuSans-30"/>
+ </g>
+ </g>
+ </g>
+ <g id="text_34">
+ <!-- millisecond -->
+ <defs>
+ <path d="M 52 44.1875
+Q 55.375 50.25 60.0625 53.125
+Q 64.75 56 71.09375 56
+Q 79.640625 56 84.28125 50.015625
+Q 88.921875 44.046875 88.921875 33.015625
+L 88.921875 0
+L 79.890625 0
+L 79.890625 32.71875
+Q 79.890625 40.578125 77.09375 44.375
+Q 74.3125 48.1875 68.609375 48.1875
+Q 61.625 48.1875 57.5625 43.546875
+Q 53.515625 38.921875 53.515625 30.90625
+L 53.515625 0
+L 44.484375 0
+L 44.484375 32.71875
+Q 44.484375 40.625 41.703125 44.40625
+Q 38.921875 48.1875 33.109375 48.1875
+Q 26.21875 48.1875 22.15625 43.53125
+Q 18.109375 38.875 18.109375 30.90625
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 21.1875 51.21875 25.484375 53.609375
+Q 29.78125 56 35.6875 56
+Q 41.65625 56 45.828125 52.96875
+Q 50 49.953125 52 44.1875
+z
+" id="DejaVuSans-6d"/>
+ <path d="M 9.421875 54.6875
+L 18.40625 54.6875
+L 18.40625 0
+L 9.421875 0
+z
+M 9.421875 75.984375
+L 18.40625 75.984375
+L 18.40625 64.59375
+L 9.421875 64.59375
+z
+" id="DejaVuSans-69"/>
+ <path d="M 44.28125 53.078125
+L 44.28125 44.578125
+Q 40.484375 46.53125 36.375 47.5
+Q 32.28125 48.484375 27.875 48.484375
+Q 21.1875 48.484375 17.84375 46.4375
+Q 14.5 44.390625 14.5 40.28125
+Q 14.5 37.15625 16.890625 35.375
+Q 19.28125 33.59375 26.515625 31.984375
+L 29.59375 31.296875
+Q 39.15625 29.25 43.1875 25.515625
+Q 47.21875 21.78125 47.21875 15.09375
+Q 47.21875 7.46875 41.1875 3.015625
+Q 35.15625 -1.421875 24.609375 -1.421875
+Q 20.21875 -1.421875 15.453125 -0.5625
+Q 10.6875 0.296875 5.421875 2
+L 5.421875 11.28125
+Q 10.40625 8.6875 15.234375 7.390625
+Q 20.0625 6.109375 24.8125 6.109375
+Q 31.15625 6.109375 34.5625 8.28125
+Q 37.984375 10.453125 37.984375 14.40625
+Q 37.984375 18.0625 35.515625 20.015625
+Q 33.0625 21.96875 24.703125 23.78125
+L 21.578125 24.515625
+Q 13.234375 26.265625 9.515625 29.90625
+Q 5.8125 33.546875 5.8125 39.890625
+Q 5.8125 47.609375 11.28125 51.796875
+Q 16.75 56 26.8125 56
+Q 31.78125 56 36.171875 55.265625
+Q 40.578125 54.546875 44.28125 53.078125
+z
+" id="DejaVuSans-73"/>
+ <path d="M 56.203125 29.59375
+L 56.203125 25.203125
+L 14.890625 25.203125
+Q 15.484375 15.921875 20.484375 11.0625
+Q 25.484375 6.203125 34.421875 6.203125
+Q 39.59375 6.203125 44.453125 7.46875
+Q 49.3125 8.734375 54.109375 11.28125
+L 54.109375 2.78125
+Q 49.265625 0.734375 44.1875 -0.34375
+Q 39.109375 -1.421875 33.890625 -1.421875
+Q 20.796875 -1.421875 13.15625 6.1875
+Q 5.515625 13.8125 5.515625 26.8125
+Q 5.515625 40.234375 12.765625 48.109375
+Q 20.015625 56 32.328125 56
+Q 43.359375 56 49.78125 48.890625
+Q 56.203125 41.796875 56.203125 29.59375
+z
+M 47.21875 32.234375
+Q 47.125 39.59375 43.09375 43.984375
+Q 39.0625 48.390625 32.421875 48.390625
+Q 24.90625 48.390625 20.390625 44.140625
+Q 15.875 39.890625 15.1875 32.171875
+z
+" id="DejaVuSans-65"/>
+ <path d="M 48.78125 52.59375
+L 48.78125 44.1875
+Q 44.96875 46.296875 41.140625 47.34375
+Q 37.3125 48.390625 33.40625 48.390625
+Q 24.65625 48.390625 19.8125 42.84375
+Q 14.984375 37.3125 14.984375 27.296875
+Q 14.984375 17.28125 19.8125 11.734375
+Q 24.65625 6.203125 33.40625 6.203125
+Q 37.3125 6.203125 41.140625 7.25
+Q 44.96875 8.296875 48.78125 10.40625
+L 48.78125 2.09375
+Q 45.015625 0.34375 40.984375 -0.53125
+Q 36.96875 -1.421875 32.421875 -1.421875
+Q 20.0625 -1.421875 12.78125 6.34375
+Q 5.515625 14.109375 5.515625 27.296875
+Q 5.515625 40.671875 12.859375 48.328125
+Q 20.21875 56 33.015625 56
+Q 37.15625 56 41.109375 55.140625
+Q 45.0625 54.296875 48.78125 52.59375
+z
+" id="DejaVuSans-63"/>
+ <path d="M 45.40625 46.390625
+L 45.40625 75.984375
+L 54.390625 75.984375
+L 54.390625 0
+L 45.40625 0
+L 45.40625 8.203125
+Q 42.578125 3.328125 38.25 0.953125
+Q 33.9375 -1.421875 27.875 -1.421875
+Q 17.96875 -1.421875 11.734375 6.484375
+Q 5.515625 14.40625 5.515625 27.296875
+Q 5.515625 40.1875 11.734375 48.09375
+Q 17.96875 56 27.875 56
+Q 33.9375 56 38.25 53.625
+Q 42.578125 51.265625 45.40625 46.390625
+z
+M 14.796875 27.296875
+Q 14.796875 17.390625 18.875 11.75
+Q 22.953125 6.109375 30.078125 6.109375
+Q 37.203125 6.109375 41.296875 11.75
+Q 45.40625 17.390625 45.40625 27.296875
+Q 45.40625 37.203125 41.296875 42.84375
+Q 37.203125 48.484375 30.078125 48.484375
+Q 22.953125 48.484375 18.875 42.84375
+Q 14.796875 37.203125 14.796875 27.296875
+z
+" id="DejaVuSans-64"/>
+ </defs>
+ <g transform="translate(21.832812 319.139375)rotate(-90)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-6d"/>
+ <use x="97.412109" xlink:href="#DejaVuSans-69"/>
+ <use x="125.195312" xlink:href="#DejaVuSans-6c"/>
+ <use x="152.978516" xlink:href="#DejaVuSans-6c"/>
+ <use x="180.761719" xlink:href="#DejaVuSans-69"/>
+ <use x="208.544922" xlink:href="#DejaVuSans-73"/>
+ <use x="260.644531" xlink:href="#DejaVuSans-65"/>
+ <use x="322.167969" xlink:href="#DejaVuSans-63"/>
+ <use x="377.148438" xlink:href="#DejaVuSans-6f"/>
+ <use x="438.330078" xlink:href="#DejaVuSans-6e"/>
+ <use x="501.708984" xlink:href="#DejaVuSans-64"/>
+ </g>
+ </g>
+ </g>
+ <g id="line2d_65">
+ <path clip-path="url(#p20b7add641)" d="M 54 512.636174
+L 67.392 512.637555
+L 80.784 512.637654
+L 94.176 512.636452
+L 107.568 512.636831
+L 120.96 512.636582
+L 134.352 512.63635
+L 147.744 512.635845
+L 161.136 512.634965
+L 174.528 512.632554
+L 187.92 512.629545
+L 201.312 512.624619
+L 214.704 512.62207
+L 228.096 512.590937
+L 241.488 512.546024
+L 254.88 512.439256
+L 268.272 512.184839
+L 281.664 511.652082
+L 295.056 510.532396
+L 308.448 508.304804
+L 321.84 503.680338
+L 335.232 493.370631
+L 348.624 468.368197
+L 362.016 406.387842
+L 375.408 304.285207
+L 388.8 90.240814
+" style="fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;"/>
+ </g>
+ <g id="line2d_66">
+ <path clip-path="url(#p20b7add641)" d="M 54 512.637369
+L 67.392 512.638755
+L 80.784 512.640814
+L 94.176 512.639779
+L 107.568 512.640577
+L 120.96 512.639572
+L 134.352 512.639237
+L 147.744 512.640084
+L 161.136 512.639131
+L 174.528 512.638145
+L 187.92 512.636667
+L 201.312 512.635548
+L 214.704 512.630733
+L 228.096 512.622709
+L 241.488 512.602804
+L 254.88 512.570303
+L 268.272 512.48127
+L 281.664 512.325765
+L 295.056 511.958165
+L 308.448 511.267848
+L 321.84 509.826452
+L 335.232 506.89436
+L 348.624 501.175695
+L 362.016 482.993427
+L 375.408 447.88279
+L 388.8 374.945878
+" style="fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:1.5;"/>
+ </g>
+ <g id="line2d_67">
+ <path clip-path="url(#p20b7add641)" d="M 54 512.636036
+L 67.392 512.635764
+L 80.784 512.636341
+L 94.176 512.636092
+L 107.568 512.634615
+L 120.96 512.636236
+L 134.352 512.635295
+L 147.744 512.636757
+L 161.136 512.635219
+L 174.528 512.634319
+L 187.92 512.633889
+L 201.312 512.634754
+L 214.704 512.62863
+L 228.096 512.623024
+L 241.488 512.605921
+L 254.88 512.568886
+L 268.272 512.476936
+L 281.664 512.218539
+L 295.056 511.595373
+L 308.448 510.43728
+L 321.84 508.495996
+L 335.232 503.902956
+L 348.624 491.805498
+L 362.016 448.336371
+L 375.408 376.589326
+L 388.8 217.170614
+" style="fill:none;stroke:#2ca02c;stroke-linecap:square;stroke-width:1.5;"/>
+ </g>
+ <g id="patch_3">
+ <path d="M 54 512.64
+L 54 69.12
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_4">
+ <path d="M 388.8 512.64
+L 388.8 69.12
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_5">
+ <path d="M 54 512.64
+L 388.8 512.64
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="patch_6">
+ <path d="M 54 69.12
+L 388.8 69.12
+" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/>
+ </g>
+ <g id="legend_1">
+ <g id="patch_7">
+ <path d="M 61 121.154375
+L 145.051562 121.154375
+Q 147.051562 121.154375 147.051562 119.154375
+L 147.051562 76.12
+Q 147.051562 74.12 145.051562 74.12
+L 61 74.12
+Q 59 74.12 59 76.12
+L 59 119.154375
+Q 59 121.154375 61 121.154375
+z
+" style="fill:#ffffff;opacity:0.8;stroke:#cccccc;stroke-linejoin:miter;"/>
+ </g>
+ <g id="line2d_68">
+ <path d="M 63 82.218438
+L 83 82.218438
+" style="fill:none;stroke:#1f77b4;stroke-linecap:square;stroke-width:1.5;"/>
+ </g>
+ <g id="line2d_69"/>
+ <g id="text_35">
+ <!-- pipe -->
+ <defs>
+ <path d="M 18.109375 8.203125
+L 18.109375 -20.796875
+L 9.078125 -20.796875
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.390625
+Q 20.953125 51.265625 25.265625 53.625
+Q 29.59375 56 35.59375 56
+Q 45.5625 56 51.78125 48.09375
+Q 58.015625 40.1875 58.015625 27.296875
+Q 58.015625 14.40625 51.78125 6.484375
+Q 45.5625 -1.421875 35.59375 -1.421875
+Q 29.59375 -1.421875 25.265625 0.953125
+Q 20.953125 3.328125 18.109375 8.203125
+z
+M 48.6875 27.296875
+Q 48.6875 37.203125 44.609375 42.84375
+Q 40.53125 48.484375 33.40625 48.484375
+Q 26.265625 48.484375 22.1875 42.84375
+Q 18.109375 37.203125 18.109375 27.296875
+Q 18.109375 17.390625 22.1875 11.75
+Q 26.265625 6.109375 33.40625 6.109375
+Q 40.53125 6.109375 44.609375 11.75
+Q 48.6875 17.390625 48.6875 27.296875
+z
+" id="DejaVuSans-70"/>
+ </defs>
+ <g transform="translate(91 85.718438)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="63.476562" xlink:href="#DejaVuSans-69"/>
+ <use x="91.259766" xlink:href="#DejaVuSans-70"/>
+ <use x="154.736328" xlink:href="#DejaVuSans-65"/>
+ </g>
+ </g>
+ <g id="line2d_70">
+ <path d="M 63 96.896563
+L 83 96.896563
+" style="fill:none;stroke:#ff7f0e;stroke-linecap:square;stroke-width:1.5;"/>
+ </g>
+ <g id="line2d_71"/>
+ <g id="text_36">
+ <!-- socketpair -->
+ <defs>
+ <path d="M 9.078125 75.984375
+L 18.109375 75.984375
+L 18.109375 31.109375
+L 44.921875 54.6875
+L 56.390625 54.6875
+L 27.390625 29.109375
+L 57.625 0
+L 45.90625 0
+L 18.109375 26.703125
+L 18.109375 0
+L 9.078125 0
+z
+" id="DejaVuSans-6b"/>
+ <path d="M 18.3125 70.21875
+L 18.3125 54.6875
+L 36.8125 54.6875
+L 36.8125 47.703125
+L 18.3125 47.703125
+L 18.3125 18.015625
+Q 18.3125 11.328125 20.140625 9.421875
+Q 21.96875 7.515625 27.59375 7.515625
+L 36.8125 7.515625
+L 36.8125 0
+L 27.59375 0
+Q 17.1875 0 13.234375 3.875
+Q 9.28125 7.765625 9.28125 18.015625
+L 9.28125 47.703125
+L 2.6875 47.703125
+L 2.6875 54.6875
+L 9.28125 54.6875
+L 9.28125 70.21875
+z
+" id="DejaVuSans-74"/>
+ <path d="M 34.28125 27.484375
+Q 23.390625 27.484375 19.1875 25
+Q 14.984375 22.515625 14.984375 16.5
+Q 14.984375 11.71875 18.140625 8.90625
+Q 21.296875 6.109375 26.703125 6.109375
+Q 34.1875 6.109375 38.703125 11.40625
+Q 43.21875 16.703125 43.21875 25.484375
+L 43.21875 27.484375
+z
+M 52.203125 31.203125
+L 52.203125 0
+L 43.21875 0
+L 43.21875 8.296875
+Q 40.140625 3.328125 35.546875 0.953125
+Q 30.953125 -1.421875 24.3125 -1.421875
+Q 15.921875 -1.421875 10.953125 3.296875
+Q 6 8.015625 6 15.921875
+Q 6 25.140625 12.171875 29.828125
+Q 18.359375 34.515625 30.609375 34.515625
+L 43.21875 34.515625
+L 43.21875 35.40625
+Q 43.21875 41.609375 39.140625 45
+Q 35.0625 48.390625 27.6875 48.390625
+Q 23 48.390625 18.546875 47.265625
+Q 14.109375 46.140625 10.015625 43.890625
+L 10.015625 52.203125
+Q 14.9375 54.109375 19.578125 55.046875
+Q 24.21875 56 28.609375 56
+Q 40.484375 56 46.34375 49.84375
+Q 52.203125 43.703125 52.203125 31.203125
+z
+" id="DejaVuSans-61"/>
+ <path d="M 41.109375 46.296875
+Q 39.59375 47.171875 37.8125 47.578125
+Q 36.03125 48 33.890625 48
+Q 26.265625 48 22.1875 43.046875
+Q 18.109375 38.09375 18.109375 28.8125
+L 18.109375 0
+L 9.078125 0
+L 9.078125 54.6875
+L 18.109375 54.6875
+L 18.109375 46.1875
+Q 20.953125 51.171875 25.484375 53.578125
+Q 30.03125 56 36.53125 56
+Q 37.453125 56 38.578125 55.875
+Q 39.703125 55.765625 41.0625 55.515625
+z
+" id="DejaVuSans-72"/>
+ </defs>
+ <g transform="translate(91 100.396563)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-73"/>
+ <use x="52.099609" xlink:href="#DejaVuSans-6f"/>
+ <use x="113.28125" xlink:href="#DejaVuSans-63"/>
+ <use x="168.261719" xlink:href="#DejaVuSans-6b"/>
+ <use x="226.125" xlink:href="#DejaVuSans-65"/>
+ <use x="287.648438" xlink:href="#DejaVuSans-74"/>
+ <use x="326.857422" xlink:href="#DejaVuSans-70"/>
+ <use x="390.333984" xlink:href="#DejaVuSans-61"/>
+ <use x="451.613281" xlink:href="#DejaVuSans-69"/>
+ <use x="479.396484" xlink:href="#DejaVuSans-72"/>
+ </g>
+ </g>
+ <g id="line2d_72">
+ <path d="M 63 111.574688
+L 83 111.574688
+" style="fill:none;stroke:#2ca02c;stroke-linecap:square;stroke-width:1.5;"/>
+ </g>
+ <g id="line2d_73"/>
+ <g id="text_37">
+ <!-- vmsplice -->
+ <defs>
+ <path d="M 2.984375 54.6875
+L 12.5 54.6875
+L 29.59375 8.796875
+L 46.6875 54.6875
+L 56.203125 54.6875
+L 35.6875 0
+L 23.484375 0
+z
+" id="DejaVuSans-76"/>
+ </defs>
+ <g transform="translate(91 115.074688)scale(0.1 -0.1)">
+ <use xlink:href="#DejaVuSans-76"/>
+ <use x="59.179688" xlink:href="#DejaVuSans-6d"/>
+ <use x="156.591797" xlink:href="#DejaVuSans-73"/>
+ <use x="208.691406" xlink:href="#DejaVuSans-70"/>
+ <use x="272.167969" xlink:href="#DejaVuSans-6c"/>
+ <use x="299.951172" xlink:href="#DejaVuSans-69"/>
+ <use x="327.734375" xlink:href="#DejaVuSans-63"/>
+ <use x="382.714844" xlink:href="#DejaVuSans-65"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g id="text_38">
+ <!-- pipe(7) versus unix(7) -->
+ <defs>
+ <path id="DejaVuSans-20"/>
+ <path d="M 8.5 21.578125
+L 8.5 54.6875
+L 17.484375 54.6875
+L 17.484375 21.921875
+Q 17.484375 14.15625 20.5 10.265625
+Q 23.53125 6.390625 29.59375 6.390625
+Q 36.859375 6.390625 41.078125 11.03125
+Q 45.3125 15.671875 45.3125 23.6875
+L 45.3125 54.6875
+L 54.296875 54.6875
+L 54.296875 0
+L 45.3125 0
+L 45.3125 8.40625
+Q 42.046875 3.421875 37.71875 1
+Q 33.40625 -1.421875 27.6875 -1.421875
+Q 18.265625 -1.421875 13.375 4.4375
+Q 8.5 10.296875 8.5 21.578125
+z
+M 31.109375 56
+z
+" id="DejaVuSans-75"/>
+ <path d="M 54.890625 54.6875
+L 35.109375 28.078125
+L 55.90625 0
+L 45.3125 0
+L 29.390625 21.484375
+L 13.484375 0
+L 2.875 0
+L 24.125 28.609375
+L 4.6875 54.6875
+L 15.28125 54.6875
+L 29.78125 35.203125
+L 44.28125 54.6875
+z
+" id="DejaVuSans-78"/>
+ </defs>
+ <g transform="translate(149.624063 20.638125)scale(0.12 -0.12)">
+ <use xlink:href="#DejaVuSans-70"/>
+ <use x="63.476562" xlink:href="#DejaVuSans-69"/>
+ <use x="91.259766" xlink:href="#DejaVuSans-70"/>
+ <use x="154.736328" xlink:href="#DejaVuSans-65"/>
+ <use x="216.259766" xlink:href="#DejaVuSans-28"/>
+ <use x="255.273438" xlink:href="#DejaVuSans-37"/>
+ <use x="318.896484" xlink:href="#DejaVuSans-29"/>
+ <use x="357.910156" xlink:href="#DejaVuSans-20"/>
+ <use x="389.697266" xlink:href="#DejaVuSans-76"/>
+ <use x="448.876953" xlink:href="#DejaVuSans-65"/>
+ <use x="510.400391" xlink:href="#DejaVuSans-72"/>
+ <use x="551.513672" xlink:href="#DejaVuSans-73"/>
+ <use x="603.613281" xlink:href="#DejaVuSans-75"/>
+ <use x="666.992188" xlink:href="#DejaVuSans-73"/>
+ <use x="719.091797" xlink:href="#DejaVuSans-20"/>
+ <use x="750.878906" xlink:href="#DejaVuSans-75"/>
+ <use x="814.257812" xlink:href="#DejaVuSans-6e"/>
+ <use x="877.636719" xlink:href="#DejaVuSans-69"/>
+ <use x="905.419922" xlink:href="#DejaVuSans-78"/>
+ <use x="964.599609" xlink:href="#DejaVuSans-28"/>
+ <use x="1003.613281" xlink:href="#DejaVuSans-37"/>
+ <use x="1067.236328" xlink:href="#DejaVuSans-29"/>
+ </g>
+ </g>
+ </g>
+ <defs>
+ <clipPath id="p20b7add641">
+ <rect height="443.52" width="334.8" x="54" y="69.12"/>
+ </clipPath>
+ </defs>
+</svg>
diff --git a/plot b/plot
new file mode 100755
index 0000000..97bf34c
--- /dev/null
+++ b/plot
@@ -0,0 +1,45 @@
+#!/usr/bin/env python3
+
+import sys, math
+import matplotlib.pyplot as plot
+
+#plot.xkcd()
+fig = plot.figure(figsize = (3 * 2, 4 * 2))
+data = sys.stdin.read().split('\n')
+
+graphs = {}
+points = set()
+values = set()
+
+for line in data:
+ if line == '':
+ continue
+ while ' ' in line:
+ line = line.replace(' ', ' ')
+ [label, point, time] = line.split(' ')
+ [_, point] = point.split('<<')
+ point = int(point)
+ time = float(time) / 10
+ if label not in graphs:
+ graphs[label] = {}
+ graphs[label][point] = time
+ points.add(point)
+ values.add(time)
+
+points = sorted(list(points))
+values = sorted(list(values))
+
+for label in sorted(graphs.keys()):
+ graph_values = list(map(lambda x : x[1], sorted(graphs[label].items(), key = lambda x : x[0])))
+ plot.plot(points, graph_values, label = label)
+
+plot.xticks(points, map(str, points))
+fig.suptitle('pipe(7) versus unix(7)')
+plot.ylabel('millisecond')
+plot.xlabel('log₂(n)')
+plot.grid(axis = 'x', linestyle = ' ')
+plot.legend(loc = 'upper left')
+plot.xlim((min(points), max(points)))
+plot.ylim((min(values) * 1.05, max(values) * 1.05))
+plot.grid(True)
+plot.savefig('graph.svg', transparent = False, format = 'svg')