Expanding the tee(1) read buffer trivially increases the throughput.
In most applications the writer or the disk will be the bottleneck,
but if tee(1) happens to be the bottleneck then the 8K buffer makes it
worse.
# dd(1) reading /dev/zero and writing to /dev/null
$ for i in $(jot 10); do nanotime sh -c 'dd if=/dev/zero bs=1M count=1K
of=/dev/null 2>/dev/null'; done
0.035807214 real 0.000 user 0.030 sys
0.036279402 real 0.010 user 0.040 sys
0.036196667 real 0.000 user 0.040 sys
0.035979624 real 0.000 user 0.030 sys
0.036513446 real 0.000 user 0.030 sys
0.036176933 real 0.000 user 0.030 sys
0.036383627 real 0.000 user 0.030 sys
0.036215735 real 0.000 user 0.030 sys
0.035991347 real 0.000 user 0.030 sys
0.036099570 real 0.000 user 0.040 sys
# -current tee(1) reading from dd(1) and writing to /dev/null
$ for i in $(jot 10); do dd if=/dev/zero bs=1M count=1K 2>/dev/null | tee
/dev/null > /dev/null; done
0.929502396 real 0.170 user 0.600 sys
0.925658703 real 0.100 user 0.730 sys
0.923554038 real 0.110 user 0.790 sys
0.923980309 real 0.230 user 0.690 sys
0.922291646 real 0.130 user 0.820 sys
0.921232713 real 0.160 user 0.720 sys
0.929562857 real 0.190 user 0.680 sys
0.923999067 real 0.120 user 0.890 sys
0.920840732 real 0.170 user 0.600 sys
0.924050146 real 0.190 user 0.780 sys
# patched tee(1) reading from dd(1) and writing to /dev/null
$ for i in $(jot 10); do dd if=/dev/zero bs=1M count=1K 2>/dev/null | obj/tee
/dev/null > /dev/null; done
0.246457819 real 0.070 user 0.230 sys
0.248351897 real 0.010 user 0.220 sys
0.243846657 real 0.030 user 0.190 sys
0.244346984 real 0.020 user 0.250 sys
0.250024383 real 0.030 user 0.180 sys
0.248144328 real 0.020 user 0.200 sys
0.251639423 real 0.000 user 0.250 sys
0.249440448 real 0.010 user 0.180 sys
0.248700532 real 0.010 user 0.250 sys
0.246617335 real 0.020 user 0.190 sys
ok?
Index: tee.c
===================================================================
RCS file: /cvs/src/usr.bin/tee/tee.c,v
retrieving revision 1.12
diff -u -p -r1.12 tee.c
--- tee.c 11 Jul 2017 13:14:59 -0000 1.12
+++ tee.c 20 Nov 2021 02:32:51 -0000
@@ -30,7 +30,7 @@
* SUCH DAMAGE.
*/
-#include <sys/types.h>
+#include <sys/param.h> /* for MAXBSIZE */
#include <sys/stat.h>
#include <sys/queue.h>
@@ -67,10 +67,10 @@ main(int argc, char *argv[])
{
struct list *p;
int fd;
+ size_t size;
ssize_t n, rval, wval;
- char *bp;
+ char *bp, *buf;
int append, ch, exitval;
- char buf[8192];
if (pledge("stdio wpath cpath", NULL) == -1)
err(1, "pledge");
@@ -110,7 +110,11 @@ main(int argc, char *argv[])
if (pledge("stdio", NULL) == -1)
err(1, "pledge");
- while ((rval = read(STDIN_FILENO, buf, sizeof(buf))) > 0) {
+ size = MAXBSIZE;
+ buf = malloc(size);
+ if (buf == NULL)
+ err(1, NULL);
+ while ((rval = read(STDIN_FILENO, buf, size)) > 0) {
SLIST_FOREACH(p, &head, next) {
n = rval;
bp = buf;
@@ -124,6 +128,7 @@ main(int argc, char *argv[])
} while (n -= wval);
}
}
+ free(buf);
if (rval == -1) {
warn("read");
exitval = 1;