Changeset 45040f06


Ignore:
Timestamp:
May 25, 2018, 2:10:02 PM (6 years ago)
Author:
Aaron Moss <a3moss@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, with_gc
Children:
58e822a
Parents:
34ca532
Message:

Add Peak Allocs column to heap statistics

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Common/Heap.cc

    r34ca532 r45040f06  
    2121#include <iostream>
    2222
    23 //#define WITH_HEAP_STATISTICS
     23#define WITH_HEAP_STATISTICS
    2424
    2525namespace HeapStats {
     
    3030#else
    3131        struct StatBlock {
    32                 const char * name = nullptr;
    33                 size_t mallocs    = 0;
    34                 size_t frees      = 0;
     32                const char * name  = nullptr;   ///< Name of this pass
     33                size_t mallocs     = 0;                 ///< Allocations in this pass
     34                size_t frees       = 0;                 ///< Frees in this pass
     35                size_t n_allocs    = 0;                 ///< Current number of live allocations
     36                size_t peak_allocs = 0;                 ///< Peak number of live allocations this pass
    3537        };
    3638
    37         StatBlock    passes[100] = {{ "Pre-Parse", 0, 0 }};
     39        StatBlock    passes[100] = {{ "Pre-Parse", 0, 0, 0, 0 }};
    3840        const size_t passes_size = sizeof(passes) / sizeof(passes[0]);
    3941        size_t       passes_cnt = 1;
     
    4345                passes[passes_cnt].mallocs = 0;
    4446                passes[passes_cnt].frees   = 0;
     47                passes[passes_cnt].n_allocs
     48                        = passes[passes_cnt].peak_allocs
     49                        = passes[passes_cnt-1].n_allocs;
    4550                passes_cnt++;
    4651
     
    5560        }
    5661
    57         void print(const StatBlock& stat, size_t nc, size_t total_mallocs, size_t total_frees) {
     62        void print(const StatBlock& stat, size_t nc, size_t total_mallocs, size_t total_frees, size_t overall_peak) {
    5863                std::cerr << std::setw(nc) << stat.name;
    5964                std::cerr << " | ";
    6065
    61                 print(stat.mallocs, total_mallocs);
    62                 print(stat.frees  , total_frees  );
     66                print(stat.mallocs,     total_mallocs);
     67                print(stat.frees,       total_frees  );
     68                print(stat.peak_allocs, overall_peak );
    6369                std::cerr << "\n";
    6470        }
     
    7581                size_t total_mallocs = 0;
    7682                size_t total_frees   = 0;
     83                size_t overall_peak  = 0;
    7784                for(size_t i = 0; i < passes_cnt; i++) {
    7885                        nc = std::max(nc, std::strlen(passes[i].name));
    7986                        total_mallocs += passes[i].mallocs;
    8087                        total_frees   += passes[i].frees;
    81                 }
    82                 size_t nct = nc + 44;
     88                        overall_peak = std::max(overall_peak, passes[i].peak_allocs);
     89                }
     90                size_t nct = nc + 65;
    8391
    8492                const char * const title = "Heap Usage Statistic";
     
    8896                print('-', nct);
    8997                std::cerr << std::setw(nc) << "Pass";
    90                 std::cerr << " |       Malloc Count |         Free Count |" << std::endl;
     98                std::cerr << " |       Malloc Count |         Free Count |        Peak Allocs |" << std::endl;
    9199
    92100                print('-', nct);
    93101                for(size_t i = 0; i < passes_cnt; i++) {
    94                         print(passes[i], nc, total_mallocs, total_frees);
     102                        print(passes[i], nc, total_mallocs, total_frees, overall_peak);
    95103                }
    96104                print('-', nct);
    97                 print({"Sum", total_mallocs, total_frees}, nc, total_mallocs, total_frees);
     105                print({"Sum", total_mallocs, total_frees, 0, overall_peak},
     106                        nc, total_mallocs, total_frees, overall_peak);
    98107
    99108        }
     
    158167                void * malloc( size_t size ) {
    159168                        static auto __malloc = reinterpret_cast<void * (*)(size_t)>(interpose_symbol( "malloc", nullptr ));
    160                         if( passes_cnt > 0 ) passes[passes_cnt - 1].mallocs++;
     169                        if( passes_cnt > 0 ) {
     170                                passes[passes_cnt - 1].mallocs++;
     171                                passes[passes_cnt - 1].n_allocs++;
     172                                passes[passes_cnt - 1].peak_allocs
     173                                        = std::max(passes[passes_cnt - 1].peak_allocs, passes[passes_cnt - 1].n_allocs);
     174                        }
    161175                        return __malloc( size );
    162176                }
     
    164178                void free( void * ptr ) {
    165179                        static auto __free = reinterpret_cast<void   (*)(void *)>(interpose_symbol( "free", nullptr ));
    166                         if( passes_cnt > 0 ) passes[passes_cnt - 1].frees++;
     180                        if( passes_cnt > 0 ) {
     181                                passes[passes_cnt - 1].frees++;
     182                                passes[passes_cnt - 1].n_allocs--;
     183                        }
    167184                        return __free( ptr );
    168185                }
     
    170187                void * calloc( size_t nelem, size_t size ) {
    171188                        static auto __calloc = reinterpret_cast<void * (*)(size_t, size_t)>(interpose_symbol( "calloc", nullptr ));
    172                         if( passes_cnt > 0 ) passes[passes_cnt - 1].mallocs++;
     189                        if( passes_cnt > 0 ) {
     190                                passes[passes_cnt - 1].mallocs++;
     191                                passes[passes_cnt - 1].n_allocs++;
     192                                passes[passes_cnt - 1].peak_allocs
     193                                        = std::max(passes[passes_cnt - 1].peak_allocs, passes[passes_cnt - 1].n_allocs);
     194                        }
    173195                        return __calloc( nelem, size );
    174196                }
Note: See TracChangeset for help on using the changeset viewer.