Home | History | Annotate | Download | only in src
      1 // Copyright 2012 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "src/counters.h"
      6 
      7 #include "src/base/platform/platform.h"
      8 #include "src/isolate.h"
      9 #include "src/log-inl.h"
     10 
     11 namespace v8 {
     12 namespace internal {
     13 
     14 StatsTable::StatsTable()
     15     : lookup_function_(NULL),
     16       create_histogram_function_(NULL),
     17       add_histogram_sample_function_(NULL) {}
     18 
     19 
     20 int* StatsCounter::FindLocationInStatsTable() const {
     21   return isolate_->stats_table()->FindLocation(name_);
     22 }
     23 
     24 
     25 void Histogram::AddSample(int sample) {
     26   if (Enabled()) {
     27     isolate()->stats_table()->AddHistogramSample(histogram_, sample);
     28   }
     29 }
     30 
     31 void* Histogram::CreateHistogram() const {
     32   return isolate()->stats_table()->
     33       CreateHistogram(name_, min_, max_, num_buckets_);
     34 }
     35 
     36 
     37 // Start the timer.
     38 void HistogramTimer::Start() {
     39   if (Enabled()) {
     40     timer_.Start();
     41   }
     42   Logger::CallEventLogger(isolate(), name(), Logger::START, true);
     43 }
     44 
     45 
     46 // Stop the timer and record the results.
     47 void HistogramTimer::Stop() {
     48   if (Enabled()) {
     49     int64_t sample = resolution_ == MICROSECOND
     50                          ? timer_.Elapsed().InMicroseconds()
     51                          : timer_.Elapsed().InMilliseconds();
     52     // Compute the delta between start and stop, in microseconds.
     53     AddSample(static_cast<int>(sample));
     54     timer_.Stop();
     55   }
     56   Logger::CallEventLogger(isolate(), name(), Logger::END, true);
     57 }
     58 
     59 
     60 Counters::Counters(Isolate* isolate) {
     61 #define HR(name, caption, min, max, num_buckets) \
     62   name##_ = Histogram(#caption, min, max, num_buckets, isolate);
     63   HISTOGRAM_RANGE_LIST(HR)
     64 #undef HR
     65 
     66 #define HT(name, caption, max, res) \
     67   name##_ = HistogramTimer(#caption, 0, max, HistogramTimer::res, 50, isolate);
     68     HISTOGRAM_TIMER_LIST(HT)
     69 #undef HT
     70 
     71 #define AHT(name, caption) \
     72   name##_ = AggregatableHistogramTimer(#caption, 0, 10000000, 50, isolate);
     73     AGGREGATABLE_HISTOGRAM_TIMER_LIST(AHT)
     74 #undef AHT
     75 
     76 #define HP(name, caption) \
     77     name##_ = Histogram(#caption, 0, 101, 100, isolate);
     78     HISTOGRAM_PERCENTAGE_LIST(HP)
     79 #undef HP
     80 
     81 
     82 // Exponential histogram assigns bucket limits to points
     83 // p[1], p[2], ... p[n] such that p[i+1] / p[i] = constant.
     84 // The constant factor is equal to the n-th root of (high / low),
     85 // where the n is the number of buckets, the low is the lower limit,
     86 // the high is the upper limit.
     87 // For n = 50, low = 1000, high = 500000: the factor = 1.13.
     88 #define HM(name, caption) \
     89     name##_ = Histogram(#caption, 1000, 500000, 50, isolate);
     90   HISTOGRAM_LEGACY_MEMORY_LIST(HM)
     91 #undef HM
     92 // For n = 100, low = 4000, high = 2000000: the factor = 1.06.
     93 #define HM(name, caption) \
     94   name##_ = Histogram(#caption, 4000, 2000000, 100, isolate);
     95   HISTOGRAM_MEMORY_LIST(HM)
     96 #undef HM
     97 
     98 #define HM(name, caption) \
     99   aggregated_##name##_ = AggregatedMemoryHistogram<Histogram>(&name##_);
    100     HISTOGRAM_MEMORY_LIST(HM)
    101 #undef HM
    102 
    103 #define SC(name, caption) \
    104     name##_ = StatsCounter(isolate, "c:" #caption);
    105 
    106     STATS_COUNTER_LIST_1(SC)
    107     STATS_COUNTER_LIST_2(SC)
    108 #undef SC
    109 
    110 #define SC(name) \
    111     count_of_##name##_ = StatsCounter(isolate, "c:" "V8.CountOf_" #name); \
    112     size_of_##name##_ = StatsCounter(isolate, "c:" "V8.SizeOf_" #name);
    113     INSTANCE_TYPE_LIST(SC)
    114 #undef SC
    115 
    116 #define SC(name) \
    117     count_of_CODE_TYPE_##name##_ = \
    118         StatsCounter(isolate, "c:" "V8.CountOf_CODE_TYPE-" #name); \
    119     size_of_CODE_TYPE_##name##_ = \
    120         StatsCounter(isolate, "c:" "V8.SizeOf_CODE_TYPE-" #name);
    121     CODE_KIND_LIST(SC)
    122 #undef SC
    123 
    124 #define SC(name) \
    125     count_of_FIXED_ARRAY_##name##_ = \
    126         StatsCounter(isolate, "c:" "V8.CountOf_FIXED_ARRAY-" #name); \
    127     size_of_FIXED_ARRAY_##name##_ = \
    128         StatsCounter(isolate, "c:" "V8.SizeOf_FIXED_ARRAY-" #name);
    129     FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(SC)
    130 #undef SC
    131 
    132 #define SC(name) \
    133     count_of_CODE_AGE_##name##_ = \
    134         StatsCounter(isolate, "c:" "V8.CountOf_CODE_AGE-" #name); \
    135     size_of_CODE_AGE_##name##_ = \
    136         StatsCounter(isolate, "c:" "V8.SizeOf_CODE_AGE-" #name);
    137     CODE_AGE_LIST_COMPLETE(SC)
    138 #undef SC
    139 }
    140 
    141 
    142 void Counters::ResetCounters() {
    143 #define SC(name, caption) name##_.Reset();
    144   STATS_COUNTER_LIST_1(SC)
    145   STATS_COUNTER_LIST_2(SC)
    146 #undef SC
    147 
    148 #define SC(name)              \
    149   count_of_##name##_.Reset(); \
    150   size_of_##name##_.Reset();
    151   INSTANCE_TYPE_LIST(SC)
    152 #undef SC
    153 
    154 #define SC(name)                        \
    155   count_of_CODE_TYPE_##name##_.Reset(); \
    156   size_of_CODE_TYPE_##name##_.Reset();
    157   CODE_KIND_LIST(SC)
    158 #undef SC
    159 
    160 #define SC(name)                          \
    161   count_of_FIXED_ARRAY_##name##_.Reset(); \
    162   size_of_FIXED_ARRAY_##name##_.Reset();
    163   FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(SC)
    164 #undef SC
    165 
    166 #define SC(name)                       \
    167   count_of_CODE_AGE_##name##_.Reset(); \
    168   size_of_CODE_AGE_##name##_.Reset();
    169   CODE_AGE_LIST_COMPLETE(SC)
    170 #undef SC
    171 }
    172 
    173 
    174 void Counters::ResetHistograms() {
    175 #define HR(name, caption, min, max, num_buckets) name##_.Reset();
    176   HISTOGRAM_RANGE_LIST(HR)
    177 #undef HR
    178 
    179 #define HT(name, caption, max, res) name##_.Reset();
    180     HISTOGRAM_TIMER_LIST(HT)
    181 #undef HT
    182 
    183 #define AHT(name, caption) name##_.Reset();
    184     AGGREGATABLE_HISTOGRAM_TIMER_LIST(AHT)
    185 #undef AHT
    186 
    187 #define HP(name, caption) name##_.Reset();
    188     HISTOGRAM_PERCENTAGE_LIST(HP)
    189 #undef HP
    190 
    191 #define HM(name, caption) name##_.Reset();
    192     HISTOGRAM_LEGACY_MEMORY_LIST(HM)
    193 #undef HM
    194 }
    195 
    196 }  // namespace internal
    197 }  // namespace v8
    198