jbn@wdl1.UUCP (08/23/85)
In n3.c of device independent TROFF, there is a CPP variable INCORE which if defined seems to turn on some I/O optimizations. But I don't have the time to trace through the miserable and uncommented code in TROFF to figure out what is really going on. But someone with more time might find it useful to define INCORE, build TROFF, and see what happens. Maybe things will speed up. John Nagle
guy@sun.uucp (Guy Harris) (08/25/85)
> In n3.c of device independent TROFF, there is a CPP variable INCORE > which if defined seems to turn on some I/O optimizations. But I don't have > the time to trace through the miserable and uncommented code in TROFF to > figure out what is really going on. But someone with more time might > find it useful to define INCORE, build TROFF, and see what happens. > Maybe things will speed up. If it's anything like the INCORE in the S3/S5 TROFF, it won't speed up. INCORE is for large virtual-memory systems which aren't running UNIX. They do "malloc" instead of "sbrk", and use standard I/O instead of "read"/"write". This (especially "malloc") slows things down quite a bit. I whipped up a VMUNIX option for TROFF once that was based on INCORE but 1) supported compressed macro packages and 2) used "sbrk" and "read"/"write". "time"ing that TROFF (NROFF, actually) vs. older ones and vs. 4.2BSD's NROFF indicated that it was faster; however, the output was bursty, rather than continuous as 4.2BSD's NROFF output was, so it seemed slower. Go figure. Guy Harris
mckay@pur-ee.UUCP (Dwight D McKay) (08/26/85)
The INCORE #define is only half implimented in the release of DWB we have (version 1.0). Defining it will cause troff to use an incore memory buffer AND setup a tempfile. Hardly a speed-up. --Dwight Mckay, ECN Software Support
chris@umcp-cs.UUCP (Chris Torek) (08/27/85)
I had a set of n/troff changes for 4.1BSD that gave a ~10% improvement, as I recall. Let me see if I can find them.... Ah, here we go. Please note that these are for 4.1BSD; I haven't reinstalled them in 4.2 myself (perhaps someone else has), and we don't run System N. First, add the following at the end of tdef.h: ------------------------------------------------------------------- /* NOTE: THIS WON'T WORK UNDER NON-VMUNIX!! */ /* Troff spends about 20% of its time in getch() and getch0(); this is an attempt to speed that up. */ #ifdef FAST int _ch_, ch, nlflg, ch0, nchar, rchar, app; int *rbuf, Buf[NBLIST*BLK + NEV*EVS], *olinep; filep roff; #define getch() (ch?((((_ch_=ch)&CMASK)=='\n'?nlflg++:0),ch=0,_ch_):\ nlflg?'\n':_getch_()) #define getch0() (ch0?(_ch_=ch0,ch0=0,_ch_):nchar?(--nchar,rchar):_getch0_()) #define rbf0(p) (((p)&~(BLK-1))==roff?rbuf[(p)&(BLK-1)]:\ (roff=(p)&(~(BLK-1)),rbuf= &Buf[roff],rbuf[p&(BLK-1)])) #define rbf() (((_ch_=rbf0(ip))==0?(app?0:(_ch_=popi()))\ :(ip=incoff(ip))),_ch_) #define wbt(i) (wbf(i),wbfl()) #ifdef NROFF int oline[LNSIZE+1]; #define ptout(i) ((olinep>= &oline[LNSIZE]?0:(*olinep++=(i))),\ ((i)&CMASK)=='\n'?_ptout_(i):0) #else (TROFF) #define ptout(i) (((i)&CMASK)!='\n'?*olinep++=(i):_ptout_()) #endif NROFF #endif FAST ------------------------------------------------------------------- Now, the RCS diffs for the other files. There are some other changes in here; you can try using just the code that is conditional on FAST, if you wish. RCS file: RCS/n1.c,v retrieving revision 1.1 retrieving revision 1.2 diff -c2 -r1.1 -r1.2 *** /tmp/,RCSt1001198 Tue Aug 27 07:37:26 1985 --- /tmp/,RCSt2001198 Tue Aug 27 07:37:28 1985 *************** *** 142,145 int acctf; #endif main(argc,argv) --- 142,146 ----- int acctf; #endif + char *getenv(); main(argc,argv) *************** *** 250,253 dpn = 0; continue; #endif default: --- 251,260 ----- dpn = 0; continue; + case 'F': + { + extern char *fontfile; + fontfile = &argv[0][2]; + } + continue; #endif default: *************** *** 418,421 { static int mode; if (ttyp==0) --- 425,430 ----- { static int mode; + char *tbptr; + char tbuf[1024]; /* 11-3-83 EMA & BNI *************** *** 419,422 static int mode; if (ttyp==0) return; --- 428,440 ----- char tbuf[1024]; + /* 11-3-83 EMA & BNI + Added following check so that messages are only turned off + if the output is going to the terminal, and the terminal + is a hard copy terminal or of unknown type */ + + tbptr = getenv ("TERM"); + if (! isatty(2) || (tgetent (tbuf,tbptr) > 0) && ! tgetflag("hc")) + return; + if (ttyp==0) return; *************** *** 449,453 { register i,j; ! extern filep boff(); i = a; --- 467,471 ----- { register i,j; ! /* extern filep boff(); */ i = a; *************** *** 473,477 return(i); } ! getch(){ register int i, j, k; --- 491,497 ----- return(i); } ! ! #ifndef FAST ! getch () { register int i, j, k; *************** *** 477,480 level++; g0: if(ch){ --- 497,509 ----- level++; + #else FAST + _getch_ () { + register int i, j, k; + + level++; + /* when we get here we know ch and nlflag are both zero */ + goto gfast; + #endif FAST + g0: if(ch){ *************** *** 490,493 } if((k = (i = getch0()) & CMASK) != ESC){ if(i & MOT)goto g2; --- 519,523 ----- } + gfast: if((k = (i = getch0()) & CMASK) != ESC){ if(i & MOT)goto g2; *************** *** 702,706 } char ifilt[32] = {0,001,002,003,0,005,006,007,010,011,012}; ! getch0(){ register int i, j; --- 732,738 ----- } char ifilt[32] = {0,001,002,003,0,005,006,007,010,011,012}; ! ! #ifndef FAST ! getch0 () { register int i, j; *************** *** 707,710 if(ch0){i=ch0; ch0=0; return(i);} if(nchar){nchar--; return(rchar);} again: --- 739,746 ----- if(ch0){i=ch0; ch0=0; return(i);} if(nchar){nchar--; return(rchar);} + #else FAST + _getch0_ () { + register int i, j; + #endif FAST again: =================================================================== RCS file: RCS/n3.c,v retrieving revision 1.1 retrieving revision 1.2 diff -c2 -r1.1 -r1.2 *** /tmp/,RCSt1001198 Tue Aug 27 07:37:36 1985 --- /tmp/,RCSt2001198 Tue Aug 27 07:37:37 1985 *************** *** 16,19 */ unsigned blist[NBLIST]; extern struct s *frame, *stk, *nxf; --- 16,22 ----- */ + #define blisti(i) (((i)-NEV*EVS)/(BLK)) + #define boff(i) (((filep)i)*BLK + NEV*EVS) + unsigned blist[NBLIST]; extern struct s *frame, *stk, *nxf; *************** *** 134,138 } findmn(i) ! int i; { register j; --- 137,141 ----- } findmn(i) ! register i; { register j; *************** *** 137,140 { register j; for(j=0;j<NM;j++){ --- 140,144 ----- { register j; + register struct contab *p; for (p = contab; p < &contab[NM]; p++) *************** *** 138,145 register j; ! for(j=0;j<NM;j++){ ! if(i == (contab[j].rq & ~MMASK))break; ! } ! if(j==NM)j = -1; return(j); } --- 142,151 ----- register struct contab *p; ! for (p = contab; p < &contab[NM]; p++) ! if (i == (p->rq & ~MMASK)) ! break; ! j = p - contab; ! if (j == NM) ! j = -1; return(j); } *************** *** 147,151 int i; { - extern filep boff(); if(i >= 0){ if(contab[i].rq & MMASK)ffree(((filep)contab[i].x.mx)<<BLKBITS); --- 153,156 ----- int i; { if(i >= 0){ if(contab[i].rq & MMASK)ffree(((filep)contab[i].x.mx)<<BLKBITS); *************** *** 158,162 { register i; - extern filep boff(); register filep savip; extern filep alloc(); --- 163,166 ----- { register i; register filep savip; extern filep alloc(); *************** *** 274,278 { register i; - extern filep boff(); filep j; --- 278,281 ----- { register i; filep j; *************** *** 299,307 blist[j] = 0; } ! filep boff(i) ! int i; ! { ! return(((filep)i)*BLK + NEV*EVS); ! } wbt(i) int i; --- 302,306 ----- blist[j] = 0; } ! #ifndef FAST wbt(i) int i; *************** *** 310,313 wbfl(); } wbf(i) int i; --- 309,313 ----- wbfl(); } + #endif FAST wbf(i) int i; *************** *** 346,354 woff = 0; } ! blisti(i) ! filep i; ! { ! return((i-NEV*EVS)/(BLK)); ! } rbf(){ register i; --- 346,351 ----- woff = 0; } ! ! #ifndef FAST rbf(){ register i; *************** *** 362,365 return(i); } rbf0(p) filep p; --- 359,363 ----- return(i); } + rbf0(p) filep p; *************** *** 378,381 return(rbuf[p & (BLK-1)]); } filep incoff(p) filep p; --- 376,381 ----- return(rbuf[p & (BLK-1)]); } + #endif FAST + filep incoff(p) register filep p; *************** *** 379,383 } filep incoff(p) ! filep p; { register i; --- 379,383 ----- filep incoff(p) ! register filep p; { register i; *************** *** 382,388 { register i; ! register filep j; ! if(!((j = (++p)) & (BLK-1))){ ! if((i = blist[blisti(--p)]) == -1){ prstr("Bad storage allocation.\n"); done2(-5); --- 382,388 ----- { register i; ! ! if (!(++p & (BLK-1))) { ! if ((i = blist[blisti(--p)]) == -1) { prstr("Bad storage allocation.\n"); done2(-5); *************** *** 388,392 done2(-5); } ! j = ((filep)i)<<BLKBITS; } return(j); --- 388,392 ----- done2(-5); } ! p = ((filep) i) << BLKBITS; } return p; *************** *** 390,394 j = ((filep)i)<<BLKBITS; } ! return(j); } popi(){ --- 390,394 ----- p = ((filep) i) << BLKBITS; } ! return p; } *************** *** 392,395 return(j); } popi(){ register struct s *p; --- 392,396 ----- return p; } + popi(){ register struct s *p; =================================================================== RCS file: RCS/t6.c,v retrieving revision 1.1 retrieving revision 1.2 diff -c2 -r1.1 -r1.2 *** /tmp/,RCSt1001198 Tue Aug 27 07:37:42 1985 --- /tmp/,RCSt2001198 Tue Aug 27 07:37:44 1985 *************** *** 49,54 extern int ch0; extern int lg; ! char fontfile[] = "/usr/lib/font/ftXX"; ! int ffi = 16; extern int bd; extern int level; --- 49,54 ----- extern int ch0; extern int lg; ! char *fontfile = "/usr/lib/font/ftXX"; ! int ffi = 0; extern int bd; extern int level; *************** *** 110,114 } getcw(i) ! int i; { register j,k; --- 110,114 ----- } getcw(i) ! register i; { register j,k; *************** *** 506,509 if(((i = (getch() & CMASK) - '0' -1) < 0) || (i >3)){prstr("fp: bad font position\n"); return;} if(skip() || !(j = getrq())){prstr("fp: no font name\n"); return;} fontfile[ffi] = j & BMASK; fontfile[ffi+1] = j>>BYTE; --- 506,512 ----- if(((i = (getch() & CMASK) - '0' -1) < 0) || (i >3)){prstr("fp: bad font position\n"); return;} if(skip() || !(j = getrq())){prstr("fp: no font name\n"); return;} + if (ffi == 0) + while (fontfile[ffi] != 'X') + ffi++; fontfile[ffi] = j & BMASK; fontfile[ffi+1] = j>>BYTE; =================================================================== RCS file: RCS/n10.c,v retrieving revision 1.1 retrieving revision 1.2 diff -c2 -r1.1 -r1.2 *** /tmp/,RCSt1001198 Tue Aug 27 07:37:48 1985 --- /tmp/,RCSt2001198 Tue Aug 27 07:37:49 1985 *************** *** 82,88 } } ! ptout(i) ! int i; ! { *olinep++ = i; if(olinep >= &oline[LNSIZE])olinep--; --- 82,88 ----- } } ! ! #ifndef FAST ! ptout (i) int i; { *olinep++ = i; if(olinep >= &oline[LNSIZE])olinep--; *************** *** 88,91 if(olinep >= &oline[LNSIZE])olinep--; if((i&CMASK) != '\n')return; olinep--; lead += dip->blss + lss - t.Newline; --- 88,94 ----- if(olinep >= &oline[LNSIZE])olinep--; if((i&CMASK) != '\n')return; + #else FAST + _ptout_ () { + #endif FAST olinep--; lead += dip->blss + lss - t.Newline; *************** *** 144,147 } } if(xfont == ulfont){ for(k=w/t.Char;k>0;k--)oput('_'); --- 147,157 ----- } } + + /* + * This next section of code was moved to after the characters are + * output, so that underlining follows the characters, which is the + * way the Printronix printer likes it. 2/24/81 FLB + * + if(xfont == ulfont){ for(k=w/t.Char;k>0;k--)oput('_'); *************** *** 148,151 for(k=w/t.Char;k>0;k--)oput('\b'); } while(*codep != 0){ if(*codep & 0200){ --- 158,165 ----- for(k=w/t.Char;k>0;k--)oput('\b'); } + + * + */ + while(*codep != 0){ if(*codep & 0200){ *************** *** 161,164 } if(!w)for(k=phyw/t.Char;k>0;k--)oput('\b'); } } --- 175,189 ----- } if(!w)for(k=phyw/t.Char;k>0;k--)oput('\b'); + + /* + * Do underlining here. + * See previous comment as regards underlining. + */ + + if(xfont == ulfont){ + for(k=w/t.Char;k>0;k--)oput('\b'); + for(k=w/t.Char;k>0;k--)oput('_'); + } + } } =================================================================== RCS file: RCS/t10.c,v retrieving revision 1.1 retrieving revision 1.3 diff -c2 -r1.1 -r1.3 *** /tmp/,RCSt1001198 Tue Aug 27 07:37:52 1985 --- /tmp/,RCSt2001198 Tue Aug 27 07:37:53 1985 *************** *** 66,70 oput(0140); /*some initial lead*/ } ! ptout(i) int i; { --- 66,75 ----- oput(0140); /*some initial lead*/ } ! ! #ifndef FAST ! ptout (i) ! #else FAST ! _ptout_ (i) ! #endif FAST int i; { *************** *** 73,76 int psl[16]; if((i & CMASK) != '\n'){ *olinep++ = i; --- 78,82 ----- int psl[16]; + #ifndef FAST if((i & CMASK) != '\n'){ *olinep++ = i; *************** *** 77,80 return; } if(olinep == oline){ lead += lss; --- 83,87 ----- return; } + #endif FAST if(olinep == oline){ lead += lss; *************** *** 149,153 } ptout0(i) ! int i; { register j, k, w; --- 156,160 ----- } ptout0(i) ! register int i; { register j, k, w; *************** *** 275,279 while(k > 0){ if((i=127) > k)i = k; ! if(((j = (esct + i*(1-2*escm))) > (46*72+18-T_IESC)) || (j < 0))break; /* --- 282,290 ----- while(k > 0){ if((i=127) > k)i = k; ! /* ! * the magic number in the next line is ! * # of inches max line length * #picas/inch * #bu's/pica ! */ ! if(((j = (esct + i*(1-2*escm))) > (12*6*72+18-T_IESC)) || (j < 0))break; /* -- In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 4251) UUCP: seismo!umcp-cs!chris CSNet: chris@umcp-cs ARPA: chris@maryland