// Copyright 2016 the V8 project authors. All rights reserved.
|
// Use of this source code is governed by a BSD-style license that can be
|
// found in the LICENSE file.
|
|
#ifndef V8_COMPILER_DISPATCHER_COMPILER_DISPATCHER_TRACER_H_
|
#define V8_COMPILER_DISPATCHER_COMPILER_DISPATCHER_TRACER_H_
|
|
#include <utility>
|
|
#include "src/base/macros.h"
|
#include "src/base/platform/mutex.h"
|
#include "src/base/ring-buffer.h"
|
#include "src/counters.h"
|
#include "src/globals.h"
|
|
namespace v8 {
|
namespace internal {
|
|
class Isolate;
|
class RuntimeCallStats;
|
|
#define COMPILER_DISPATCHER_TRACE_SCOPE_WITH_NUM(tracer, scope_id, num) \
|
CompilerDispatcherTracer::ScopeID tracer_scope_id( \
|
CompilerDispatcherTracer::ScopeID::scope_id); \
|
CompilerDispatcherTracer::Scope trace_scope(tracer, tracer_scope_id, num); \
|
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"), \
|
CompilerDispatcherTracer::Scope::Name(tracer_scope_id))
|
|
#define COMPILER_DISPATCHER_TRACE_SCOPE(tracer, scope_id) \
|
COMPILER_DISPATCHER_TRACE_SCOPE_WITH_NUM(tracer, scope_id, 0)
|
|
class V8_EXPORT_PRIVATE CompilerDispatcherTracer {
|
public:
|
enum class ScopeID { kPrepare, kCompile, kFinalize };
|
|
class Scope {
|
public:
|
Scope(CompilerDispatcherTracer* tracer, ScopeID scope_id, size_t num = 0);
|
~Scope();
|
|
static const char* Name(ScopeID scoped_id);
|
|
private:
|
CompilerDispatcherTracer* tracer_;
|
ScopeID scope_id_;
|
size_t num_;
|
double start_time_;
|
|
DISALLOW_COPY_AND_ASSIGN(Scope);
|
};
|
|
explicit CompilerDispatcherTracer(Isolate* isolate);
|
~CompilerDispatcherTracer();
|
|
void RecordPrepare(double duration_ms);
|
void RecordCompile(double duration_ms, size_t source_length);
|
void RecordFinalize(double duration_ms);
|
|
double EstimatePrepareInMs() const;
|
double EstimateCompileInMs(size_t source_length) const;
|
double EstimateFinalizeInMs() const;
|
|
void DumpStatistics() const;
|
|
private:
|
static double Average(const base::RingBuffer<double>& buffer);
|
static double Estimate(
|
const base::RingBuffer<std::pair<size_t, double>>& buffer, size_t num);
|
|
mutable base::Mutex mutex_;
|
base::RingBuffer<double> prepare_events_;
|
base::RingBuffer<std::pair<size_t, double>> compile_events_;
|
base::RingBuffer<double> finalize_events_;
|
|
RuntimeCallStats* runtime_call_stats_;
|
|
DISALLOW_COPY_AND_ASSIGN(CompilerDispatcherTracer);
|
};
|
|
} // namespace internal
|
} // namespace v8
|
|
#endif // V8_COMPILER_DISPATCHER_COMPILER_DISPATCHER_TRACER_H_
|