| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_COUNTERS_H_ | 5 #ifndef V8_COUNTERS_H_ |
| 6 #define V8_COUNTERS_H_ | 6 #define V8_COUNTERS_H_ |
| 7 | 7 |
| 8 #include "include/v8.h" | 8 #include "include/v8.h" |
| 9 #include "src/allocation.h" | 9 #include "src/allocation.h" |
| 10 #include "src/base/platform/elapsed-timer.h" | 10 #include "src/base/platform/elapsed-timer.h" |
| 11 #include "src/globals.h" | 11 #include "src/globals.h" |
| 12 #include "src/log.h" |
| 12 #include "src/objects.h" | 13 #include "src/objects.h" |
| 13 | 14 |
| 14 namespace v8 { | 15 namespace v8 { |
| 15 namespace internal { | 16 namespace internal { |
| 16 | 17 |
| 17 // StatsCounters is an interface for plugging into external | 18 // StatsCounters is an interface for plugging into external |
| 18 // counters for monitoring. Counters can be looked up and | 19 // counters for monitoring. Counters can be looked up and |
| 19 // manipulated by name. | 20 // manipulated by name. |
| 20 | 21 |
| 21 class StatsTable { | 22 class StatsTable { |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 int num_buckets_; | 218 int num_buckets_; |
| 218 void* histogram_; | 219 void* histogram_; |
| 219 bool lookup_done_; | 220 bool lookup_done_; |
| 220 Isolate* isolate_; | 221 Isolate* isolate_; |
| 221 }; | 222 }; |
| 222 | 223 |
| 223 // A HistogramTimer allows distributions of results to be created. | 224 // A HistogramTimer allows distributions of results to be created. |
| 224 class HistogramTimer : public Histogram { | 225 class HistogramTimer : public Histogram { |
| 225 public: | 226 public: |
| 226 HistogramTimer() { } | 227 HistogramTimer() { } |
| 227 HistogramTimer(const char* name, | 228 HistogramTimer(const char* name, int min, int max, int num_buckets, |
| 228 int min, | 229 Isolate* isolate, Logger::Overhead overhead) |
| 229 int max, | 230 : Histogram(name, min, max, num_buckets, isolate), overhead_(overhead) {} |
| 230 int num_buckets, | |
| 231 Isolate* isolate) | |
| 232 : Histogram(name, min, max, num_buckets, isolate) {} | |
| 233 | 231 |
| 234 // Start the timer. | 232 // Start the timer. |
| 235 void Start(); | 233 void Start(); |
| 236 | 234 |
| 237 // Stop the timer and record the results. | 235 // Stop the timer and record the results. |
| 238 void Stop(); | 236 void Stop(); |
| 239 | 237 |
| 240 // Returns true if the timer is running. | 238 // Returns true if the timer is running. |
| 241 bool Running() { | 239 bool Running() { |
| 242 return Enabled() && timer_.IsStarted(); | 240 return Enabled() && timer_.IsStarted(); |
| 243 } | 241 } |
| 244 | 242 |
| 243 Logger::Overhead overhead() { return overhead_; } |
| 244 |
| 245 // TODO(bmeurer): Remove this when HistogramTimerScope is fixed. | 245 // TODO(bmeurer): Remove this when HistogramTimerScope is fixed. |
| 246 #ifdef DEBUG | 246 #ifdef DEBUG |
| 247 base::ElapsedTimer* timer() { return &timer_; } | 247 base::ElapsedTimer* timer() { return &timer_; } |
| 248 #endif | 248 #endif |
| 249 | 249 |
| 250 private: | 250 private: |
| 251 base::ElapsedTimer timer_; | 251 base::ElapsedTimer timer_; |
| 252 Logger::Overhead overhead_; |
| 252 }; | 253 }; |
| 253 | 254 |
| 254 // Helper class for scoping a HistogramTimer. | 255 // Helper class for scoping a HistogramTimer. |
| 255 // TODO(bmeurer): The ifdeffery is an ugly hack around the fact that the | 256 // TODO(bmeurer): The ifdeffery is an ugly hack around the fact that the |
| 256 // Parser is currently reentrant (when it throws an error, we call back | 257 // Parser is currently reentrant (when it throws an error, we call back |
| 257 // into JavaScript and all bets are off), but ElapsedTimer is not | 258 // into JavaScript and all bets are off), but ElapsedTimer is not |
| 258 // reentry-safe. Fix this properly and remove |allow_nesting|. | 259 // reentry-safe. Fix this properly and remove |allow_nesting|. |
| 259 class HistogramTimerScope BASE_EMBEDDED { | 260 class HistogramTimerScope BASE_EMBEDDED { |
| 260 public: | 261 public: |
| 261 explicit HistogramTimerScope(HistogramTimer* timer, | 262 explicit HistogramTimerScope(HistogramTimer* timer, |
| (...skipping 28 matching lines...) Expand all Loading... |
| 290 bool skipped_timer_start_; | 291 bool skipped_timer_start_; |
| 291 #endif | 292 #endif |
| 292 }; | 293 }; |
| 293 | 294 |
| 294 #define HISTOGRAM_RANGE_LIST(HR) \ | 295 #define HISTOGRAM_RANGE_LIST(HR) \ |
| 295 /* Generic range histograms */ \ | 296 /* Generic range histograms */ \ |
| 296 HR(gc_idle_time_allotted_in_ms, V8.GCIdleTimeAllottedInMS, 0, 10000, 101) \ | 297 HR(gc_idle_time_allotted_in_ms, V8.GCIdleTimeAllottedInMS, 0, 10000, 101) \ |
| 297 HR(gc_idle_time_limit_overshot, V8.GCIdleTimeLimit.Overshot, 0, 10000, 101) \ | 298 HR(gc_idle_time_limit_overshot, V8.GCIdleTimeLimit.Overshot, 0, 10000, 101) \ |
| 298 HR(gc_idle_time_limit_undershot, V8.GCIdleTimeLimit.Undershot, 0, 10000, 101) | 299 HR(gc_idle_time_limit_undershot, V8.GCIdleTimeLimit.Undershot, 0, 10000, 101) |
| 299 | 300 |
| 300 #define HISTOGRAM_TIMER_LIST(HT) \ | 301 #define HISTOGRAM_TIMER_LIST(HT) \ |
| 301 /* Garbage collection timers. */ \ | 302 /* Garbage collection timers. */ \ |
| 302 HT(gc_compactor, V8.GCCompactor) \ | 303 HT(gc_compactor, V8.GCCompactor, LOW) \ |
| 303 HT(gc_scavenger, V8.GCScavenger) \ | 304 HT(gc_scavenger, V8.GCScavenger, LOW) \ |
| 304 HT(gc_context, V8.GCContext) /* GC context cleanup time */ \ | 305 HT(gc_context, V8.GCContext, NORMAL) /* GC context cleanup time */ \ |
| 305 HT(gc_idle_notification, V8.GCIdleNotification) \ | 306 HT(gc_idle_notification, V8.GCIdleNotification, LOW) \ |
| 306 HT(gc_incremental_marking, V8.GCIncrementalMarking) \ | 307 HT(gc_incremental_marking, V8.GCIncrementalMarking, LOW) \ |
| 307 HT(gc_low_memory_notification, V8.GCLowMemoryNotification) \ | 308 HT(gc_low_memory_notification, V8.GCLowMemoryNotification, NORMAL) \ |
| 308 /* Parsing timers. */ \ | 309 /* Parsing timers. */ \ |
| 309 HT(parse, V8.Parse) \ | 310 HT(parse, V8.Parse, NORMAL) \ |
| 310 HT(parse_lazy, V8.ParseLazy) \ | 311 HT(parse_lazy, V8.ParseLazy, NORMAL) \ |
| 311 HT(pre_parse, V8.PreParse) \ | 312 HT(pre_parse, V8.PreParse, NORMAL) \ |
| 312 /* Total compilation times. */ \ | 313 /* Total compilation times. */ \ |
| 313 HT(compile, V8.Compile) \ | 314 HT(compile, V8.Compile, NORMAL) \ |
| 314 HT(compile_eval, V8.CompileEval) \ | 315 HT(compile_eval, V8.CompileEval, NORMAL) \ |
| 315 /* Serialization as part of compilation (code caching) */ \ | 316 /* Serialization as part of compilation (code caching) */ \ |
| 316 HT(compile_serialize, V8.CompileSerialize) \ | 317 HT(compile_serialize, V8.CompileSerialize, NORMAL) \ |
| 317 HT(compile_deserialize, V8.CompileDeserialize) | 318 HT(compile_deserialize, V8.CompileDeserialize, NORMAL) |
| 318 | |
| 319 | 319 |
| 320 #define HISTOGRAM_PERCENTAGE_LIST(HP) \ | 320 #define HISTOGRAM_PERCENTAGE_LIST(HP) \ |
| 321 /* Heap fragmentation. */ \ | 321 /* Heap fragmentation. */ \ |
| 322 HP(external_fragmentation_total, \ | 322 HP(external_fragmentation_total, \ |
| 323 V8.MemoryExternalFragmentationTotal) \ | 323 V8.MemoryExternalFragmentationTotal) \ |
| 324 HP(external_fragmentation_old_pointer_space, \ | 324 HP(external_fragmentation_old_pointer_space, \ |
| 325 V8.MemoryExternalFragmentationOldPointerSpace) \ | 325 V8.MemoryExternalFragmentationOldPointerSpace) \ |
| 326 HP(external_fragmentation_old_data_space, \ | 326 HP(external_fragmentation_old_data_space, \ |
| 327 V8.MemoryExternalFragmentationOldDataSpace) \ | 327 V8.MemoryExternalFragmentationOldDataSpace) \ |
| 328 HP(external_fragmentation_code_space, \ | 328 HP(external_fragmentation_code_space, \ |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 555 | 555 |
| 556 | 556 |
| 557 // This file contains all the v8 counters that are in use. | 557 // This file contains all the v8 counters that are in use. |
| 558 class Counters { | 558 class Counters { |
| 559 public: | 559 public: |
| 560 #define HR(name, caption, min, max, num_buckets) \ | 560 #define HR(name, caption, min, max, num_buckets) \ |
| 561 Histogram* name() { return &name##_; } | 561 Histogram* name() { return &name##_; } |
| 562 HISTOGRAM_RANGE_LIST(HR) | 562 HISTOGRAM_RANGE_LIST(HR) |
| 563 #undef HR | 563 #undef HR |
| 564 | 564 |
| 565 #define HT(name, caption) \ | 565 #define HT(name, caption, overhead) \ |
| 566 HistogramTimer* name() { return &name##_; } | 566 HistogramTimer* name() { return &name##_; } |
| 567 HISTOGRAM_TIMER_LIST(HT) | 567 HISTOGRAM_TIMER_LIST(HT) |
| 568 #undef HT | 568 #undef HT |
| 569 | 569 |
| 570 #define HP(name, caption) \ | 570 #define HP(name, caption) \ |
| 571 Histogram* name() { return &name##_; } | 571 Histogram* name() { return &name##_; } |
| 572 HISTOGRAM_PERCENTAGE_LIST(HP) | 572 HISTOGRAM_PERCENTAGE_LIST(HP) |
| 573 #undef HP | 573 #undef HP |
| 574 | 574 |
| 575 #define HM(name, caption) \ | 575 #define HM(name, caption) \ |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 607 | 607 |
| 608 #define SC(name) \ | 608 #define SC(name) \ |
| 609 StatsCounter* count_of_CODE_AGE_##name() \ | 609 StatsCounter* count_of_CODE_AGE_##name() \ |
| 610 { return &count_of_CODE_AGE_##name##_; } \ | 610 { return &count_of_CODE_AGE_##name##_; } \ |
| 611 StatsCounter* size_of_CODE_AGE_##name() \ | 611 StatsCounter* size_of_CODE_AGE_##name() \ |
| 612 { return &size_of_CODE_AGE_##name##_; } | 612 { return &size_of_CODE_AGE_##name##_; } |
| 613 CODE_AGE_LIST_COMPLETE(SC) | 613 CODE_AGE_LIST_COMPLETE(SC) |
| 614 #undef SC | 614 #undef SC |
| 615 | 615 |
| 616 enum Id { | 616 enum Id { |
| 617 #define RATE_ID(name, caption) k_##name, | 617 #define RATE_ID(name, caption, overhead) k_##name, |
| 618 HISTOGRAM_TIMER_LIST(RATE_ID) | 618 HISTOGRAM_TIMER_LIST(RATE_ID) |
| 619 #undef RATE_ID | 619 #undef RATE_ID |
| 620 #define PERCENTAGE_ID(name, caption) k_##name, | 620 #define PERCENTAGE_ID(name, caption) k_##name, |
| 621 HISTOGRAM_PERCENTAGE_LIST(PERCENTAGE_ID) | 621 HISTOGRAM_PERCENTAGE_LIST(PERCENTAGE_ID) |
| 622 #undef PERCENTAGE_ID | 622 #undef PERCENTAGE_ID |
| 623 #define MEMORY_ID(name, caption) k_##name, | 623 #define MEMORY_ID(name, caption) k_##name, |
| 624 HISTOGRAM_MEMORY_LIST(MEMORY_ID) | 624 HISTOGRAM_MEMORY_LIST(MEMORY_ID) |
| 625 #undef MEMORY_ID | 625 #undef MEMORY_ID |
| 626 #define COUNTER_ID(name, caption) k_##name, | 626 #define COUNTER_ID(name, caption) k_##name, |
| 627 STATS_COUNTER_LIST_1(COUNTER_ID) | 627 STATS_COUNTER_LIST_1(COUNTER_ID) |
| (...skipping 18 matching lines...) Expand all Loading... |
| 646 }; | 646 }; |
| 647 | 647 |
| 648 void ResetCounters(); | 648 void ResetCounters(); |
| 649 void ResetHistograms(); | 649 void ResetHistograms(); |
| 650 | 650 |
| 651 private: | 651 private: |
| 652 #define HR(name, caption, min, max, num_buckets) Histogram name##_; | 652 #define HR(name, caption, min, max, num_buckets) Histogram name##_; |
| 653 HISTOGRAM_RANGE_LIST(HR) | 653 HISTOGRAM_RANGE_LIST(HR) |
| 654 #undef HR | 654 #undef HR |
| 655 | 655 |
| 656 #define HT(name, caption) \ | 656 #define HT(name, caption, overhead) \ |
| 657 HistogramTimer name##_; | 657 HistogramTimer name##_; |
| 658 HISTOGRAM_TIMER_LIST(HT) | 658 HISTOGRAM_TIMER_LIST(HT) |
| 659 #undef HT | 659 #undef HT |
| 660 | 660 |
| 661 #define HP(name, caption) \ | 661 #define HP(name, caption) \ |
| 662 Histogram name##_; | 662 Histogram name##_; |
| 663 HISTOGRAM_PERCENTAGE_LIST(HP) | 663 HISTOGRAM_PERCENTAGE_LIST(HP) |
| 664 #undef HP | 664 #undef HP |
| 665 | 665 |
| 666 #define HM(name, caption) \ | 666 #define HM(name, caption) \ |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 friend class Isolate; | 701 friend class Isolate; |
| 702 | 702 |
| 703 explicit Counters(Isolate* isolate); | 703 explicit Counters(Isolate* isolate); |
| 704 | 704 |
| 705 DISALLOW_IMPLICIT_CONSTRUCTORS(Counters); | 705 DISALLOW_IMPLICIT_CONSTRUCTORS(Counters); |
| 706 }; | 706 }; |
| 707 | 707 |
| 708 } } // namespace v8::internal | 708 } } // namespace v8::internal |
| 709 | 709 |
| 710 #endif // V8_COUNTERS_H_ | 710 #endif // V8_COUNTERS_H_ |
| OLD | NEW |