code for rn speedup by buffering
David Sherman
dave at lsuc.UUCP
Sun Mar 17 23:57:16 AEST 1985
Since I've had a large number of requests, I'm posting the
code to speed up rn by buffering output. Buffering is basically
done at every \n during article output, and at the end of every
printf. In other places I've added fflush'es where appropriate.
The changes below do the following:
- redefine printf and fputs to versions which fflush (Dprintf, Dfputs)
- setbuf on stdout in main()
- redefine putchar to call fflush, and change instances
of putchar where flushing isn't needed to putc on stdout
********** WARNING *************
The implementation of Dprintf is not portable to all machines.
You will have to check that it works. A simple test is the program
#include <stdio.h>
main()
{
try("testing %d %d %d... %s!\n", 1, 2, 3, "it works");
}
try(str, a,b,c,d,e,f,g,h,i,j,k,l,m)
register char *str;
{
printf(str, a,b,c,d,e,f,g,h,i,j,k,l,m);
}
If this doesn't work (it should work on all PDP-11s and VAXen,
and definitely works on Perkin-Elmers), then you'll need to add
fflush'es after many printf calls and remove the Dprintf stuff.
*********************************
Also, if you don't really want to implement the putchar->putc
changes all over the place, you can just do the ones in art.c
which involve spitting out the article itself. That's where
the speedup is most important, since most of the volume rn
produces is the text of articles.
Now, here goes with diff -c output. The files which have changed
are common.h, term.c, art.c, rn.c and Makefile. There is also a new file,
speedup.c, which appears first (IF YOU ARE RUNNING THIS THROUGH PATCH,
IT WILL NOT CATCH THIS!).
----------- speedup.c ----------------
#include <stdio.h>
/*
* code to speed up output of rn by buffering it
*
* David Sherman, lsuc!dave, February 1985
*
* Basic approach: setbuf on stdout; change all calls
* to printf etc. to call this version, then fflush;
* add fflush'es where appropriate after putchars.
*/
Dprintf(str, a,b,c,d,e,f,g,h,i,j,k,l,m)
register char *str;
register a,b,c,d,e,f,g,h,i,j,k,l,m;
{
#undef printf /* since it's compiled with -Dprintf=Dprintf */
printf(str, a,b,c,d,e,f,g,h,i,j,k,l,m);
fflush(stdout);
}
Dfputs(str, where)
register char *str;
register FILE *where;
{
#undef fputs
fputs(str, where);
fflush(where);
}
------------ end of speedup.c ----------------
---------------------------------------------
diff -c ./Makefile old/Makefile
*** ./Makefile Sun Mar 17 08:04:35 1985
--- old/Makefile Sun Mar 17 08:06:39 1985
***************
*** 23,29
rnbin = /usr/bin
rnlib = /usr/lib/news/rn
mansrc = /usr/man/man1
- # additions for speedup added by David Sherman, Feb 1985
CFLAGS = -O -m -DNO_SCCS_ID
LDFLAGS = -k 12k -n
--- 23,28 -----
rnbin = /usr/bin
rnlib = /usr/lib/news/rn
mansrc = /usr/man/man1
CFLAGS = -O -m -DNO_SCCS_ID
LDFLAGS = -k 12k -n
***************
*** 42,48
c1 = addng.c art.c artio.c artsrch.c backpage.c bits.c cheat.c
c2 = final.c head.c help.c init.c intrp.c kfile.c last.c ndir.c ng.c
c3 = ngdata.c ngsrch.c ngstuff.c only.c rcln.c rcstuff.c
! c4 = respond.c rn.c search.c sw.c term.c util.c sysname.c speedup.c
c = $(c1) $(c2) $(c3) $(c4)
--- 41,47 -----
c1 = addng.c art.c artio.c artsrch.c backpage.c bits.c cheat.c
c2 = final.c head.c help.c init.c intrp.c kfile.c last.c ndir.c ng.c
c3 = ngdata.c ngsrch.c ngstuff.c only.c rcln.c rcstuff.c
! c4 = respond.c rn.c search.c sw.c term.c util.c sysname.c
c = $(c1) $(c2) $(c3) $(c4)
***************
*** 49,55
obj1 = addng.o art.o artio.o artsrch.o backpage.o bits.o cheat.o
obj2 = final.o head.o help.o init.o intrp.o kfile.o last.o ndir.o ng.o
obj3 = ngdata.o ngsrch.o ngstuff.o only.o rcln.o rcstuff.o
! obj4 = respond.o rn.o search.o sw.o term.o util.o sysname.o speedup.o
obj = $(obj1) $(obj2) $(obj3) $(obj4)
--- 48,54 -----
obj1 = addng.o art.o artio.o artsrch.o backpage.o bits.o cheat.o
obj2 = final.o head.o help.o init.o intrp.o kfile.o last.o ndir.o ng.o
obj3 = ngdata.o ngsrch.o ngstuff.o only.o rcln.o rcstuff.o
! obj4 = respond.o rn.o search.o sw.o term.o util.o sysname.o
obj = $(obj1) $(obj2) $(obj3) $(obj4)
diff -c ./art.c old/art.c
*** ./art.c Sun Mar 17 08:04:32 1985
--- old/art.c Sun Mar 17 08:06:42 1985
***************
*** 139,145
printf(" (%ld more",(long)i);
if (dmcount)
printf(" + %ld Marked to return)",(long)dmcount);
! putc(')', stdout);
}
#else
if (i)
--- 139,145 -----
printf(" (%ld more",(long)i);
if (dmcount)
printf(" + %ld Marked to return)",(long)dmcount);
! putchar(')');
}
#else
if (i)
***************
*** 164,170
linenum<(firstpage?initlines:(special?slines:LINES)) );
linenum++) { /* for each line on page */
if (int_count) { /* exit via interrupt? */
! putc('\n', stdout); /* get to left margin */
int_count = 0; /* reset interrupt count */
return DA_NORM; /* skip out of loops */
}
--- 164,170 -----
linenum<(firstpage?initlines:(special?slines:LINES)) );
linenum++) { /* for each line on page */
if (int_count) { /* exit via interrupt? */
! putchar('\n'); /* get to left margin */
int_count = 0; /* reset interrupt count */
return DA_NORM; /* skip out of loops */
}
***************
*** 236,242
if (!UG)
putchar(' ');
underprint(s); /* print subject underlined */
! putc('\n', stdout); /* and finish the line */
}
else if (hide_this_line) { /* do not print line? */
linenum--; /* compensate for linenum++ */
--- 236,242 -----
if (!UG)
putchar(' ');
underprint(s); /* print subject underlined */
! putchar('\n'); /* and finish the line */
}
else if (hide_this_line) { /* do not print line? */
linenum--; /* compensate for linenum++ */
***************
*** 260,266
underline();
}
if (*bufptr == '\n')
! putc(' ', stdout);
}
#ifdef INNERSEARCH
outputok = !hide_everything;
--- 260,266 -----
underline();
}
if (*bufptr == '\n')
! putchar(' ');
}
#ifdef INNERSEARCH
outputok = !hide_everything;
***************
*** 310,319
if (rotate && !in_header
&& isalpha(*bufptr)) {
if ((*bufptr & 31) <= 13)
! putc(*bufptr+13, stdout);
! else {
! putc(*bufptr-13, stdout);
! }
}
else
#endif
--- 310,318 -----
if (rotate && !in_header
&& isalpha(*bufptr)) {
if ((*bufptr & 31) <= 13)
! putchar(*bufptr+13);
! else
! putchar(*bufptr-13);
}
else
#endif
***************
*** 317,323
}
else
#endif
! putc(*bufptr, stdout);
}
if (*UC && ((highlight==artline && marking == 1)
#ifdef ULSMARTS
--- 316,322 -----
}
else
#endif
! putchar(*bufptr);
}
if (*UC && ((highlight==artline && marking == 1)
#ifdef ULSMARTS
***************
*** 350,356
if (outputok)
#endif
putchar('\n');
- fflush(stdout); /* flush at end of line - DS */
restart = 0;
outpos = 1000; /* signal normal \n */
}
--- 349,354 -----
if (outputok)
#endif
putchar('\n');
restart = 0;
outpos = 1000; /* signal normal \n */
}
***************
*** 358,364
#ifdef INNERSEARCH
if (outputok)
#endif
! putc(*bufptr, stdout);
bufptr++;
outpos += 8 - outpos % 8;
}
--- 356,362 -----
#ifdef INNERSEARCH
if (outputok)
#endif
! putchar(*bufptr);
bufptr++;
outpos += 8 - outpos % 8;
}
***************
*** 378,384
if (outputok)
#endif
{
! putc('^', stdout);
if (highlight == artline && *UC && marking == 1) {
backspace();
underchar();
--- 376,382 -----
if (outputok)
#endif
{
! putchar('^');
if (highlight == artline && *UC && marking == 1) {
backspace();
underchar();
***************
*** 382,388
if (highlight == artline && *UC && marking == 1) {
backspace();
underchar();
! putc(*bufptr+64, stdout);
backspace();
underchar();
}
--- 380,386 -----
if (highlight == artline && *UC && marking == 1) {
backspace();
underchar();
! putchar(*bufptr+64);
backspace();
underchar();
}
***************
*** 387,393
underchar();
}
else
! putc(*bufptr+64, stdout);
}
bufptr++;
outpos += 2;
--- 385,391 -----
underchar();
}
else
! putchar(*bufptr+64);
}
bufptr++;
outpos += 2;
diff -c ./common.h old/common.h
*** ./common.h Sun Mar 17 08:17:09 1985
--- old/common.h Sun Mar 17 08:17:17 1985
***************
*** 1,9
- /*
-
- This comment intentionally left justified (groan).
-
- */
- /* MSB01 - generate rnhead temp file in /tmp */
#include "config.h" /* generated by installation script */
#ifdef WHOAMI
# include <whoami.h>
--- 1,3 -----
#include "config.h" /* generated by installation script */
#ifdef WHOAMI
# include <whoami.h>
***************
*** 10,23
#endif
#include <stdio.h>
-
- /* DMS01 - Feb 1985 - buffering for speedup */
- #define printf Dprintf
- #define fputs Dfputs
- #undef putchar /* replace the one define by stdio.h above */
- #define putchar(x) putc(x,stdout),fflush(stdout)
- /* end DMS01 Feb 1985 speedup improvement */
-
#include <sys/types.h>
#include <sys/stat.h>
#include <ctype.h>
--- 4,9 -----
#endif
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <ctype.h>
***************
*** 411,418
/* file to pass header to followup article poster */
#ifndef HEADNAME /* % and ~ */
! /* MSB01: formerly # define HEADNAME "~/.rnhead" */
! # define HEADNAME "/tmp/rnhead.%$"
#endif
#ifndef MAKEDIR
--- 397,404 -----
/* file to pass header to followup article poster */
#ifndef HEADNAME /* % and ~ */
! # define HEADNAME "~/.rnhead"
! /* or alternately #define HEADNAME "/tmp/rnhead.%$" */
#endif
#ifndef MAKEDIR
Only in .: old
diff -c ./rn.c old/rn.c
*** ./rn.c Sun Mar 17 08:04:33 1985
--- old/rn.c Sun Mar 17 08:06:45 1985
***************
*** 51,57
;
}
- char BUFstdout[BUFSIZ];
void
main(argc,argv)
int argc;
--- 51,56 -----
;
}
void
main(argc,argv)
int argc;
***************
*** 60,67
bool foundany = initialize(argc,argv);
register char *s;
- /* David Sherman, Feb 1985: buffer stdout */
- setbuf(stdout, BUFstdout);
if (maxngtodo)
starthere = 0;
else if (!foundany) { /* nothing to do? */
--- 59,64 -----
bool foundany = initialize(argc,argv);
register char *s;
if (maxngtodo)
starthere = 0;
else if (!foundany) { /* nothing to do? */
Only in .: speedup.c
diff -c ./term.c old/term.c
*** ./term.c Sun Mar 17 08:04:32 1985
--- old/term.c Sun Mar 17 08:06:47 1985
***************
*** 174,180
putchr(ch)
register char ch;
{
! putc(ch,stdout); /* generates fflush(stdout) automatically - DMS */
}
/* input the 2nd and succeeding characters of a multi-character command */
--- 174,180 -----
putchr(ch)
register char ch;
{
! putchar(ch);
}
/* input the 2nd and succeeding characters of a multi-character command */
***************
*** 192,199
do {
top:
if (*s < ' ') {
! putc('^', stdout);
! putc(*s | 64, stdout);
}
else
putc(*s, stdout); /* echo previous character */
--- 192,199 -----
do {
top:
if (*s < ' ') {
! putchar('^');
! putchar(*s | 64);
}
else
putchar(*s); /* echo previous character */
***************
*** 196,202
putc(*s | 64, stdout);
}
else
! putc(*s, stdout); /* echo previous character */
s++;
re_read:
fflush(stdout);
--- 196,202 -----
putchar(*s | 64);
}
else
! putchar(*s); /* echo previous character */
s++;
re_read:
fflush(stdout);
***************
*** 285,292
goto re_read;
}
else if (*s == Ctl('v')) {
! putc('^', stdout);
! backspace(); /* tputs->putchr->putchar->fflush so flushes - DS */
getcmd(s);
goto top;
}
--- 285,292 -----
goto re_read;
}
else if (*s == Ctl('v')) {
! putchar('^');
! backspace();
getcmd(s);
goto top;
}
***************
*** 520,529
#endif
underline();
}
- /* David Sherman, Feb 85: mod to call putc instead
- * of putchar here, so flushing only happens at the
- * end of a line or block or whatever
- */
for (i=0; i<COLS; i++) {
if (!*s)
break;
--- 520,525 -----
#endif
underline();
}
for (i=0; i<COLS; i++) {
if (!*s)
break;
***************
*** 528,534
if (!*s)
break;
if (*s >= ' ')
! putc(*s, stdout);
else if (*s == '\t') {
putc(*s, stdout);
i = ((i+8) & ~7) - 1;
--- 524,530 -----
if (!*s)
break;
if (*s >= ' ')
! putchar(*s);
else if (*s == '\t') {
putchar(*s);
i = ((i+8) & ~7) - 1;
***************
*** 530,536
if (*s >= ' ')
putc(*s, stdout);
else if (*s == '\t') {
! putc(*s, stdout);
i = ((i+8) & ~7) - 1;
}
else if (*s == '\n') {
--- 526,532 -----
if (*s >= ' ')
putchar(*s);
else if (*s == '\t') {
! putchar(*s);
i = ((i+8) & ~7) - 1;
}
else if (*s == '\n') {
***************
*** 538,545
}
else {
i++;
! putc('^', stdout);
! putc(*s + 64, stdout);
}
s++;
}
--- 534,541 -----
}
else {
i++;
! putchar('^');
! putchar(*s + 64);
}
s++;
}
***************
*** 543,549
}
s++;
}
- fflush(stdout);
if (i) {
if (hilite == STANDOUT)
un_standout();
--- 539,544 -----
}
s++;
}
if (i) {
if (hilite == STANDOUT)
un_standout();
***************
*** 565,571
register int i;
for (i = num; i; --i)
! putc(PC, stdout);
fflush(stdout);
}
--- 560,566 -----
register int i;
for (i = num; i; --i)
! putchar(PC);
fflush(stdout);
}
***************
*** 577,584
{
if (verify && buf[1] == FINISHCMD) {
if (*buf < ' ') {
! putc('^', stdout);
! putc(*buf | 64, stdout);
backspace();
backspace();
}
--- 572,579 -----
{
if (verify && buf[1] == FINISHCMD) {
if (*buf < ' ') {
! putchar('^');
! putchar(*buf | 64);
backspace();
backspace();
}
***************
*** 583,589
backspace();
}
else {
! putc(*buf, stdout);
backspace();
}
fflush(stdout);
--- 578,584 -----
backspace();
}
else {
! putchar(*buf);
backspace();
}
fflush(stdout);
***************
*** 595,601
rubout()
{
backspace(); /* do the old backspace, */
! putc(' ', stdout); /* space, */
backspace(); /* backspace trick */
}
--- 590,596 -----
rubout()
{
backspace(); /* do the old backspace, */
! putchar(' '); /* space, */
backspace(); /* backspace trick */
}
***************
*** 607,614
fputs("^R\n",stdout);
for (s = buf; *s; s++) {
if (*s < ' ') {
! putc('^', stdout);
! putc(*s | 64, stdout);
}
else
putc(*s, stdout);
--- 602,609 -----
fputs("^R\n",stdout);
for (s = buf; *s; s++) {
if (*s < ' ') {
! putchar('^');
! putchar(*s | 64);
}
else
putchar(*s);
***************
*** 611,617
putc(*s | 64, stdout);
}
else
! putc(*s, stdout);
}
fflush(stdout);
}
--- 606,612 -----
putchar(*s | 64);
}
else
! putchar(*s);
}
}
***************
*** 613,618
else
putc(*s, stdout);
}
- fflush(stdout);
}
--- 608,612 -----
else
putchar(*s);
}
}
--
{utzoo pesnta nrcaero utcs hcr}!lsuc!dave
{allegra decvax ihnp4 linus}!utcsri!lsuc!dave
More information about the Comp.sources.unix
mailing list