Annotation of 3BSD/cmd/prof/prof.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *  Print execution profile
                      3:  */
                      4: 
                      5: #include <stdio.h>
                      6: #include <sys/types.h>
                      7: #include <sys/stat.h>
                      8: #include <a.out.h>
                      9: 
                     10: typedef        short UNIT;             /* unit of profiling */
                     11: 
                     12: struct stat stbuf;
                     13: struct nl {
                     14:        char    name[8];
                     15:        unsigned value;
                     16:        float   time;
                     17:        long    ncall;
                     18: };
                     19: 
                     20: struct hdr {
                     21:        short   *lowpc;
                     22:        short   *highpc;
                     23:        int     ncount;
                     24: };
                     25: 
                     26: struct nl nl[600];
                     27: 
                     28: struct cnt {
                     29:        unsigned cvalue;
                     30:        long    cncall;
                     31: } cbuf[350];
                     32: 
                     33: FILE   *pfile, *nfile;
                     34: unsigned highpc;
                     35: unsigned lowpc;
                     36: double ransca;
                     37: double ranoff;
                     38: int    pcl;
                     39: int    pch;
                     40: unsigned       bufs;
                     41: int    nname;
                     42: double time;
                     43: double actime;
                     44: double totime;
                     45: double maxtime;
                     46: double scale;
                     47: double lastx;
                     48: double lasty;
                     49: struct nl *np;
                     50: struct nl *npe;
                     51: int    aflg;
                     52: int    vflg;
                     53: int    lflg;
                     54: long   symoff;
                     55: 
                     56: main(argc, argv)
                     57: char **argv;
                     58: {
                     59:        char *namfil;
                     60:        int timcmp(), valcmp(), cntcmp();
                     61:        int i, overlap;
                     62:        long pfpos;
                     63:        double lastsx;
                     64:        struct cnt *cp;
                     65:        double tx, ty;
                     66:        struct exec xbuf;
                     67:        struct hdr {
                     68:                UNIT    *lowpc;
                     69:                UNIT    *highpc;
                     70:                int     ncount;
                     71:        } h;
                     72: 
                     73:        lowpc = -1;
                     74:        highpc = -1;
                     75:        argv++;
                     76:        namfil = "a.out";
                     77:        while (argc>1) {
                     78:                if (**argv == '-') {
                     79:                        if (*++*argv == 'l')
                     80:                                lflg++;
                     81:                        if (**argv == 'a')
                     82:                                aflg = 040;
                     83:                        if(**argv == 'v')
                     84:                                vflg++;
                     85:                        if(**argv >= '0' && **argv <= '9') {
                     86:                                i = atoi(*argv);
                     87:                                if(lowpc == -1)
                     88:                                        lowpc = i;
                     89:                                else
                     90:                                        highpc = i;
                     91:                        }
                     92:                } else
                     93:                        namfil = *argv;
                     94:                argc--;
                     95:                argv++;
                     96:        }
                     97:        if (lowpc >= 100)
                     98:                lowpc = 0;
                     99:        if(highpc <= lowpc || highpc > 100)
                    100:                highpc = 100;
                    101:        ransca = 100./(highpc-lowpc);
                    102:        ranoff = 2040. + 40.8*lowpc*ransca;
                    103:        if((nfile=fopen(namfil,"r"))==NULL) {
                    104:                fprintf(stderr, "%s: not found\n", namfil);
                    105:                done();
                    106:        }
                    107:        fread(&xbuf, 1, sizeof(xbuf), nfile);
                    108:        if (xbuf.a_magic!=A_MAGIC1 && xbuf.a_magic!=A_MAGIC2 && xbuf.a_magic!=A_MAGIC3) {
                    109:                fprintf(stderr, "%s: bad format\n", namfil);
                    110:                done();
                    111:        }
                    112:        symoff = (long)xbuf.a_text + xbuf.a_data + xbuf.a_trsize + xbuf.a_drsize;
                    113:        fseek(nfile, symoff+sizeof(xbuf), 0);
                    114:        if((pfile = fopen("mon.out","r")) == NULL) {
                    115:                fprintf(stderr, "No mon.out\n");
                    116:                done();
                    117:        }
                    118:        fstat(fileno(pfile), &stbuf);
                    119:        fread(&h, sizeof(struct hdr), 1, pfile);
                    120:        lowpc = h.lowpc - (UNIT *)0;
                    121:        highpc = h.highpc - (UNIT *)0;
                    122:        bufs = stbuf.st_size - sizeof(struct hdr) - h.ncount*sizeof(struct cnt);
                    123:        fread(cbuf, sizeof(struct cnt), h.ncount, pfile);
                    124:        pfpos = ftell(pfile);
                    125:        npe = nl;
                    126:        for (nname = 0; xbuf.a_syms > 0; xbuf.a_syms -= sizeof(struct nlist)) {
                    127:                struct nlist nbuf;
                    128:                fread(&nbuf, sizeof(nbuf), 1, nfile);
                    129:                if (nbuf.n_type!=N_TEXT && nbuf.n_type!=N_TEXT+N_EXT)
                    130:                        continue;
                    131:                if (aflg==0 && nbuf.n_type!=N_TEXT+N_EXT)
                    132:                        continue;
                    133:                npe->value = nbuf.n_value/sizeof(UNIT);
                    134:                for (i=8; --i>=0;)
                    135:                        npe->name[i] = nbuf.n_name[i];
                    136:                npe++;
                    137:                nname++;
                    138:        }
                    139:        if (nname == 0) {
                    140:                fprintf(stderr, "%s: no symbols\n", namfil);
                    141:                done();
                    142:        }
                    143:        npe->value = -1;
                    144:        npe++;
                    145:        cp = &cbuf[h.ncount]; while ((--cp)->cvalue==0); ++cp; h.ncount=cp-cbuf;
                    146:        for (;--cp>=cbuf;) cp->cvalue /= sizeof(UNIT);
                    147:        qsort(cbuf, h.ncount, sizeof(struct cnt), cntcmp);
                    148:        qsort(nl, nname, sizeof(struct nl), valcmp);
                    149:        cp = &cbuf[h.ncount-1]; np = npe;
                    150:        while (--np>=nl) {
                    151:                if (cp<cbuf || np->value > cp->cvalue) continue;
                    152:                while (cp>=cbuf && cp->cvalue - np->value >11) --cp;
                    153:                if (cp->cvalue >= np->value) {np->ncall = cp->cncall; --cp;}
                    154:        }
                    155:        scale = highpc - lowpc;
                    156:        scale /= bufs/sizeof(UNIT);
                    157:        for(i=0;;i++) {
                    158:                register j;
                    159:                unsigned UNIT ccnt;
                    160:                fread(&ccnt, sizeof(ccnt), 1, pfile);
                    161:                if(feof(pfile))
                    162:                        break;
                    163:                if (ccnt == 0)
                    164:                        continue;
                    165:                pcl = lowpc + scale*i;
                    166:                pch = lowpc + scale*(i+1);
                    167:                time = ccnt;
                    168:                totime += time;
                    169:                if(time > maxtime)
                    170:                        maxtime = time;
                    171:                for (j=0; j<nname; j++) {
                    172:                        if (pch < nl[j].value)
                    173:                                break;
                    174:                        if (pcl >= nl[j+1].value)
                    175:                                continue;
                    176:                        overlap=(min(pch,nl[j+1].value)-max(pcl,nl[j].value));
                    177:                        if (overlap>0) nl[j].time += overlap*time/scale;
                    178:                }
                    179:        }
                    180:        if (totime==0.0) {
                    181:                fprintf(stderr, "No time accumulated\n");
                    182: /*
                    183:                done();
                    184:  */
                    185:                totime=1.0;
                    186:        }
                    187: #ifdef plot
                    188:        if(!vflg)
                    189:                goto print;
                    190:        openpl();
                    191:        erase();
                    192:        space(-2048, -2048, 2048, 2048);
                    193:        line(-2040, -2040, -2040, 2040);
                    194:        line(0, 2040, 0, -2040);
                    195:        for(i=0; i<11; i++)
                    196:                line(-2040, 2040-i*408, 0, 2040-i*408);
                    197:        lastx = 0.;
                    198:        lasty = ranoff;
                    199:        scale = (4080.*ransca)/(bufs/sizeof(UNIT));
                    200:        fclose(pfile);  /*to turn off eof*/
                    201:        pfile = fopen("mon.out", "r");
                    202:        fseek(pfile, pfpos, 0);
                    203:        lastsx = 0.0;
                    204:        for(;;) {
                    205:                unsigned UNIT ccnt;
                    206:                fread(&ccnt, sizeof(ccnt), 1, pfile);
                    207:                if(feof(pfile))
                    208:                        break;
                    209:                time = ccnt;
                    210:                tx = lastsx;
                    211:                ty = lasty;
                    212:                lastsx =- 2000.*time/totime;
                    213:                lasty =- scale;
                    214:                if(lasty >= -2040. && ty <= 2040.) {
                    215:                        line((int)tx, (int)ty, (int)lastsx, (int)lasty);
                    216:                        if (ccnt!=0 || lastx!=0.0) {
                    217:                                tx = lastx;
                    218:                                lastx = -time*2000./maxtime;
                    219:                                ty =+ scale/2;
                    220:                                line(0, (int)ty, (int)tx, (int)ty);
                    221:                        }
                    222:                }
                    223:        }
                    224:        scale = (4080.*ransca)/(highpc-lowpc);
                    225:        lastx = 50.;
                    226:        for(np = nl; np<npe;  np++) {
                    227:                if(np->value < lowpc)
                    228:                        continue;
                    229:                if(np->value >= highpc)
                    230:                        continue;
                    231:                time = np->time/totime;
                    232:                lasty = ranoff - (np->value - lowpc)*scale;
                    233:                if(lasty >= -2040. && lasty <= 2040.) {
                    234:                        char bufl[8+3], *namp;
                    235:                        register j;
                    236:                        line(0, (int)lasty, 50, (int)lasty);
                    237:                        line((int)(lastx-50),(int)lasty,(int)lastx,(int)lasty);
                    238:                        point((int)(lastx+30), (int)(lasty+10));
                    239:                        namp = bufl;
                    240:                        for(j=0; j<8; j++)
                    241:                                if(np->name[j] != '_')
                    242:                                        *namp++ = np->name[j];
                    243:                        *namp++ = '\n';
                    244:                        *namp++ = 0;
                    245:                        label(bufl);
                    246:                }
                    247:                lastx =+ 500.;
                    248:                if(lastx > 2000.)
                    249:                        lastx = 50.;
                    250:        }
                    251:        done();
                    252: 
                    253: print:
                    254: #endif
                    255:        actime = 0;
                    256:        printf("    name %%time  cumsecs  #call  ms/call\n");
                    257:        if (!lflg)
                    258:                qsort(nl, nname, sizeof(struct nl), timcmp);
                    259:        for (np = nl; np<npe-1; np++) {
                    260:                time = np->time/totime;
                    261:                actime += np->time;
                    262:                printf("%8.8s%6.1f%9.2f", np->name, 100*time, actime/60);
                    263:                if(np->ncall!=0) {
                    264:                        printf("%7ld", np->ncall);
                    265:                        printf(" %8.2f\n", np->time/(np->ncall*.06));
                    266:                } else
                    267:                        printf("\n");
                    268:        }
                    269:        done();
                    270: }
                    271: 
                    272: min(a, b)
                    273: {
                    274:        if (a<b)
                    275:                return(a);
                    276:        return(b);
                    277: }
                    278: 
                    279: max(a, b)
                    280: {
                    281:        if (a>b)
                    282:                return(a);
                    283:        return(b);
                    284: }
                    285: 
                    286: valcmp(p1, p2)
                    287: struct nl *p1, *p2;
                    288: {
                    289:        return(p1->value - p2->value);
                    290: }
                    291: 
                    292: timcmp(p1, p2)
                    293: struct nl *p1, *p2;
                    294: {
                    295:        float d;
                    296: 
                    297:        d = p2->time - p1->time;
                    298:        if (d > 0.0)
                    299:                return(1);
                    300:        if (d < 0.0)
                    301:                return(-1);
                    302:        return(0);
                    303: }
                    304: 
                    305: cntcmp(p1, p2)
                    306: struct cnt *p1, *p2;
                    307: {
                    308:        return(p1->cvalue - p2->cvalue);
                    309: }
                    310: 
                    311: done()
                    312: {
                    313: 
                    314: #ifdef plot
                    315:        if(vflg) {
                    316:                point(0, -2040);
                    317:                closepl();
                    318:        }
                    319: #endif
                    320:        exit(0);
                    321: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.