| // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| #ifndef RUNTIME_VM_COMPILER_STATS_H_ |
| #define RUNTIME_VM_COMPILER_STATS_H_ |
| |
| #include "vm/allocation.h" |
| #include "vm/atomic.h" |
| #include "vm/flags.h" |
| #include "vm/isolate.h" |
| #include "vm/timer.h" |
| |
| |
| namespace dart { |
| |
| DECLARE_FLAG(bool, compiler_stats); |
| DECLARE_FLAG(bool, compiler_benchmark); |
| |
| |
| #define STAT_TIMERS(V) \ |
| V(parser_timer, "parser timer") \ |
| V(scanner_timer, "scanner timer") \ |
| V(codegen_timer, "codegen timer") \ |
| V(graphbuilder_timer, "flow graph builder timer") \ |
| V(ssa_timer, "flow graph SSA timer") \ |
| V(graphinliner_timer, "flow graph inliner timer") \ |
| V(graphinliner_parse_timer, "inliner parsing timer") \ |
| V(graphinliner_build_timer, "inliner building timer") \ |
| V(graphinliner_ssa_timer, "inliner SSA timer") \ |
| V(graphinliner_opt_timer, "inliner optimization timer") \ |
| V(graphinliner_subst_timer, "inliner substitution timer") \ |
| V(graphoptimizer_timer, "flow graph optimizer timer") \ |
| V(graphcompiler_timer, "flow graph compiler timer") \ |
| V(codefinalizer_timer, "code finalization timer") |
| |
| |
| #define STAT_COUNTERS(V) \ |
| V(num_tokens_total) \ |
| V(num_tokens_scanned) \ |
| V(num_tokens_consumed) \ |
| V(num_cached_consts) \ |
| V(num_const_cache_hits) \ |
| V(num_execute_const) \ |
| V(num_classes_parsed) \ |
| V(num_class_tokens) \ |
| V(num_functions_parsed) \ |
| V(num_functions_compiled) \ |
| V(num_functions_optimized) \ |
| V(num_func_tokens_compiled) \ |
| V(num_implicit_final_getters) \ |
| V(num_method_extractors) \ |
| V(src_length) \ |
| V(total_code_size) \ |
| V(total_instr_size) \ |
| V(pc_desc_size) \ |
| V(vardesc_size) |
| |
| class CompilerStats { |
| public: |
| explicit CompilerStats(Isolate* isolate); |
| ~CompilerStats() {} |
| |
| Isolate* isolate_; |
| |
| // We could use STAT_TIMERS and STAT_COUNTERS to declare fields, but then |
| // we would be losing the comments. |
| Timer parser_timer; // Cumulative runtime of parser. |
| Timer scanner_timer; // Cumulative runtime of scanner. |
| Timer codegen_timer; // Cumulative runtime of code generator. |
| Timer graphbuilder_timer; // Included in codegen_timer. |
| Timer ssa_timer; // Included in codegen_timer. |
| Timer graphinliner_timer; // Included in codegen_timer. |
| Timer graphinliner_parse_timer; // Included in codegen_timer. |
| Timer graphinliner_build_timer; // Included in codegen_timer. |
| Timer graphinliner_ssa_timer; // Included in codegen_timer. |
| Timer graphinliner_opt_timer; // Included in codegen_timer. |
| Timer graphinliner_subst_timer; // Included in codegen_timer. |
| |
| Timer graphoptimizer_timer; // Included in codegen_timer. |
| Timer graphcompiler_timer; // Included in codegen_timer. |
| Timer codefinalizer_timer; // Included in codegen_timer. |
| |
| int64_t num_tokens_total; // Isolate + VM isolate |
| int64_t num_tokens_scanned; |
| int64_t num_tokens_consumed; |
| int64_t num_cached_consts; |
| int64_t num_const_cache_hits; |
| int64_t num_execute_const; |
| |
| int64_t num_classes_parsed; |
| int64_t num_class_tokens; |
| int64_t num_functions_parsed; // Num parsed functions. |
| int64_t num_functions_compiled; // Num unoptimized compilations. |
| int64_t num_functions_optimized; // Num optimized compilations. |
| int64_t num_func_tokens_compiled; |
| int64_t num_implicit_final_getters; |
| int64_t num_method_extractors; |
| |
| int64_t src_length; // Total number of characters in source. |
| int64_t total_code_size; // Bytes allocated for code and meta info. |
| int64_t total_instr_size; // Total size of generated code in bytes. |
| int64_t pc_desc_size; |
| int64_t vardesc_size; |
| char* text; |
| bool use_benchmark_output; |
| |
| |
| void EnableBenchmark(); |
| char* BenchmarkOutput(); |
| char* PrintToZone(); |
| |
| // Used to aggregate stats. |
| void Add(const CompilerStats& other); |
| void Clear(); |
| |
| bool IsCleared() const; |
| |
| private: |
| // Update stats that are computed, e.g. token count. |
| void Update(); |
| }; |
| |
| // Make increment atomic in case it occurs in parallel with aggregation from |
| // other thread. |
| #define INC_STAT(thread, counter, incr) \ |
| if (FLAG_support_compiler_stats && FLAG_compiler_stats) { \ |
| AtomicOperations::IncrementInt64By(&(thread)->compiler_stats()->counter, \ |
| (incr)); \ |
| } |
| |
| #define STAT_VALUE(thread, counter) \ |
| ((FLAG_support_compiler_stats && FLAG_compiler_stats) \ |
| ? (thread)->compiler_stats()->counter \ |
| : 0) |
| |
| #define CSTAT_TIMER_SCOPE(thr, t) \ |
| TimerScope timer(FLAG_support_compiler_stats&& FLAG_compiler_stats, \ |
| (FLAG_support_compiler_stats && FLAG_compiler_stats) \ |
| ? &((thr)->compiler_stats()->t) \ |
| : NULL, \ |
| thr); |
| |
| |
| } // namespace dart |
| |
| #endif // RUNTIME_VM_COMPILER_STATS_H_ |