| Index: src/counters.h
|
| diff --git a/src/counters.h b/src/counters.h
|
| index 09371e6938101a7f1fbc253a5d461de1271085b1..4b5ec057bf8192ed06d43b9d5ad87c7e3b986033 100644
|
| --- a/src/counters.h
|
| +++ b/src/counters.h
|
| @@ -484,65 +484,51 @@ double AggregatedMemoryHistogram<Histogram>::Aggregate(double current_ms,
|
| value * ((current_ms - last_ms_) / interval_ms);
|
| }
|
|
|
| -struct RuntimeCallCounter {
|
| - explicit RuntimeCallCounter(const char* name) : name(name) {}
|
| +class RuntimeCallCounter final {
|
| + public:
|
| + explicit RuntimeCallCounter(const char* name) : name_(name) {}
|
| V8_NOINLINE void Reset();
|
| V8_NOINLINE void Dump(v8::tracing::TracedValue* value);
|
| void Add(RuntimeCallCounter* other);
|
|
|
| - const char* name;
|
| - int64_t count = 0;
|
| - base::TimeDelta time;
|
| + const char* name() const { return name_; }
|
| + int64_t count() const { return count_; }
|
| + base::TimeDelta time() const { return time_; }
|
| + void Increment() { count_++; }
|
| + void Add(base::TimeDelta delta) { time_ += delta; }
|
| +
|
| + private:
|
| + const char* name_;
|
| + int64_t count_ = 0;
|
| + base::TimeDelta time_;
|
| };
|
|
|
| // RuntimeCallTimer is used to keep track of the stack of currently active
|
| // timers used for properly measuring the own time of a RuntimeCallCounter.
|
| -class RuntimeCallTimer {
|
| +class RuntimeCallTimer final {
|
| public:
|
| RuntimeCallCounter* counter() { return counter_; }
|
| - base::ElapsedTimer timer() { return timer_; }
|
| + void set_counter(RuntimeCallCounter* counter) { counter_ = counter; }
|
| RuntimeCallTimer* parent() const { return parent_.Value(); }
|
| + void set_parent(RuntimeCallTimer* timer) { parent_.SetValue(timer); }
|
| + const char* name() const { return counter_->name(); }
|
|
|
| - private:
|
| - friend class RuntimeCallStats;
|
| -
|
| - inline void Start(RuntimeCallCounter* counter, RuntimeCallTimer* parent) {
|
| - counter_ = counter;
|
| - parent_.SetValue(parent);
|
| - if (FLAG_runtime_stats !=
|
| - v8::tracing::TracingCategoryObserver::ENABLED_BY_SAMPLING) {
|
| - timer_.Start();
|
| - }
|
| - }
|
| + inline bool IsStarted();
|
|
|
| - inline RuntimeCallTimer* Stop() {
|
| - if (!timer_.IsStarted()) return parent();
|
| - base::TimeDelta delta = timer_.Elapsed();
|
| - timer_.Stop();
|
| - counter_->count++;
|
| - counter_->time += delta;
|
| - if (parent()) {
|
| - // Adjust parent timer so that it does not include sub timer's time.
|
| - parent()->counter_->time -= delta;
|
| - }
|
| - return parent();
|
| - }
|
| + inline void Start(RuntimeCallCounter* counter, RuntimeCallTimer* parent);
|
| + void Snapshot();
|
| + inline RuntimeCallTimer* Stop();
|
|
|
| - inline void Elapsed() {
|
| - base::TimeDelta delta = timer_.Elapsed();
|
| - counter_->time += delta;
|
| - if (parent()) {
|
| - parent()->counter_->time -= delta;
|
| - parent()->Elapsed();
|
| - }
|
| - timer_.Restart();
|
| - }
|
| -
|
| - const char* name() { return counter_->name; }
|
| + private:
|
| + inline void Pause(base::TimeTicks now);
|
| + inline void Resume(base::TimeTicks now);
|
| + inline void CommitTimeToCounter();
|
| + inline base::TimeTicks Now();
|
|
|
| RuntimeCallCounter* counter_ = nullptr;
|
| base::AtomicValue<RuntimeCallTimer*> parent_;
|
| - base::ElapsedTimer timer_;
|
| + base::TimeTicks start_ticks_;
|
| + base::TimeDelta elapsed_;
|
| };
|
|
|
| #define FOR_EACH_API_COUNTER(V) \
|
| @@ -749,6 +735,9 @@ class RuntimeCallTimer {
|
| V(PrototypeObject_DeleteProperty) \
|
| V(RecompileConcurrent) \
|
| V(RecompileSynchronous) \
|
| + V(TestCounter1) \
|
| + V(TestCounter2) \
|
| + V(TestCounter3) \
|
| /* Dummy counter for the unexpected stub miss. */ \
|
| V(UnexpectedStubMiss)
|
|
|
| @@ -820,7 +809,7 @@ class RuntimeCallTimer {
|
| V(StoreIC_StoreTransitionDH) \
|
| V(StoreIC_StoreViaSetter)
|
|
|
| -class RuntimeCallStats : public ZoneObject {
|
| +class V8_EXPORT_PRIVATE RuntimeCallStats final : public ZoneObject {
|
| public:
|
| typedef RuntimeCallCounter RuntimeCallStats::*CounterId;
|
|
|
| @@ -895,6 +884,36 @@ class RuntimeCallStats : public ZoneObject {
|
| CHANGE_CURRENT_RUNTIME_COUNTER(isolate->counters()->runtime_call_stats(), \
|
| Handler_##counter_name)
|
|
|
| +// A RuntimeCallTimerScopes wraps around a RuntimeCallTimer to measure the
|
| +// the time of C++ scope.
|
| +class RuntimeCallTimerScope {
|
| + public:
|
| + inline RuntimeCallTimerScope(Isolate* isolate,
|
| + RuntimeCallStats::CounterId counter_id);
|
| + // This constructor is here just to avoid calling GetIsolate() when the
|
| + // stats are disabled and the isolate is not directly available.
|
| + inline RuntimeCallTimerScope(HeapObject* heap_object,
|
| + RuntimeCallStats::CounterId counter_id);
|
| + inline RuntimeCallTimerScope(RuntimeCallStats* stats,
|
| + RuntimeCallStats::CounterId counter_id);
|
| +
|
| + inline ~RuntimeCallTimerScope() {
|
| + if (V8_UNLIKELY(stats_ != nullptr)) {
|
| + RuntimeCallStats::Leave(stats_, &timer_);
|
| + }
|
| + }
|
| +
|
| + private:
|
| + V8_INLINE void Initialize(RuntimeCallStats* stats,
|
| + RuntimeCallStats::CounterId counter_id) {
|
| + stats_ = stats;
|
| + RuntimeCallStats::Enter(stats_, &timer_, counter_id);
|
| + }
|
| +
|
| + RuntimeCallStats* stats_ = nullptr;
|
| + RuntimeCallTimer timer_;
|
| +};
|
| +
|
| #define HISTOGRAM_RANGE_LIST(HR) \
|
| /* Generic range histograms */ \
|
| HR(detached_context_age_in_gc, V8.DetachedContextAgeInGC, 0, 20, 21) \
|
| @@ -1306,36 +1325,6 @@ class Counters {
|
| DISALLOW_IMPLICIT_CONSTRUCTORS(Counters);
|
| };
|
|
|
| -// A RuntimeCallTimerScopes wraps around a RuntimeCallTimer to measure the
|
| -// the time of C++ scope.
|
| -class RuntimeCallTimerScope {
|
| - public:
|
| - inline RuntimeCallTimerScope(Isolate* isolate,
|
| - RuntimeCallStats::CounterId counter_id);
|
| - // This constructor is here just to avoid calling GetIsolate() when the
|
| - // stats are disabled and the isolate is not directly available.
|
| - inline RuntimeCallTimerScope(HeapObject* heap_object,
|
| - RuntimeCallStats::CounterId counter_id);
|
| - inline RuntimeCallTimerScope(RuntimeCallStats* stats,
|
| - RuntimeCallStats::CounterId counter_id);
|
| -
|
| - inline ~RuntimeCallTimerScope() {
|
| - if (V8_UNLIKELY(stats_ != nullptr)) {
|
| - RuntimeCallStats::Leave(stats_, &timer_);
|
| - }
|
| - }
|
| -
|
| - private:
|
| - V8_INLINE void Initialize(RuntimeCallStats* stats,
|
| - RuntimeCallStats::CounterId counter_id) {
|
| - stats_ = stats;
|
| - RuntimeCallStats::Enter(stats_, &timer_, counter_id);
|
| - }
|
| -
|
| - RuntimeCallStats* stats_ = nullptr;
|
| - RuntimeCallTimer timer_;
|
| -};
|
| -
|
| } // namespace internal
|
| } // namespace v8
|
|
|
|
|