|
|
1.1 ! root 1: /* Copyright 1989 by AT&T Bell Laboratories */ ! 2: extern chatting(); ! 3: #define printf chatting ! 4: #define plural(a,b,c) (((a)==1)?(b):(c)) ! 5: ! 6: #ifdef PROFILE ! 7: ! 8: #include <stdio.h> ! 9: #include "prof.h" ! 10: ! 11: int profvec[PROFSIZE]; ! 12: #define getprof(x) (profvec[x]/2) ! 13: ! 14: int num_closures = 0; ! 15: int space_closures = 0; ! 16: int num_closure_accesses = 0; ! 17: int num_links_traced = 0; ! 18: int num_records = 0; ! 19: int space_records = 0; ! 20: int num_spills = 0; ! 21: int space_spills = 0; ! 22: int total = 0; ! 23: int descriptors = 0; ! 24: int num_calls = 0; ! 25: int num_arith_ops = 0; ! 26: int num_arith_ovh = 0; ! 27: extern int arenasize; ! 28: ! 29: /* ! 30: #define links(i) (getprof(LINKS+i)) ! 31: */ ! 32: #define closures(i) (getprof(CLOSURES+i)) ! 33: #define records(i) (getprof(RECORDS+i)) ! 34: #define spills(i) (getprof(SPILLS+i)) ! 35: #define arith(i) (getprof(ARITHOVH+i)) ! 36: ! 37: find_profile_info() ! 38: { ! 39: int i; ! 40: ! 41: num_calls = getprof(KNOWNCALLS) + getprof(STDKCALLS) + getprof(STDCALLS); ! 42: ! 43: for (i = 0; i < CLOSURESLOTS; i++) ! 44: num_closures += closures(i); ! 45: for (i = 1; i < CLOSURESLOTS; i++) ! 46: space_closures += closures(i) * (i+1); ! 47: space_closures += getprof(CLOSUREOVFL) + closures(0); ! 48: ! 49: /* ! 50: for (i = 0; i < LINKSLOTS; i++) ! 51: num_closure_accesses += links(i); ! 52: for (i = 1; i < LINKSLOTS; i++) ! 53: num_links_traced += links(i) * i; ! 54: num_links_traced += getprof(BIGLINKS); ! 55: */ ! 56: ! 57: for (i = 0; i < RECORDSLOTS; i++) ! 58: num_records += records(i); ! 59: for (i = 1; i < RECORDSLOTS; i++) ! 60: space_records += records(i) * (i+1); ! 61: space_records += getprof(RECORDOVFL) + records(0); ! 62: ! 63: for (i = 0; i < SPILLSLOTS; i++) ! 64: num_spills += spills(i); ! 65: for (i = 1; i < SPILLSLOTS; i++) ! 66: space_spills += spills(i) * (i+1); ! 67: space_spills += getprof(SPILLOVFL) + spills(0); ! 68: total = space_closures + space_records + space_spills ! 69: + getprof(ARRAYSIZE) + getprof(ARRAYS) ! 70: + getprof(STRINGSIZE) + getprof(STRINGS) ! 71: + getprof(REFCELLS) * 2 ! 72: + getprof(REFLISTS) * 2; ! 73: ! 74: descriptors = num_closures + num_records + num_spills ! 75: + getprof(ARRAYS) + getprof(STRINGS)+ getprof(REFCELLS); ! 76: ! 77: ! 78: for (i = 0; i < ARITHSLOTS; i++) ! 79: num_arith_ops += arith(i); ! 80: for (i = 1; i < ARITHSLOTS; i++) ! 81: num_arith_ovh += arith(i) * i; ! 82: ! 83: } ! 84: ! 85: print_alloc_info() ! 86: { ! 87: int k; float f; ! 88: char *s,*s1; ! 89: ! 90: printf("\nProfiling information:\n\n"); ! 91: ! 92: printf("%d function calls:\n",num_calls); ! 93: printf("%d known (%.1f%%),\n%d stdk (%.1f%%),\n", ! 94: getprof(KNOWNCALLS),100.0*getprof(KNOWNCALLS)/num_calls, ! 95: getprof(STDKCALLS),100.0*getprof(STDKCALLS)/num_calls); ! 96: printf("%d continuation (%.1f%%),\n%d std (%.1f%%).\n\n", ! 97: getprof(CNTCALLS),100.0*getprof(CNTCALLS)/num_calls, ! 98: getprof(STDCALLS),100.0*getprof(STDCALLS)/num_calls); ! 99: ! 100: printf("Maximum heap size %dk\n",arenasize/1024); ! 101: printf("Heap allocations: (only total sizes include descriptors)\n"); ! 102: printf("Total size %d; %d descriptors accounted for %.1f%%.\n\n", ! 103: total, descriptors, 100.0*descriptors/total); ! 104: ! 105: printf(" Size Number %% total Total size %% total\n\n"); ! 106: ! 107: if (num_closures > 0) { ! 108: printf("Closures:\n"); ! 109: for (k = 1; k < CLOSURESLOTS; k++) ! 110: if (closures(k) > 0) ! 111: printf("%6d%9d%9.1f%%%13d%10.1f%%\n", ! 112: k, ! 113: closures(k), ! 114: 100.0*closures(k)/num_closures, ! 115: closures(k) * (k+1), ! 116: 100.0*(closures(k)*(k+1))/total); ! 117: if (closures(0) > 0) ! 118: printf(">%5d%9d%9.1f%%%13d%10.1f%%\n", ! 119: CLOSURESLOTS - 1, ! 120: closures(0), ! 121: 100.0*closures(0)/num_closures, ! 122: getprof(CLOSUREOVFL)+closures(0), ! 123: 100.0*(getprof(CLOSUREOVFL)+closures(0))/total); ! 124: printf("Total:%9d%23d%10.1f%% Average size %.2f\n\n", ! 125: num_closures, space_closures, 100.0*space_closures/total, ! 126: (float)(space_closures-num_closures)/num_closures); ! 127: } ! 128: ! 129: if (num_records > 0) { ! 130: printf("Records:\n"); ! 131: for (k = 1; k < RECORDSLOTS; k++) ! 132: if (records(k) > 0) ! 133: printf("%6d%9d%9.1f%%%13d%10.1f%%\n", ! 134: k, ! 135: records(k), ! 136: 100.0*records(k)/num_records, ! 137: records(k) * (k+1), ! 138: 100.0*(records(k) * (k+1)) / total); ! 139: if (records(0) > 0) ! 140: printf(">%5d%9d%9.1f%%%13d%10.1f%%\n", ! 141: RECORDSLOTS - 1, ! 142: records(0), ! 143: 100.0*records(0)/num_records, ! 144: getprof(RECORDOVFL) + records(0), ! 145: 100.0*(getprof(RECORDOVFL) + records(0)) / total); ! 146: printf("Total:%9d%23d%10.1f%% Average size %.2f\n\n", ! 147: num_records,space_records,100.0*space_records/total, ! 148: (float)(space_records-num_records)/num_records); ! 149: } ! 150: ! 151: if (num_spills > 0) { ! 152: printf("Spills:\n"); ! 153: for (k = 1; k < SPILLSLOTS; k++) ! 154: if (spills(k) > 0) ! 155: printf("%6d%9d%9.1f%%%13d%10.1f%%\n", ! 156: k, ! 157: spills(k), ! 158: 100.0*spills(k)/num_spills, ! 159: spills(k) * (k+1), ! 160: 100.0*(spills(k) * (k+1)) / total); ! 161: if (spills(0) > 0) ! 162: printf(">%5d%9d%9.1f%%%13d%10.1f%%\n", ! 163: SPILLSLOTS - 1, ! 164: spills(0), ! 165: 100.0*spills(0)/num_spills, ! 166: getprof(SPILLOVFL) + spills(0), ! 167: 100.0*(getprof(SPILLOVFL) + spills(0)) / total); ! 168: printf("Total:%9d%23d%10.1f%% Average size %.2f\n\n", ! 169: num_spills,space_spills,100.0*space_spills/total, ! 170: (float)(space_spills-num_spills)/num_spills); ! 171: } ! 172: ! 173: if (getprof(ARRAYS)) ! 174: printf("Arrays:%8d%23d%10.1f%% Average size %.2f\n", ! 175: getprof(ARRAYS), ! 176: getprof(ARRAYSIZE) + getprof(ARRAYS), ! 177: 100.0*(getprof(ARRAYSIZE) + getprof(ARRAYS)) / total, ! 178: (float)getprof(ARRAYSIZE)/getprof(ARRAYS)); ! 179: ! 180: if (getprof(STRINGS)) ! 181: printf("Strings:%7d%23d%10.1f%% Average size %.2f\n", ! 182: getprof(STRINGS), ! 183: getprof(STRINGSIZE) + getprof(STRINGS), ! 184: 100.0*(getprof(STRINGSIZE) + getprof(STRINGS)) / total, ! 185: (float)getprof(STRINGSIZE)/getprof(STRINGS)); ! 186: ! 187: if (getprof(REFCELLS)) ! 188: printf("Refs:%10d%23d%10.1f%%\n", ! 189: getprof(REFCELLS), ! 190: getprof(REFCELLS)*2, ! 191: 100.0*(getprof(REFCELLS)*2) / total); ! 192: ! 193: if (getprof(REFLISTS)) ! 194: printf("Reflist\ncells:%9d%23d%10.1f%%\n", ! 195: getprof(REFLISTS), ! 196: getprof(REFLISTS)*2, ! 197: 100.0*(getprof(REFLISTS)*2) / total); ! 198: ! 199: } ! 200: ! 201: ! 202: print_arith_info() ! 203: {int i; ! 204: printf("\n"); ! 205: printf("Arithmetic Overhead Information:\n"); ! 206: for(i=0;i<ARITHSLOTS;i++) ! 207: printf("Overhead %d: %9d\n",i,arith(i)); ! 208: printf( "Total Overhead: %9d\n",num_arith_ovh); ! 209: printf( "Total Operations:%8d\n",num_arith_ops); ! 210: printf("\n"); ! 211: } ! 212: ! 213: print_profile_info() ! 214: { ! 215: find_profile_info(); ! 216: if (num_closures > 0 || num_records > 0 || num_spills > 0 || num_calls > 0) ! 217: print_alloc_info(); ! 218: if (num_arith_ops > 0) ! 219: print_arith_info(); ! 220: } ! 221: ! 222: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.