Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(320)

Side by Side Diff: src/counters.h

Issue 2759033002: Generate less code in v8::internal::Counters constructor (Closed)
Patch Set: export for win component build Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/counters.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/atomic-utils.h" 10 #include "src/base/atomic-utils.h"
(...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 double value = (current_value + last_value_) / 2; 479 double value = (current_value + last_value_) / 2;
480 // The aggregate_value_ is the average for [start_ms_; last_ms_]. 480 // The aggregate_value_ is the average for [start_ms_; last_ms_].
481 // The value is the average for [last_ms_; current_ms]. 481 // The value is the average for [last_ms_; current_ms].
482 // Return the weighted average of the aggregate_value_ and the value. 482 // Return the weighted average of the aggregate_value_ and the value.
483 return aggregate_value_ * ((last_ms_ - start_ms_) / interval_ms) + 483 return aggregate_value_ * ((last_ms_ - start_ms_) / interval_ms) +
484 value * ((current_ms - last_ms_) / interval_ms); 484 value * ((current_ms - last_ms_) / interval_ms);
485 } 485 }
486 486
487 class RuntimeCallCounter final { 487 class RuntimeCallCounter final {
488 public: 488 public:
489 explicit RuntimeCallCounter(const char* name) : name_(name) {} 489 explicit RuntimeCallCounter(const char* name)
490 : name_(name), count_(0), time_(0) {}
490 V8_NOINLINE void Reset(); 491 V8_NOINLINE void Reset();
491 V8_NOINLINE void Dump(v8::tracing::TracedValue* value); 492 V8_NOINLINE void Dump(v8::tracing::TracedValue* value);
492 void Add(RuntimeCallCounter* other); 493 void Add(RuntimeCallCounter* other);
493 494
494 const char* name() const { return name_; } 495 const char* name() const { return name_; }
495 int64_t count() const { return count_; } 496 int64_t count() const { return count_; }
496 base::TimeDelta time() const { return time_; } 497 base::TimeDelta time() const {
498 return base::TimeDelta::FromMicroseconds(time_);
499 }
497 void Increment() { count_++; } 500 void Increment() { count_++; }
498 void Add(base::TimeDelta delta) { time_ += delta; } 501 void Add(base::TimeDelta delta) { time_ += delta.InMicroseconds(); }
499 502
500 private: 503 private:
504 RuntimeCallCounter() {}
505
501 const char* name_; 506 const char* name_;
502 int64_t count_ = 0; 507 int64_t count_;
503 base::TimeDelta time_; 508 // Stored as int64_t so that its initialization can be deferred.
509 int64_t time_;
510
511 friend class RuntimeCallStats;
504 }; 512 };
505 513
506 // RuntimeCallTimer is used to keep track of the stack of currently active 514 // RuntimeCallTimer is used to keep track of the stack of currently active
507 // timers used for properly measuring the own time of a RuntimeCallCounter. 515 // timers used for properly measuring the own time of a RuntimeCallCounter.
508 class RuntimeCallTimer final { 516 class RuntimeCallTimer final {
509 public: 517 public:
510 RuntimeCallCounter* counter() { return counter_; } 518 RuntimeCallCounter* counter() { return counter_; }
511 void set_counter(RuntimeCallCounter* counter) { counter_ = counter; } 519 void set_counter(RuntimeCallCounter* counter) { counter_ = counter; }
512 RuntimeCallTimer* parent() const { return parent_.Value(); } 520 RuntimeCallTimer* parent() const { return parent_.Value(); }
513 void set_parent(RuntimeCallTimer* timer) { parent_.SetValue(timer); } 521 void set_parent(RuntimeCallTimer* timer) { parent_.SetValue(timer); }
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
819 V(StoreIC_StoreInterceptorStub) \ 827 V(StoreIC_StoreInterceptorStub) \
820 V(StoreIC_StoreNormalDH) \ 828 V(StoreIC_StoreNormalDH) \
821 V(StoreIC_StoreScriptContextFieldStub) \ 829 V(StoreIC_StoreScriptContextFieldStub) \
822 V(StoreIC_StoreTransition) \ 830 V(StoreIC_StoreTransition) \
823 V(StoreIC_StoreTransitionDH) \ 831 V(StoreIC_StoreTransitionDH) \
824 V(StoreIC_StoreViaSetter) 832 V(StoreIC_StoreViaSetter)
825 833
826 class RuntimeCallStats final : public ZoneObject { 834 class RuntimeCallStats final : public ZoneObject {
827 public: 835 public:
828 typedef RuntimeCallCounter RuntimeCallStats::*CounterId; 836 typedef RuntimeCallCounter RuntimeCallStats::*CounterId;
837 V8_EXPORT_PRIVATE RuntimeCallStats();
829 838
830 #define CALL_RUNTIME_COUNTER(name) \ 839 #define CALL_RUNTIME_COUNTER(name) RuntimeCallCounter name;
831 RuntimeCallCounter name = RuntimeCallCounter(#name);
832 FOR_EACH_MANUAL_COUNTER(CALL_RUNTIME_COUNTER) 840 FOR_EACH_MANUAL_COUNTER(CALL_RUNTIME_COUNTER)
833 #undef CALL_RUNTIME_COUNTER 841 #undef CALL_RUNTIME_COUNTER
834 #define CALL_RUNTIME_COUNTER(name, nargs, ressize) \ 842 #define CALL_RUNTIME_COUNTER(name, nargs, ressize) \
835 RuntimeCallCounter Runtime_##name = RuntimeCallCounter(#name); 843 RuntimeCallCounter Runtime_##name;
836 FOR_EACH_INTRINSIC(CALL_RUNTIME_COUNTER) 844 FOR_EACH_INTRINSIC(CALL_RUNTIME_COUNTER)
837 #undef CALL_RUNTIME_COUNTER 845 #undef CALL_RUNTIME_COUNTER
838 #define CALL_BUILTIN_COUNTER(name) \ 846 #define CALL_BUILTIN_COUNTER(name) RuntimeCallCounter Builtin_##name;
839 RuntimeCallCounter Builtin_##name = RuntimeCallCounter(#name);
840 BUILTIN_LIST_C(CALL_BUILTIN_COUNTER) 847 BUILTIN_LIST_C(CALL_BUILTIN_COUNTER)
841 #undef CALL_BUILTIN_COUNTER 848 #undef CALL_BUILTIN_COUNTER
842 #define CALL_BUILTIN_COUNTER(name) \ 849 #define CALL_BUILTIN_COUNTER(name) RuntimeCallCounter API_##name;
843 RuntimeCallCounter API_##name = RuntimeCallCounter("API_" #name);
844 FOR_EACH_API_COUNTER(CALL_BUILTIN_COUNTER) 850 FOR_EACH_API_COUNTER(CALL_BUILTIN_COUNTER)
845 #undef CALL_BUILTIN_COUNTER 851 #undef CALL_BUILTIN_COUNTER
846 #define CALL_BUILTIN_COUNTER(name) \ 852 #define CALL_BUILTIN_COUNTER(name) RuntimeCallCounter Handler_##name;
847 RuntimeCallCounter Handler_##name = RuntimeCallCounter(#name);
848 FOR_EACH_HANDLER_COUNTER(CALL_BUILTIN_COUNTER) 853 FOR_EACH_HANDLER_COUNTER(CALL_BUILTIN_COUNTER)
849 #undef CALL_BUILTIN_COUNTER 854 #undef CALL_BUILTIN_COUNTER
850 855
851 static const CounterId counters[]; 856 static const CounterId counters[];
852 static const int counters_count; 857 static const int counters_count;
853 858
854 // Starting measuring the time for a function. This will establish the 859 // Starting measuring the time for a function. This will establish the
855 // connection to the parent counter for properly calculating the own times. 860 // connection to the parent counter for properly calculating the own times.
856 V8_EXPORT_PRIVATE static void Enter(RuntimeCallStats* stats, 861 V8_EXPORT_PRIVATE static void Enter(RuntimeCallStats* stats,
857 RuntimeCallTimer* timer, 862 RuntimeCallTimer* timer,
858 CounterId counter_id); 863 CounterId counter_id);
859 864
860 // Leave a scope for a measured runtime function. This will properly add 865 // Leave a scope for a measured runtime function. This will properly add
861 // the time delta to the current_counter and subtract the delta from its 866 // the time delta to the current_counter and subtract the delta from its
862 // parent. 867 // parent.
863 V8_EXPORT_PRIVATE static void Leave(RuntimeCallStats* stats, 868 V8_EXPORT_PRIVATE static void Leave(RuntimeCallStats* stats,
864 RuntimeCallTimer* timer); 869 RuntimeCallTimer* timer);
865 870
866 // Set counter id for the innermost measurement. It can be used to refine 871 // Set counter id for the innermost measurement. It can be used to refine
867 // event kind when a runtime entry counter is too generic. 872 // event kind when a runtime entry counter is too generic.
868 V8_EXPORT_PRIVATE static void CorrectCurrentCounterId(RuntimeCallStats* stats, 873 V8_EXPORT_PRIVATE static void CorrectCurrentCounterId(RuntimeCallStats* stats,
869 CounterId counter_id); 874 CounterId counter_id);
870 875
871 V8_EXPORT_PRIVATE void Reset(); 876 V8_EXPORT_PRIVATE void Reset();
872 // Add all entries from another stats object. 877 // Add all entries from another stats object.
873 void Add(RuntimeCallStats* other); 878 void Add(RuntimeCallStats* other);
874 V8_EXPORT_PRIVATE void Print(std::ostream& os); 879 V8_EXPORT_PRIVATE void Print(std::ostream& os);
875 V8_NOINLINE void Dump(v8::tracing::TracedValue* value); 880 V8_NOINLINE void Dump(v8::tracing::TracedValue* value);
876 881
877 RuntimeCallStats() {
878 Reset();
879 in_use_ = false;
880 }
881
882 RuntimeCallTimer* current_timer() { return current_timer_.Value(); } 882 RuntimeCallTimer* current_timer() { return current_timer_.Value(); }
883 bool InUse() { return in_use_; } 883 bool InUse() { return in_use_; }
884 884
885 private: 885 private:
886 // Counter to track recursive time events. 886 // Counter to track recursive time events.
887 base::AtomicValue<RuntimeCallTimer*> current_timer_; 887 base::AtomicValue<RuntimeCallTimer*> current_timer_;
888 // Used to track nested tracing scopes. 888 // Used to track nested tracing scopes.
889 bool in_use_; 889 bool in_use_;
890 }; 890 };
891 891
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after
1336 1336
1337 explicit Counters(Isolate* isolate); 1337 explicit Counters(Isolate* isolate);
1338 1338
1339 DISALLOW_IMPLICIT_CONSTRUCTORS(Counters); 1339 DISALLOW_IMPLICIT_CONSTRUCTORS(Counters);
1340 }; 1340 };
1341 1341
1342 } // namespace internal 1342 } // namespace internal
1343 } // namespace v8 1343 } // namespace v8
1344 1344
1345 #endif // V8_COUNTERS_H_ 1345 #endif // V8_COUNTERS_H_
OLDNEW
« no previous file with comments | « no previous file | src/counters.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698