System: rn version 4.3 Patch #: 14 Priority: ENHANCEMENT Subject: rn -c speedup >From: mark@cbosgd.UUCP (Mark Horton), lwall@sdcrdcf.UUCP (Larry Wall) Description: Mark mentioned that he didn't want to put "rn -c" into his system-wide login profile because it was kind of slow, and he suggested that it might be speedupable. Okay, here it is. The following patches make "rn -c" run between two and three times faster on our machine. These figures are for comparison only and may vary depending on the environment and your driving habits. Fix: From rn, say "| patch -d DIR", where DIR is your rn source directory. Outside of rn, say "cd DIR; patch Patch #: 14 Index: init.c Prereq: 4.3 *** init.c.old Tue May 21 13:38:34 1985 --- init.c Tue May 21 13:38:37 1985 *************** *** 1,4 ! /* $Header: init.c,v 4.3 85/05/01 16:16:13 lwall Exp $ * * $Log: init.c,v $ * Revision 4.3 85/05/01 16:16:13 lwall --- 1,4 ----- ! /* $Header: init.c,v 4.3.1.2 85/05/21 14:22:46 lwall Exp $ * * $Log: init.c,v $ * Revision 4.3.1.2 85/05/21 14:22:46 lwall *************** *** 1,6 /* $Header: init.c,v 4.3 85/05/01 16:16:13 lwall Exp $ * * $Log: init.c,v $ * Revision 4.3 85/05/01 16:16:13 lwall * Baseline for release with 4.3bsd. * --- 1,12 ----- /* $Header: init.c,v 4.3.1.2 85/05/21 14:22:46 lwall Exp $ * * $Log: init.c,v $ + * Revision 4.3.1.2 85/05/21 14:22:46 lwall + * Sped up "rn -c" by avoiding unnecessary initialization. + * + * Revision 4.3.1.1 85/05/10 11:33:39 lwall + * Branch for patches. + * * Revision 4.3 85/05/01 16:16:13 lwall * Baseline for release with 4.3bsd. * *************** *** 80,86 /* now make sure we have a current working directory */ ! cwd_check(); /* now that we know where to save things, cd to news directory */ --- 86,93 ----- /* now make sure we have a current working directory */ ! if (!checkflag) ! cwd_check(); /* now that we know where to save things, cd to news directory */ *************** *** 96,102 /* get info on last rn run, if any */ ! last_init(tcbuf); free(tcbuf); /* recover 1024 bytes */ --- 103,110 ----- /* get info on last rn run, if any */ ! if (!checkflag) ! last_init(tcbuf); free(tcbuf); /* recover 1024 bytes */ *************** *** 102,108 /* make sure we are the right version */ ! version_check(); /* make sure we are the sole possessors of .newsrc */ --- 110,117 ----- /* make sure we are the right version */ ! if (!checkflag) ! version_check(); /* make sure we are the sole possessors of .newsrc */ *************** *** 106,112 /* make sure we are the sole possessors of .newsrc */ ! lock_check(); /* check for news news */ --- 115,122 ----- /* make sure we are the sole possessors of .newsrc */ ! if (!checkflag) ! lock_check(); /* check for news news */ *************** *** 110,116 /* check for news news */ ! newsnews_check(); /* open active file, etc. */ --- 120,127 ----- /* check for news news */ ! if (!checkflag) ! newsnews_check(); /* open active file, etc. */ *************** *** 214,220 tmpfp = fopen(lockname,"r"); if (tmpfp != Nullfp) { int processnum; ! fgets(buf,LBUFLEN,tmpfp); fclose(tmpfp); processnum = atoi(buf); --- 225,231 ----- tmpfp = fopen(lockname,"r"); if (tmpfp != Nullfp) { int processnum; ! fgets(buf,LBUFLEN,tmpfp); fclose(tmpfp); processnum = atoi(buf); *************** *** 285,291 { char *newsnewsname = filexp(NEWSNEWSNAME); ! if (!checkflag && (tmpfp = fopen(newsnewsname,"r")) != Nullfp) { fstat(tmpfp->_file,&filestat); if (filestat.st_mtime > lasttime) { while (fgets(buf,sizeof(buf),tmpfp) != Nullch) --- 296,302 ----- { char *newsnewsname = filexp(NEWSNEWSNAME); ! if ((tmpfp = fopen(newsnewsname,"r")) != Nullfp) { fstat(tmpfp->_file,&filestat); if (filestat.st_mtime > lasttime) { while (fgets(buf,sizeof(buf),tmpfp) != Nullch) Index: intrp.c Prereq: 4.3.1.3 *** intrp.c.old Tue May 21 13:39:24 1985 --- intrp.c Tue May 21 13:39:37 1985 *************** *** 1,4 ! /* $Header: intrp.c,v 4.3.1.3 85/05/17 10:37:11 lwall Exp $ * * $Log: intrp.c,v $ * Revision 4.3.1.3 85/05/17 10:37:11 lwall --- 1,4 ----- ! /* $Header: intrp.c,v 4.3.1.4 85/05/21 13:35:21 lwall Exp $ * * $Log: intrp.c,v $ * Revision 4.3.1.4 85/05/21 13:35:21 lwall *************** *** 1,6 /* $Header: intrp.c,v 4.3.1.3 85/05/17 10:37:11 lwall Exp $ * * $Log: intrp.c,v $ * Revision 4.3.1.3 85/05/17 10:37:11 lwall * Fixed & substitution to capitalize last name too. * --- 1,9 ----- /* $Header: intrp.c,v 4.3.1.4 85/05/21 13:35:21 lwall Exp $ * * $Log: intrp.c,v $ + * Revision 4.3.1.4 85/05/21 13:35:21 lwall + * Sped up "rn -c" by not doing unnecessary initialization. + * * Revision 4.3.1.3 85/05/17 10:37:11 lwall * Fixed & substitution to capitalize last name too. * *************** *** 83,91 spool = savestr(filexp(SPOOL)); /* usually /usr/spool/news */ - getwd(tcbuf); /* find working directory name */ - origdir = savestr(tcbuf); /* and remember it */ - /* get environmental stuff */ /* get home directory */ --- 86,91 ----- spool = savestr(filexp(SPOOL)); /* usually /usr/spool/news */ /* get environmental stuff */ /* get home directory */ *************** *** 105,110 if (logname == Nullch) logname = savestr(getlogin()); #endif /* get the real name of the person (%N) */ /* Must be done after logname is read in because BERKNAMES uses that */ --- 105,115 ----- if (logname == Nullch) logname = savestr(getlogin()); #endif + + if (checkflag) /* that getwd below takes ~1/3 sec. */ + return; /* and we do not need it for -c */ + getwd(tcbuf); /* find working directory name */ + origdir = savestr(tcbuf); /* and remember it */ /* get the real name of the person (%N) */ /* Must be done after logname is read in because BERKNAMES uses that */ Index: rcstuff.c Prereq: 4.3 *** rcstuff.c.old Tue May 21 13:38:02 1985 --- rcstuff.c Tue May 21 13:38:10 1985 *************** *** 1,4 ! /* $Header: rcstuff.c,v 4.3 85/05/01 11:45:56 lwall Exp $ * * $Log: rcstuff.c,v $ * Revision 4.3 85/05/01 11:45:56 lwall --- 1,4 ----- ! /* $Header: rcstuff.c,v 4.3.1.2 85/05/17 11:40:08 lwall Exp $ * * $Log: rcstuff.c,v $ * Revision 4.3.1.2 85/05/17 11:40:08 lwall *************** *** 1,6 /* $Header: rcstuff.c,v 4.3 85/05/01 11:45:56 lwall Exp $ * * $Log: rcstuff.c,v $ * Revision 4.3 85/05/01 11:45:56 lwall * Baseline for release with 4.3bsd. * --- 1,12 ----- /* $Header: rcstuff.c,v 4.3.1.2 85/05/17 11:40:08 lwall Exp $ * * $Log: rcstuff.c,v $ + * Revision 4.3.1.2 85/05/17 11:40:08 lwall + * Sped up "rn -c" by not mallocing unnecessarily. + * + * Revision 4.3.1.1 85/05/10 11:37:18 lwall + * Branch for patches. + * * Revision 4.3 85/05/01 11:45:56 lwall * Baseline for release with 4.3bsd. * *************** *** 84,90 else softptr[newng] = 0; some_buf[--length] = '\0'; /* wipe out newline */ ! if (some_buf == buf) { rcline[newng] = savestr(some_buf); /* make a semipermanent copy */ } --- 90,98 ----- else softptr[newng] = 0; some_buf[--length] = '\0'; /* wipe out newline */ ! if (checkflag) /* no extra mallocs for -c */ ! rcline[newng] = some_buf; ! else if (some_buf == buf) { rcline[newng] = savestr(some_buf); /* make a semipermanent copy */ } *************** *** 110,116 continue; } for (s = rcline[newng]; *s && *s != ':' && *s != NEGCHAR; s++) ; ! if (!*s) { #ifndef lint rcline[newng] = saferealloc(rcline[newng],(MEM_SIZE)length+2); #endif lint --- 118,124 ----- continue; } for (s = rcline[newng]; *s && *s != ':' && *s != NEGCHAR; s++) ; ! if (!*s && !checkflag) { #ifndef lint rcline[newng] = saferealloc(rcline[newng],(MEM_SIZE)length+2); #endif lint Index: sw.c Prereq: 4.3 *** sw.c.old Tue May 21 13:38:54 1985 --- sw.c Tue May 21 13:38:57 1985 *************** *** 1,4 ! /* $Header: sw.c,v 4.3 85/05/01 11:50:54 lwall Exp $ * * $Log: sw.c,v $ * Revision 4.3 85/05/01 11:50:54 lwall --- 1,4 ----- ! /* $Header: sw.c,v 4.3.1.2 85/05/21 13:36:23 lwall Exp $ * * $Log: sw.c,v $ * Revision 4.3.1.2 85/05/21 13:36:23 lwall *************** *** 1,6 /* $Header: sw.c,v 4.3 85/05/01 11:50:54 lwall Exp $ * * $Log: sw.c,v $ * Revision 4.3 85/05/01 11:50:54 lwall * Baseline for release with 4.3bsd. * --- 1,12 ----- /* $Header: sw.c,v 4.3.1.2 85/05/21 13:36:23 lwall Exp $ * * $Log: sw.c,v $ + * Revision 4.3.1.2 85/05/21 13:36:23 lwall + * Sped up "rn -c" by not doing unnecessary initialization. + * + * Revision 4.3.1.1 85/05/10 11:40:38 lwall + * Branch for patches. + * * Revision 4.3 85/05/01 11:50:54 lwall * Baseline for release with 4.3bsd. * *************** *** 25,30 { register int i; interp(*tcbufptr,1024,GLOBINIT); sw_file(tcbufptr,FALSE); safecpy(*tcbufptr,getenv("RNINIT"),1024); --- 31,38 ----- { register int i; + if (argc >= 2 && strEQ(argv[1],"-c")) + checkflag=TRUE; /* so we can optimize for -c */ interp(*tcbufptr,1024,GLOBINIT); sw_file(tcbufptr,FALSE); safecpy(*tcbufptr,getenv("RNINIT"),1024); *************** *** 161,166 break; #endif case '/': #ifdef SETENV setenv("SAVEDIR", upordown ? "%p/%c" : "%p" ); setenv("SAVENAME", upordown ? "%a" : "%^C"); --- 169,176 ----- break; #endif case '/': + if (checkflag) + break; #ifdef SETENV setenv("SAVEDIR", upordown ? "%p/%c" : "%p" ); setenv("SAVENAME", upordown ? "%a" : "%^C"); *************** *** 177,182 docheckwhen = atoi(s); break; case 'd': { s++; if (*s == '=') s++; if (cwd) { --- 187,194 ----- docheckwhen = atoi(s); break; case 'd': { + if (checkflag) + break; s++; if (*s == '=') s++; if (cwd) { *************** *** 237,242 char *t; int flag = (*s == 'h' ? HT_HIDE : HT_MAGIC); s++; len = strlen(s); for (t=s; *t; t++) --- 249,256 ----- char *t; int flag = (*s == 'h' ? HT_HIDE : HT_MAGIC); + if (checkflag) + break; s++; len = strlen(s); for (t=s; *t; t++)