Xref: utzoo comp.sys.att:11004 unix-pc.general:6632 Path: utzoo!utgpu!watserv1!watmath!uunet!tellab5!linac!att!cbnews!res From: res@cbnews.att.com (Robert E. Stampfli) Newsgroups: comp.sys.att,unix-pc.general Subject: Re: Are 3B1 "pipes" really slower than molasses? Summary: Pipe speed on 3b1 Message-ID: <1990Nov30.173747.11069@cbnews.att.com> Date: 30 Nov 90 17:37:47 GMT References: <36256@cup.portal.com> <36310@cup.portal.com> Organization: AT&T Bell Laboratories Lines: 323 Here are some hacked up versions of Thad's send/recv pipe tester programs which yield results an order of magnitude faster than his. As Shakespeare would put it, "The fault, Dear Thaddeus, lies not in pipes, but in stdio..." Rob Stampfli att!cbnews!res ========================================================================== #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create: # Makefile # myrecv.c # mysend.c # mytest.sh # pass.c # recv.c # send.c # test.sh # This archive created: Fri Nov 30 12:18:52 1990 export PATH; PATH=/bin:/usr/bin:$PATH echo shar: "extracting 'Makefile'" '(169 characters)' if test -f 'Makefile' then echo shar: "will not over-write existing file 'Makefile'" else sed 's/^ X//' << \SHAR_EOF > 'Makefile' X X# 3B1 makefile for pipe speed testing X# XCC = gcc -shlib -s XCFLAGS = -O X Xall : mysend myrecv send recv pass X Xclean : X rm -f *.o mysend myrecv send recv pass core a.out SHAR_EOF if test 169 -ne "`wc -c < 'Makefile'`" then echo shar: "error transmitting 'Makefile'" '(should have been 169 characters)' fi fi echo shar: "extracting 'myrecv.c'" '(1025 characters)' if test -f 'myrecv.c' then echo shar: "will not over-write existing file 'myrecv.c'" else sed 's/^ X//' << \SHAR_EOF > 'myrecv.c' X/* recv.c X * X * just receives chars from stdin until EOF for testing the speed X * of pipes on the system. X * X * Thad Floryan, 26-Nov-1990 X * rewritten without stdio, Rob Stampfli 30-Nov-1990 X */ X X#include X#include /* for def of HZ */ X#include X#include X Xmain(argc) X{ X extern long times(); X X static char buffer[BUFSIZ*5]; X register int i; X long startime, endtime, elapsed; X struct tms timebuf; X long numchrs = 0; X X startime = times(&timebuf); /* get start time in HZ units */ X X while ( (i = read(0, buffer, BUFSIZ*5)) > 0 ) { X if(argc > 1) X printf("%d ", i); X numchrs += i; X } X X if(argc > 1) X printf("\n"); X X endtime = times(&timebuf); /* get completion time in HZ units */ X X if ( (elapsed = endtime - startime) != 0L ) X { X printf("%d characters received in %d.%03d seconds for %d CPS\n", X numchrs, X elapsed / HZ, X ((elapsed % HZ) * 1000L) / HZ, X ((numchrs * HZ) / elapsed )); X } X else X { X printf("Insufficient timer resolution for supplied input\n"); X } X} SHAR_EOF if test 1025 -ne "`wc -c < 'myrecv.c'`" then echo shar: "error transmitting 'myrecv.c'" '(should have been 1025 characters)' fi fi echo shar: "extracting 'mysend.c'" '(595 characters)' if test -f 'mysend.c' then echo shar: "will not over-write existing file 'mysend.c'" else sed 's/^ X//' << \SHAR_EOF > 'mysend.c' X/* send.c X * X * just sends argv[1] number of characters out for testing the speed X * of pipes on the system. X * X * Thad Floryan, 26-Nov-1990 X * rewritten without stdio, Rob Stampfli 30-Nov-1990 X */ X X#include X Xmain(argc, argv) X int argc; X char *argv[]; X{ X static char buffer[BUFSIZ]; X register int i; X long numchrs; X X numchrs = atol(argv[1]); /* dismiss error checks for now */ X X /* while ( --numchrs >= 0L ) putchar('X'); */ X X for(i = 0; i < BUFSIZ; i++) X buffer[i] = 'X'; X X while ( numchrs > 0L) { X write(1, buffer, (numchrs > BUFSIZ ? BUFSIZ : numchrs)); X numchrs -= BUFSIZ; X } X} SHAR_EOF if test 595 -ne "`wc -c < 'mysend.c'`" then echo shar: "error transmitting 'mysend.c'" '(should have been 595 characters)' fi fi echo shar: "extracting 'mytest.sh'" '(482 characters)' if test -f 'mytest.sh' then echo shar: "will not over-write existing file 'mytest.sh'" else sed 's/^ X//' << \SHAR_EOF > 'mytest.sh' Xecho "\nmysend | myrecv\n" X./mysend 100000 | ./myrecv X./mysend 200000 | ./myrecv X./mysend 300000 | ./myrecv X./mysend 400000 | ./myrecv X./mysend 500000 | ./myrecv X./mysend 1000000 | ./myrecv Xecho "\nmysend | dd bs=5k | myrecv\n" X./mysend 100000 | dd bs=5k | ./myrecv X./mysend 200000 | dd bs=5k | ./myrecv X./mysend 300000 | dd bs=5k | ./myrecv X./mysend 400000 | dd bs=5k | ./myrecv X./mysend 500000 | dd bs=5k | ./myrecv X./mysend 1000000 | dd bs=5k | ./myrecv SHAR_EOF if test 482 -ne "`wc -c < 'mytest.sh'`" then echo shar: "error transmitting 'mytest.sh'" '(should have been 482 characters)' fi chmod +x 'mytest.sh' fi echo shar: "extracting 'pass.c'" '(247 characters)' if test -f 'pass.c' then echo shar: "will not over-write existing file 'pass.c'" else sed 's/^ X//' << \SHAR_EOF > 'pass.c' X/* pass.c X * X * just passes/handoffs chars from stdin to stdout until EOF for testing X * the speed of pipes on the system. X * X * Thad Floryan, 26-Nov-1990 X */ X X#include X Xmain() X{ X int c; X X while ( (c = getchar()) != EOF ) putchar(c); X X} SHAR_EOF if test 247 -ne "`wc -c < 'pass.c'`" then echo shar: "error transmitting 'pass.c'" '(should have been 247 characters)' fi fi echo shar: "extracting 'recv.c'" '(824 characters)' if test -f 'recv.c' then echo shar: "will not over-write existing file 'recv.c'" else sed 's/^ X//' << \SHAR_EOF > 'recv.c' X/* recv.c X * X * just receives chars from stdin until EOF for testing the speed X * of pipes on the system. X * X * Thad Floryan, 26-Nov-1990 X */ X X#include X#include /* for def of HZ */ X#include X#include X Xmain() X{ X extern long times(); X X long startime, endtime, elapsed; X struct tms timebuf; X long numchrs = 0; X X startime = times(&timebuf); /* get start time in HZ units */ X X while ( getchar() != EOF ) ++numchrs; X X endtime = times(&timebuf); /* get completion time in HZ units */ X X if ( (elapsed = endtime - startime) != 0L ) X { X printf("%d characters received in %d.%03d seconds for %d CPS\n", X numchrs, X elapsed / HZ, X ((elapsed % HZ) * 1000L) / HZ, X ((numchrs * HZ) / elapsed )); X } X else X { X printf("Insufficient timer resolution for supplied input\n"); X } X} SHAR_EOF if test 824 -ne "`wc -c < 'recv.c'`" then echo shar: "error transmitting 'recv.c'" '(should have been 824 characters)' fi fi echo shar: "extracting 'send.c'" '(332 characters)' if test -f 'send.c' then echo shar: "will not over-write existing file 'send.c'" else sed 's/^ X//' << \SHAR_EOF > 'send.c' X/* send.c X * X * just sends argv[1] number of characters out for testing the speed X * of pipes on the system. X * X * Thad Floryan, 26-Nov-1990 X */ X X#include X Xmain(argc, argv) X int argc; X char *argv[]; X{ X long numchrs; X X numchrs = atol(argv[1]); /* dismiss error checks for now */ X X while ( --numchrs >= 0L ) putchar('X'); X} SHAR_EOF if test 332 -ne "`wc -c < 'send.c'`" then echo shar: "error transmitting 'send.c'" '(should have been 332 characters)' fi fi echo shar: "extracting 'test.sh'" '(411 characters)' if test -f 'test.sh' then echo shar: "will not over-write existing file 'test.sh'" else sed 's/^ X//' << \SHAR_EOF > 'test.sh' Xecho "\nsend | recv\n" X./send 100000 | ./recv X./send 200000 | ./recv X./send 300000 | ./recv X./send 400000 | ./recv X./send 500000 | ./recv X./send 1000000 | ./recv Xecho "\nsend | pass | recv\n" X./send 100000 | ./pass | ./recv X./send 200000 | ./pass | ./recv X./send 300000 | ./pass | ./recv X./send 400000 | ./pass | ./recv X./send 500000 | ./pass | ./recv X./send 1000000 | ./pass | ./recv SHAR_EOF if test 411 -ne "`wc -c < 'test.sh'`" then echo shar: "error transmitting 'test.sh'" '(should have been 411 characters)' fi chmod +x 'test.sh' fi exit 0 # End of shell archive -- Rob Stampfli / att.com!stampfli (uucp@work) / kd8wk@w8cqk (packet radio) 614-864-9377 / osu-cis.cis.ohio-state.edu!kd8wk!res (uucp@home)