| 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" |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 int max_; | 217 int max_; |
| 218 int num_buckets_; | 218 int num_buckets_; |
| 219 void* histogram_; | 219 void* histogram_; |
| 220 bool lookup_done_; | 220 bool lookup_done_; |
| 221 Isolate* isolate_; | 221 Isolate* isolate_; |
| 222 }; | 222 }; |
| 223 | 223 |
| 224 // A HistogramTimer allows distributions of results to be created. | 224 // A HistogramTimer allows distributions of results to be created. |
| 225 class HistogramTimer : public Histogram { | 225 class HistogramTimer : public Histogram { |
| 226 public: | 226 public: |
| 227 HistogramTimer() { } | 227 enum Resolution { |
| 228 HistogramTimer(const char* name, | 228 MILLISECOND, |
| 229 int min, | 229 MICROSECOND |
| 230 int max, | 230 }; |
| 231 int num_buckets, | 231 |
| 232 Isolate* isolate) | 232 HistogramTimer() {} |
| 233 : Histogram(name, min, max, num_buckets, isolate) {} | 233 HistogramTimer(const char* name, int min, int max, Resolution resolution, |
| 234 int num_buckets, Isolate* isolate) |
| 235 : Histogram(name, min, max, num_buckets, isolate), |
| 236 resolution_(resolution) {} |
| 234 | 237 |
| 235 // Start the timer. | 238 // Start the timer. |
| 236 void Start(); | 239 void Start(); |
| 237 | 240 |
| 238 // Stop the timer and record the results. | 241 // Stop the timer and record the results. |
| 239 void Stop(); | 242 void Stop(); |
| 240 | 243 |
| 241 // Returns true if the timer is running. | 244 // Returns true if the timer is running. |
| 242 bool Running() { | 245 bool Running() { |
| 243 return Enabled() && timer_.IsStarted(); | 246 return Enabled() && timer_.IsStarted(); |
| 244 } | 247 } |
| 245 | 248 |
| 246 // TODO(bmeurer): Remove this when HistogramTimerScope is fixed. | 249 // TODO(bmeurer): Remove this when HistogramTimerScope is fixed. |
| 247 #ifdef DEBUG | 250 #ifdef DEBUG |
| 248 base::ElapsedTimer* timer() { return &timer_; } | 251 base::ElapsedTimer* timer() { return &timer_; } |
| 249 #endif | 252 #endif |
| 250 | 253 |
| 251 private: | 254 private: |
| 252 base::ElapsedTimer timer_; | 255 base::ElapsedTimer timer_; |
| 256 Resolution resolution_; |
| 253 }; | 257 }; |
| 254 | 258 |
| 255 // Helper class for scoping a HistogramTimer. | 259 // Helper class for scoping a HistogramTimer. |
| 256 // TODO(bmeurer): The ifdeffery is an ugly hack around the fact that the | 260 // TODO(bmeurer): The ifdeffery is an ugly hack around the fact that the |
| 257 // Parser is currently reentrant (when it throws an error, we call back | 261 // Parser is currently reentrant (when it throws an error, we call back |
| 258 // into JavaScript and all bets are off), but ElapsedTimer is not | 262 // into JavaScript and all bets are off), but ElapsedTimer is not |
| 259 // reentry-safe. Fix this properly and remove |allow_nesting|. | 263 // reentry-safe. Fix this properly and remove |allow_nesting|. |
| 260 class HistogramTimerScope BASE_EMBEDDED { | 264 class HistogramTimerScope BASE_EMBEDDED { |
| 261 public: | 265 public: |
| 262 explicit HistogramTimerScope(HistogramTimer* timer, | 266 explicit HistogramTimerScope(HistogramTimer* timer, |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 // events to be timed. | 312 // events to be timed. |
| 309 class AggregatableHistogramTimer : public Histogram { | 313 class AggregatableHistogramTimer : public Histogram { |
| 310 public: | 314 public: |
| 311 AggregatableHistogramTimer() {} | 315 AggregatableHistogramTimer() {} |
| 312 AggregatableHistogramTimer(const char* name, int min, int max, | 316 AggregatableHistogramTimer(const char* name, int min, int max, |
| 313 int num_buckets, Isolate* isolate) | 317 int num_buckets, Isolate* isolate) |
| 314 : Histogram(name, min, max, num_buckets, isolate) {} | 318 : Histogram(name, min, max, num_buckets, isolate) {} |
| 315 | 319 |
| 316 // Start/stop the "outer" scope. | 320 // Start/stop the "outer" scope. |
| 317 void Start() { time_ = base::TimeDelta(); } | 321 void Start() { time_ = base::TimeDelta(); } |
| 318 void Stop() { AddSample(static_cast<int>(time_.InMilliseconds())); } | 322 void Stop() { AddSample(static_cast<int>(time_.InMicroseconds())); } |
| 319 | 323 |
| 320 // Add a time value ("inner" scope). | 324 // Add a time value ("inner" scope). |
| 321 void Add(base::TimeDelta other) { time_ += other; } | 325 void Add(base::TimeDelta other) { time_ += other; } |
| 322 | 326 |
| 323 private: | 327 private: |
| 324 base::TimeDelta time_; | 328 base::TimeDelta time_; |
| 325 }; | 329 }; |
| 326 | 330 |
| 327 | 331 |
| 328 // A helper class for use with AggregatableHistogramTimer. | 332 // A helper class for use with AggregatableHistogramTimer. |
| (...skipping 24 matching lines...) Expand all Loading... |
| 353 AggregatableHistogramTimer* histogram_; | 357 AggregatableHistogramTimer* histogram_; |
| 354 }; | 358 }; |
| 355 | 359 |
| 356 | 360 |
| 357 #define HISTOGRAM_RANGE_LIST(HR) \ | 361 #define HISTOGRAM_RANGE_LIST(HR) \ |
| 358 /* Generic range histograms */ \ | 362 /* Generic range histograms */ \ |
| 359 HR(gc_idle_time_allotted_in_ms, V8.GCIdleTimeAllottedInMS, 0, 10000, 101) \ | 363 HR(gc_idle_time_allotted_in_ms, V8.GCIdleTimeAllottedInMS, 0, 10000, 101) \ |
| 360 HR(gc_idle_time_limit_overshot, V8.GCIdleTimeLimit.Overshot, 0, 10000, 101) \ | 364 HR(gc_idle_time_limit_overshot, V8.GCIdleTimeLimit.Overshot, 0, 10000, 101) \ |
| 361 HR(gc_idle_time_limit_undershot, V8.GCIdleTimeLimit.Undershot, 0, 10000, 101) | 365 HR(gc_idle_time_limit_undershot, V8.GCIdleTimeLimit.Undershot, 0, 10000, 101) |
| 362 | 366 |
| 363 #define HISTOGRAM_TIMER_LIST(HT) \ | 367 #define HISTOGRAM_TIMER_LIST(HT) \ |
| 364 /* Garbage collection timers. */ \ | 368 /* Garbage collection timers. */ \ |
| 365 HT(gc_compactor, V8.GCCompactor) \ | 369 HT(gc_compactor, V8.GCCompactor, 10000, MILLISECOND) \ |
| 366 HT(gc_scavenger, V8.GCScavenger) \ | 370 HT(gc_scavenger, V8.GCScavenger, 10000, MILLISECOND) \ |
| 367 HT(gc_context, V8.GCContext) /* GC context cleanup time */ \ | 371 HT(gc_context, V8.GCContext, 10000, \ |
| 368 HT(gc_idle_notification, V8.GCIdleNotification) \ | 372 MILLISECOND) /* GC context cleanup time */ \ |
| 369 HT(gc_incremental_marking, V8.GCIncrementalMarking) \ | 373 HT(gc_idle_notification, V8.GCIdleNotification, 10000, MILLISECOND) \ |
| 370 HT(gc_low_memory_notification, V8.GCLowMemoryNotification) \ | 374 HT(gc_incremental_marking, V8.GCIncrementalMarking, 10000, MILLISECOND) \ |
| 371 /* Parsing timers. */ \ | 375 HT(gc_low_memory_notification, V8.GCLowMemoryNotification, 10000, \ |
| 372 HT(parse, V8.Parse) \ | 376 MILLISECOND) \ |
| 373 HT(parse_lazy, V8.ParseLazy) \ | 377 /* Parsing timers. */ \ |
| 374 HT(pre_parse, V8.PreParse) \ | 378 HT(parse, V8.ParseMicroSeconds, 1000000, MICROSECOND) \ |
| 375 /* Compilation times. */ \ | 379 HT(parse_lazy, V8.ParseLazyMicroSeconds, 1000000, MICROSECOND) \ |
| 376 HT(compile, V8.Compile) \ | 380 HT(pre_parse, V8.PreParseMicroSeconds, 1000000, MICROSECOND) \ |
| 377 HT(compile_eval, V8.CompileEval) \ | 381 /* Compilation times. */ \ |
| 378 /* Serialization as part of compilation (code caching) */ \ | 382 HT(compile, V8.CompileMicroSeconds, 1000000, MICROSECOND) \ |
| 379 HT(compile_serialize, V8.CompileSerialize) \ | 383 HT(compile_eval, V8.CompileEvalMicroSeconds, 1000000, MICROSECOND) \ |
| 380 HT(compile_deserialize, V8.CompileDeserialize) \ | 384 /* Serialization as part of compilation (code caching) */ \ |
| 381 /* Total compilation time incl. caching/parsing */ \ | 385 HT(compile_serialize, V8.CompileSerializeMicroSeconds, 100000, MICROSECOND) \ |
| 382 HT(compile_script, V8.CompileScript) | 386 HT(compile_deserialize, V8.CompileDeserializeMicroSeconds, 1000000, \ |
| 387 MICROSECOND) \ |
| 388 /* Total compilation time incl. caching/parsing */ \ |
| 389 HT(compile_script, V8.CompileScriptMicroSeconds, 1000000, MICROSECOND) |
| 383 | 390 |
| 384 | 391 |
| 385 #define AGGREGATABLE_HISTOGRAM_TIMER_LIST(AHT) \ | 392 #define AGGREGATABLE_HISTOGRAM_TIMER_LIST(AHT) \ |
| 386 AHT(compile_lazy, V8.CompileLazy) | 393 AHT(compile_lazy, V8.CompileLazyMicroSeconds) |
| 387 | 394 |
| 388 | 395 |
| 389 #define HISTOGRAM_PERCENTAGE_LIST(HP) \ | 396 #define HISTOGRAM_PERCENTAGE_LIST(HP) \ |
| 390 /* Heap fragmentation. */ \ | 397 /* Heap fragmentation. */ \ |
| 391 HP(external_fragmentation_total, \ | 398 HP(external_fragmentation_total, \ |
| 392 V8.MemoryExternalFragmentationTotal) \ | 399 V8.MemoryExternalFragmentationTotal) \ |
| 393 HP(external_fragmentation_old_pointer_space, \ | 400 HP(external_fragmentation_old_pointer_space, \ |
| 394 V8.MemoryExternalFragmentationOldPointerSpace) \ | 401 V8.MemoryExternalFragmentationOldPointerSpace) \ |
| 395 HP(external_fragmentation_old_data_space, \ | 402 HP(external_fragmentation_old_data_space, \ |
| 396 V8.MemoryExternalFragmentationOldDataSpace) \ | 403 V8.MemoryExternalFragmentationOldDataSpace) \ |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 624 | 631 |
| 625 | 632 |
| 626 // This file contains all the v8 counters that are in use. | 633 // This file contains all the v8 counters that are in use. |
| 627 class Counters { | 634 class Counters { |
| 628 public: | 635 public: |
| 629 #define HR(name, caption, min, max, num_buckets) \ | 636 #define HR(name, caption, min, max, num_buckets) \ |
| 630 Histogram* name() { return &name##_; } | 637 Histogram* name() { return &name##_; } |
| 631 HISTOGRAM_RANGE_LIST(HR) | 638 HISTOGRAM_RANGE_LIST(HR) |
| 632 #undef HR | 639 #undef HR |
| 633 | 640 |
| 634 #define HT(name, caption) \ | 641 #define HT(name, caption, max, res) \ |
| 635 HistogramTimer* name() { return &name##_; } | 642 HistogramTimer* name() { return &name##_; } |
| 636 HISTOGRAM_TIMER_LIST(HT) | 643 HISTOGRAM_TIMER_LIST(HT) |
| 637 #undef HT | 644 #undef HT |
| 638 | 645 |
| 639 #define AHT(name, caption) \ | 646 #define AHT(name, caption) \ |
| 640 AggregatableHistogramTimer* name() { return &name##_; } | 647 AggregatableHistogramTimer* name() { return &name##_; } |
| 641 AGGREGATABLE_HISTOGRAM_TIMER_LIST(AHT) | 648 AGGREGATABLE_HISTOGRAM_TIMER_LIST(AHT) |
| 642 #undef AHT | 649 #undef AHT |
| 643 | 650 |
| 644 #define HP(name, caption) \ | 651 #define HP(name, caption) \ |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 681 | 688 |
| 682 #define SC(name) \ | 689 #define SC(name) \ |
| 683 StatsCounter* count_of_CODE_AGE_##name() \ | 690 StatsCounter* count_of_CODE_AGE_##name() \ |
| 684 { return &count_of_CODE_AGE_##name##_; } \ | 691 { return &count_of_CODE_AGE_##name##_; } \ |
| 685 StatsCounter* size_of_CODE_AGE_##name() \ | 692 StatsCounter* size_of_CODE_AGE_##name() \ |
| 686 { return &size_of_CODE_AGE_##name##_; } | 693 { return &size_of_CODE_AGE_##name##_; } |
| 687 CODE_AGE_LIST_COMPLETE(SC) | 694 CODE_AGE_LIST_COMPLETE(SC) |
| 688 #undef SC | 695 #undef SC |
| 689 | 696 |
| 690 enum Id { | 697 enum Id { |
| 691 #define RATE_ID(name, caption) k_##name, | 698 #define RATE_ID(name, caption, max, res) k_##name, |
| 692 HISTOGRAM_TIMER_LIST(RATE_ID) | 699 HISTOGRAM_TIMER_LIST(RATE_ID) |
| 693 #undef RATE_ID | 700 #undef RATE_ID |
| 694 #define AGGREGATABLE_ID(name, caption) k_##name, | 701 #define AGGREGATABLE_ID(name, caption) k_##name, |
| 695 AGGREGATABLE_HISTOGRAM_TIMER_LIST(AGGREGATABLE_ID) | 702 AGGREGATABLE_HISTOGRAM_TIMER_LIST(AGGREGATABLE_ID) |
| 696 #undef AGGREGATABLE_ID | 703 #undef AGGREGATABLE_ID |
| 697 #define PERCENTAGE_ID(name, caption) k_##name, | 704 #define PERCENTAGE_ID(name, caption) k_##name, |
| 698 HISTOGRAM_PERCENTAGE_LIST(PERCENTAGE_ID) | 705 HISTOGRAM_PERCENTAGE_LIST(PERCENTAGE_ID) |
| 699 #undef PERCENTAGE_ID | 706 #undef PERCENTAGE_ID |
| 700 #define MEMORY_ID(name, caption) k_##name, | 707 #define MEMORY_ID(name, caption) k_##name, |
| 701 HISTOGRAM_MEMORY_LIST(MEMORY_ID) | 708 HISTOGRAM_MEMORY_LIST(MEMORY_ID) |
| (...skipping 21 matching lines...) Expand all Loading... |
| 723 }; | 730 }; |
| 724 | 731 |
| 725 void ResetCounters(); | 732 void ResetCounters(); |
| 726 void ResetHistograms(); | 733 void ResetHistograms(); |
| 727 | 734 |
| 728 private: | 735 private: |
| 729 #define HR(name, caption, min, max, num_buckets) Histogram name##_; | 736 #define HR(name, caption, min, max, num_buckets) Histogram name##_; |
| 730 HISTOGRAM_RANGE_LIST(HR) | 737 HISTOGRAM_RANGE_LIST(HR) |
| 731 #undef HR | 738 #undef HR |
| 732 | 739 |
| 733 #define HT(name, caption) \ | 740 #define HT(name, caption, max, res) HistogramTimer name##_; |
| 734 HistogramTimer name##_; | |
| 735 HISTOGRAM_TIMER_LIST(HT) | 741 HISTOGRAM_TIMER_LIST(HT) |
| 736 #undef HT | 742 #undef HT |
| 737 | 743 |
| 738 #define AHT(name, caption) \ | 744 #define AHT(name, caption) \ |
| 739 AggregatableHistogramTimer name##_; | 745 AggregatableHistogramTimer name##_; |
| 740 AGGREGATABLE_HISTOGRAM_TIMER_LIST(AHT) | 746 AGGREGATABLE_HISTOGRAM_TIMER_LIST(AHT) |
| 741 #undef AHT | 747 #undef AHT |
| 742 | 748 |
| 743 #define HP(name, caption) \ | 749 #define HP(name, caption) \ |
| 744 Histogram name##_; | 750 Histogram name##_; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 783 friend class Isolate; | 789 friend class Isolate; |
| 784 | 790 |
| 785 explicit Counters(Isolate* isolate); | 791 explicit Counters(Isolate* isolate); |
| 786 | 792 |
| 787 DISALLOW_IMPLICIT_CONSTRUCTORS(Counters); | 793 DISALLOW_IMPLICIT_CONSTRUCTORS(Counters); |
| 788 }; | 794 }; |
| 789 | 795 |
| 790 } } // namespace v8::internal | 796 } } // namespace v8::internal |
| 791 | 797 |
| 792 #endif // V8_COUNTERS_H_ | 798 #endif // V8_COUNTERS_H_ |
| OLD | NEW |