| // 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. |
| |
| #include "vm/compiler_stats.h" |
| |
| #include "vm/flags.h" |
| #include "vm/timer.h" |
| |
| |
| namespace dart { |
| |
| DEFINE_FLAG(bool, compiler_stats, false, "Compiler stat counters."); |
| |
| // Bytes allocated for generated code. |
| int64_t CompilerStats::code_allocated = 0; |
| |
| // Total number of characters in source. |
| int64_t CompilerStats::src_length = 0; |
| |
| // Cumulative runtime of parser. |
| Timer CompilerStats::parser_timer(true, "parser timer"); |
| |
| // Cumulative runtime of scanner. |
| Timer CompilerStats::scanner_timer(true, "scanner timer"); |
| |
| // Cumulative runtime of code generator. |
| Timer CompilerStats::codegen_timer(true, "codegen timer"); |
| |
| // Cumulative timer of flow graph builder, included in codegen_timer. |
| Timer CompilerStats::graphbuilder_timer(true, "flow graph builder timer"); |
| |
| // Cumulative timer of flow graph SSA construction, included in codegen_timer. |
| Timer CompilerStats::ssa_timer(true, "flow graph SSA timer"); |
| |
| // Cumulative timer of flow graph inliner, included in codegen_timer. |
| Timer CompilerStats::graphinliner_timer(true, "flow graph inliner timer"); |
| // Cumulative sub-timers of flow graph inliner. |
| Timer CompilerStats::graphinliner_parse_timer(true, "inliner parsing timer"); |
| Timer CompilerStats::graphinliner_build_timer(true, "inliner building timer"); |
| Timer CompilerStats::graphinliner_ssa_timer(true, "inliner SSA timer"); |
| Timer CompilerStats::graphinliner_opt_timer(true, "inliner optimization timer"); |
| Timer CompilerStats::graphinliner_subst_timer(true, |
| "inliner substitution timer"); |
| |
| // Cumulative timer of flow graph optimizer, included in codegen_timer. |
| Timer CompilerStats::graphoptimizer_timer(true, "flow graph optimizer timer"); |
| |
| // Cumulative timer of flow graph compiler, included in codegen_timer. |
| Timer CompilerStats::graphcompiler_timer(true, "flow graph compiler timer"); |
| |
| // Cumulative timer of code finalization, included in codegen_timer. |
| Timer CompilerStats::codefinalizer_timer(true, "code finalization timer"); |
| |
| |
| int64_t CompilerStats::num_tokens_total = 0; |
| int64_t CompilerStats::num_literal_tokens_total = 0; |
| int64_t CompilerStats::num_ident_tokens_total = 0; |
| int64_t CompilerStats::num_tokens_consumed = 0; |
| int64_t CompilerStats::num_token_checks = 0; |
| int64_t CompilerStats::num_tokens_rewind = 0; |
| int64_t CompilerStats::num_tokens_lookahead = 0; |
| |
| int64_t CompilerStats::num_lib_cache_hit = 0; |
| int64_t CompilerStats::num_names_cached = 0; |
| int64_t CompilerStats::make_accessor_name = 0; |
| int64_t CompilerStats::make_field_name = 0; |
| |
| int64_t CompilerStats::num_classes_compiled = 0; |
| int64_t CompilerStats::num_functions_compiled = 0; |
| |
| int64_t CompilerStats::num_implicit_final_getters = 0; |
| int64_t CompilerStats::num_static_initializer_funcs = 0; |
| |
| void CompilerStats::Print() { |
| if (!FLAG_compiler_stats) { |
| return; |
| } |
| OS::Print("==== Compiler Stats ====\n"); |
| OS::Print("Number of tokens: %" Pd64 "\n", num_tokens_total); |
| OS::Print(" Literal tokens: %" Pd64 "\n", num_literal_tokens_total); |
| OS::Print(" Ident tokens: %" Pd64 "\n", num_ident_tokens_total); |
| OS::Print("Tokens consumed: %" Pd64 " (%.2f times number of tokens)\n", |
| num_tokens_consumed, |
| (1.0 * num_tokens_consumed) / num_tokens_total); |
| OS::Print("Tokens checked: %" Pd64 " (%.2f times tokens consumed)\n", |
| num_token_checks, (1.0 * num_token_checks) / num_tokens_consumed); |
| OS::Print("Token rewind: %" Pd64 " (%" Pd64 "%% of tokens checked)\n", |
| num_tokens_rewind, (100 * num_tokens_rewind) / num_token_checks); |
| OS::Print("Token lookahead: %" Pd64 " (%" Pd64 "%% of tokens checked)\n", |
| num_tokens_lookahead, |
| (100 * num_tokens_lookahead) / num_token_checks); |
| |
| OS::Print("Classes parsed: %" Pd64 "\n", num_classes_compiled); |
| OS::Print("Functions compiled: %" Pd64 "\n", num_functions_compiled); |
| OS::Print(" Impl getters: %" Pd64 "\n", num_implicit_final_getters); |
| OS::Print(" Init funcs: %" Pd64 "\n", num_static_initializer_funcs); |
| |
| OS::Print("Lib names cached: %" Pd64 "\n", num_names_cached); |
| OS::Print("Lib name cache hit: %" Pd64 "\n", num_lib_cache_hit); |
| OS::Print("Accessor mangling: %" Pd64 " field->acc %" Pd64 " acc->field\n", |
| make_accessor_name, make_field_name); |
| |
| OS::Print("Source length: %" Pd64 " characters\n", src_length); |
| int64_t scan_usecs = scanner_timer.TotalElapsedTime(); |
| OS::Print("Scanner time: %" Pd64 " msecs\n", |
| scan_usecs / 1000); |
| int64_t parse_usecs = parser_timer.TotalElapsedTime(); |
| OS::Print("Parser time: %" Pd64 " msecs\n", |
| parse_usecs / 1000); |
| int64_t codegen_usecs = codegen_timer.TotalElapsedTime(); |
| OS::Print("Code gen. time: %" Pd64 " msecs\n", |
| codegen_usecs / 1000); |
| int64_t graphbuilder_usecs = graphbuilder_timer.TotalElapsedTime(); |
| OS::Print(" Graph builder: %" Pd64 " msecs\n", graphbuilder_usecs / 1000); |
| int64_t ssa_usecs = ssa_timer.TotalElapsedTime(); |
| OS::Print(" Graph SSA: %" Pd64 " msecs\n", ssa_usecs / 1000); |
| |
| int64_t graphinliner_usecs = graphinliner_timer.TotalElapsedTime(); |
| OS::Print(" Graph inliner: %" Pd64 " msecs\n", graphinliner_usecs / 1000); |
| int64_t graphinliner_parse_usecs = |
| graphinliner_parse_timer.TotalElapsedTime(); |
| OS::Print(" Parsing: %" Pd64 " msecs\n", |
| graphinliner_parse_usecs / 1000); |
| int64_t graphinliner_build_usecs = |
| graphinliner_build_timer.TotalElapsedTime(); |
| OS::Print(" Building: %" Pd64 " msecs\n", |
| graphinliner_build_usecs / 1000); |
| int64_t graphinliner_ssa_usecs = graphinliner_ssa_timer.TotalElapsedTime(); |
| OS::Print(" SSA: %" Pd64 " msecs\n", |
| graphinliner_ssa_usecs / 1000); |
| int64_t graphinliner_opt_usecs = graphinliner_opt_timer.TotalElapsedTime(); |
| OS::Print(" Optimization: %" Pd64 " msecs\n", |
| graphinliner_opt_usecs / 1000); |
| int64_t graphinliner_subst_usecs = |
| graphinliner_subst_timer.TotalElapsedTime(); |
| OS::Print(" Substitution: %" Pd64 " msecs\n", |
| graphinliner_subst_usecs / 1000); |
| |
| int64_t graphoptimizer_usecs = graphoptimizer_timer.TotalElapsedTime(); |
| OS::Print(" Graph optimizer: %" Pd64 " msecs\n", |
| (graphoptimizer_usecs - graphinliner_usecs) / 1000); |
| int64_t graphcompiler_usecs = graphcompiler_timer.TotalElapsedTime(); |
| OS::Print(" Graph compiler: %" Pd64 " msecs\n", |
| graphcompiler_usecs / 1000); |
| int64_t codefinalizer_usecs = codefinalizer_timer.TotalElapsedTime(); |
| OS::Print(" Code finalizer: %" Pd64 " msecs\n", |
| codefinalizer_usecs / 1000); |
| OS::Print("Compilation speed: %" Pd64 " tokens per msec\n", |
| (1000 * num_tokens_total) / (parse_usecs + codegen_usecs)); |
| OS::Print("Code size: %" Pd64 " KB\n", |
| code_allocated / 1024); |
| OS::Print("Code density: %" Pd64 " tokens per KB\n", |
| (num_tokens_total * 1024) / code_allocated); |
| } |
| |
| } // namespace dart |