| OLD | NEW | 
|    1 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file |    1 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file | 
|    2 // for details. All rights reserved. Use of this source code is governed by a |    2 // for details. All rights reserved. Use of this source code is governed by a | 
|    3 // BSD-style license that can be found in the LICENSE file. |    3 // BSD-style license that can be found in the LICENSE file. | 
|    4  |    4  | 
|    5 #include "vm/compiler_stats.h" |    5 #include "vm/compiler_stats.h" | 
|    6  |    6  | 
|    7 #include "vm/flags.h" |    7 #include "vm/flags.h" | 
|    8 #include "vm/log.h" |    8 #include "vm/log.h" | 
|    9 #include "vm/object_graph.h" |    9 #include "vm/object_graph.h" | 
|   10 #include "vm/timer.h" |   10 #include "vm/timer.h" | 
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  130   use_benchmark_output = true; |  130   use_benchmark_output = true; | 
|  131 } |  131 } | 
|  132  |  132  | 
|  133  |  133  | 
|  134 // Generate output for Golem benchmark harness. If the output format |  134 // Generate output for Golem benchmark harness. If the output format | 
|  135 // changes, the parsing function in Golem must be updated. |  135 // changes, the parsing function in Golem must be updated. | 
|  136 char* CompilerStats::BenchmarkOutput() { |  136 char* CompilerStats::BenchmarkOutput() { | 
|  137   Update(); |  137   Update(); | 
|  138   Log log(PrintToStats); |  138   Log log(PrintToStats); | 
|  139   LogBlock lb(Thread::Current(), &log); |  139   LogBlock lb(Thread::Current(), &log); | 
 |  140   log.Print("==== Compiler Stats for isolate '%s' ====\n", | 
 |  141             isolate_->debugger_name()); | 
 |  142  | 
|  140   log.Print("NumberOfTokens: %" Pd64 "\n", num_tokens_total); |  143   log.Print("NumberOfTokens: %" Pd64 "\n", num_tokens_total); | 
|  141   log.Print("NumClassesParsed: %" Pd64 "\n", num_classes_parsed); |  144   log.Print("NumClassesParsed: %" Pd64 "\n", num_classes_parsed); | 
|  142   log.Print("NumFunctionsCompiled: %" Pd64 "\n", num_functions_compiled); |  145   log.Print("NumFunctionsCompiled: %" Pd64 "\n", num_functions_compiled); | 
|  143   log.Print("NumFunctionsOptimized: %" Pd64 "\n", num_functions_optimized); |  146   log.Print("NumFunctionsOptimized: %" Pd64 "\n", num_functions_optimized); | 
|  144   log.Print("NumFunctionsParsed: %" Pd64 "\n", num_functions_parsed); |  147   log.Print("NumFunctionsParsed: %" Pd64 "\n", num_functions_parsed); | 
|  145  |  148  | 
|  146   // Scanner stats. |  149   // Scanner stats. | 
|  147   int64_t scan_usecs = scanner_timer.TotalElapsedTime(); |  150   int64_t scan_usecs = scanner_timer.TotalElapsedTime(); | 
|  148   int64_t scan_speed = |  151   int64_t scan_speed = | 
|  149       scan_usecs > 0 ? 1000 * num_tokens_scanned / scan_usecs : 0; |  152       scan_usecs > 0 ? 1000 * num_tokens_scanned / scan_usecs : 0; | 
|  150   log.Print("NumTokensScanned: %" Pd64 " tokens\n", num_tokens_scanned); |  153   log.Print("NumTokensScanned: %" Pd64 " tokens\n", num_tokens_scanned); | 
|  151   log.Print("ScannerTime: %" Pd64 " ms\n", scan_usecs / 1000); |  154   log.Print("ScannerTime: %" Pd64 " ms\n", scan_usecs / 1000); | 
|  152   log.Print("ScannerSpeed: %" Pd64 " tokens/ms\n", scan_speed); |  155   log.Print("ScannerSpeed: %" Pd64 " tokens/ms\n", scan_speed); | 
|  153  |  156  | 
|  154   // Parser stats. |  157   // Parser stats. | 
|  155   int64_t parse_usecs = parser_timer.TotalElapsedTime(); |  158   int64_t parse_usecs = parser_timer.TotalElapsedTime(); | 
|  156   int64_t parse_speed = |  159   int64_t parse_speed = | 
|  157       parse_usecs > 0 ? 1000 * num_tokens_consumed / parse_usecs : 0; |  160       parse_usecs > 0 ? 1000 * num_tokens_consumed / parse_usecs : 0; | 
|  158   log.Print("NumTokensParsed: %" Pd64 " tokens\n", num_tokens_consumed); |  161   log.Print("NumTokensParsed: %" Pd64 " tokens\n", num_tokens_consumed); | 
|  159   log.Print("ParserTime: %" Pd64 " ms\n", parse_usecs / 1000); |  162   log.Print("ParserTime: %" Pd64 " ms\n", parse_usecs / 1000); | 
|  160   log.Print("ParserSpeed: %" Pd64 " tokens/ms\n", parse_speed); |  163   log.Print("ParserSpeed: %" Pd64 " tokens/ms\n", parse_speed); | 
|  161  |  164  | 
|  162   // Compiler stats. |  165   // Compiler stats. | 
|  163   int64_t codegen_usecs = codegen_timer.TotalElapsedTime(); |  166   int64_t codegen_usecs = codegen_timer.TotalElapsedTime(); | 
|  164   int64_t compile_usecs = scan_usecs+ parse_usecs + codegen_usecs; |  167   int64_t compile_usecs = scan_usecs + parse_usecs + codegen_usecs; | 
 |  168   int64_t compile_speed = | 
 |  169       compile_usecs > 0 ? (1000 * num_func_tokens_compiled / compile_usecs) : 0; | 
|  165   log.Print("NumTokensCompiled: %" Pd64 " tokens\n", num_func_tokens_compiled); |  170   log.Print("NumTokensCompiled: %" Pd64 " tokens\n", num_func_tokens_compiled); | 
|  166   log.Print("CompilerTime: %" Pd64 " ms\n", compile_usecs / 1000); |  171   log.Print("CompilerTime: %" Pd64 " ms\n", compile_usecs / 1000); | 
|  167  |  172  | 
|  168   log.Print("CompilerSpeed: %" Pd64 " tokens/ms\n", |  173   log.Print("CompilerSpeed: %" Pd64 " tokens/ms\n", compile_speed); | 
|  169             compile_usecs > 0 ? |  | 
|  170                 (1000 * num_func_tokens_compiled / compile_usecs) : 0); |  | 
|  171   log.Print("CodeSize: %" Pd64 " KB\n", total_code_size / 1024); |  174   log.Print("CodeSize: %" Pd64 " KB\n", total_code_size / 1024); | 
|  172   log.Print("CodeDensity: %" Pd64 " tokens/KB\n", |  175   int64_t code_density = total_instr_size > 0 ? | 
|  173             (1024 * num_func_tokens_compiled) / total_instr_size); |  176       (num_func_tokens_compiled * 1024) / total_instr_size : 0; | 
 |  177  | 
 |  178   log.Print("CodeDensity: %" Pd64 " tokens/KB\n", code_density); | 
|  174   log.Print("InstrSize: %" Pd64 " KB\n", total_instr_size / 1024); |  179   log.Print("InstrSize: %" Pd64 " KB\n", total_instr_size / 1024); | 
|  175   log.Flush(); |  180   log.Flush(); | 
|  176   char* benchmark_text = text; |  181   char* benchmark_text = text; | 
|  177   text = NULL; |  182   text = NULL; | 
|  178   return benchmark_text; |  183   return benchmark_text; | 
|  179 } |  184 } | 
|  180  |  185  | 
|  181  |  186  | 
|  182 char* CompilerStats::PrintToZone() { |  187 char* CompilerStats::PrintToZone() { | 
|  183   if (!FLAG_compiler_stats) { |  188   if (!FLAG_compiler_stats) { | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  218   int64_t parse_usecs = parser_timer.TotalElapsedTime(); |  223   int64_t parse_usecs = parser_timer.TotalElapsedTime(); | 
|  219   int64_t parse_speed = |  224   int64_t parse_speed = | 
|  220       parse_usecs > 0 ? 1000 * num_tokens_consumed / parse_usecs : 0; |  225       parse_usecs > 0 ? 1000 * num_tokens_consumed / parse_usecs : 0; | 
|  221   log.Print("Parser time:             %" Pd64 " ms\n", parse_usecs / 1000); |  226   log.Print("Parser time:             %" Pd64 " ms\n", parse_usecs / 1000); | 
|  222   log.Print("Parser speed:            %" Pd64 " tokens/ms\n", |  227   log.Print("Parser speed:            %" Pd64 " tokens/ms\n", | 
|  223              parse_speed); |  228              parse_speed); | 
|  224  |  229  | 
|  225   int64_t codegen_usecs = codegen_timer.TotalElapsedTime(); |  230   int64_t codegen_usecs = codegen_timer.TotalElapsedTime(); | 
|  226  |  231  | 
|  227   log.Print("==== Backend stats:\n"); |  232   log.Print("==== Backend stats:\n"); | 
|  228   log.Print("Code gen. time:          %" Pd64 " ms\n", |  233   log.Print("Code gen. time:          %" Pd64 " ms\n", codegen_usecs / 1000); | 
|  229             codegen_usecs / 1000); |  | 
|  230   int64_t graphbuilder_usecs = graphbuilder_timer.TotalElapsedTime(); |  234   int64_t graphbuilder_usecs = graphbuilder_timer.TotalElapsedTime(); | 
|  231   log.Print("  Graph builder:         %" Pd64 " ms\n", |  235   log.Print("  Graph builder:         %" Pd64 " ms\n", | 
|  232             graphbuilder_usecs / 1000); |  236             graphbuilder_usecs / 1000); | 
|  233   int64_t ssa_usecs = ssa_timer.TotalElapsedTime(); |  237   int64_t ssa_usecs = ssa_timer.TotalElapsedTime(); | 
|  234   log.Print("  Graph SSA:             %" Pd64 " ms\n", ssa_usecs / 1000); |  238   log.Print("  Graph SSA:             %" Pd64 " ms\n", ssa_usecs / 1000); | 
|  235  |  239  | 
|  236   int64_t graphinliner_usecs = graphinliner_timer.TotalElapsedTime(); |  240   int64_t graphinliner_usecs = graphinliner_timer.TotalElapsedTime(); | 
|  237   log.Print("  Graph inliner:         %" Pd64 " ms\n", |  241   log.Print("  Graph inliner:         %" Pd64 " ms\n", | 
|  238             graphinliner_usecs / 1000); |  242             graphinliner_usecs / 1000); | 
|  239   int64_t graphinliner_parse_usecs = |  243   int64_t graphinliner_parse_usecs = | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
|  259             (graphoptimizer_usecs - graphinliner_usecs) / 1000); |  263             (graphoptimizer_usecs - graphinliner_usecs) / 1000); | 
|  260   int64_t graphcompiler_usecs = graphcompiler_timer.TotalElapsedTime(); |  264   int64_t graphcompiler_usecs = graphcompiler_timer.TotalElapsedTime(); | 
|  261   log.Print("  Graph compiler:        %" Pd64 " ms\n", |  265   log.Print("  Graph compiler:        %" Pd64 " ms\n", | 
|  262             graphcompiler_usecs / 1000); |  266             graphcompiler_usecs / 1000); | 
|  263   int64_t codefinalizer_usecs = codefinalizer_timer.TotalElapsedTime(); |  267   int64_t codefinalizer_usecs = codefinalizer_timer.TotalElapsedTime(); | 
|  264   log.Print("  Code finalizer:        %" Pd64 " ms\n", |  268   log.Print("  Code finalizer:        %" Pd64 " ms\n", | 
|  265             codefinalizer_usecs / 1000); |  269             codefinalizer_usecs / 1000); | 
|  266  |  270  | 
|  267   log.Print("==== Compiled code stats:\n"); |  271   log.Print("==== Compiled code stats:\n"); | 
|  268   int64_t compile_usecs = scan_usecs + parse_usecs + codegen_usecs; |  272   int64_t compile_usecs = scan_usecs + parse_usecs + codegen_usecs; | 
 |  273   int64_t compile_speed = compile_usecs > 0 ? | 
 |  274       (1000 * num_func_tokens_compiled / compile_usecs) : 0; | 
|  269   log.Print("Functions parsed:        %" Pd64 "\n", num_functions_parsed); |  275   log.Print("Functions parsed:        %" Pd64 "\n", num_functions_parsed); | 
|  270   log.Print("Functions compiled:      %" Pd64 "\n", num_functions_compiled); |  276   log.Print("Functions compiled:      %" Pd64 "\n", num_functions_compiled); | 
|  271   log.Print("  optimized:             %" Pd64 "\n", num_functions_optimized); |  277   log.Print("  optimized:             %" Pd64 "\n", num_functions_optimized); | 
|  272   log.Print("Compiler time:           %" Pd64 " ms\n", compile_usecs / 1000); |  278   log.Print("Compiler time:           %" Pd64 " ms\n", compile_usecs / 1000); | 
|  273   log.Print("Tokens compiled:         %" Pd64 "\n", num_func_tokens_compiled); |  279   log.Print("Tokens compiled:         %" Pd64 "\n", num_func_tokens_compiled); | 
|  274   log.Print("Compilation speed:       %" Pd64 " tokens/ms\n", |  280   log.Print("Compilation speed:       %" Pd64 " tokens/ms\n", compile_speed); | 
|  275             (1000 * num_func_tokens_compiled) / compile_usecs); |  281   int64_t code_density = total_instr_size > 0 ? | 
|  276   log.Print("Code density:            %" Pd64 " tokens per KB\n", |  282       (num_func_tokens_compiled * 1024) / total_instr_size : 0; | 
|  277             (num_func_tokens_compiled * 1024) / total_instr_size); |  283   log.Print("Code density:            %" Pd64 " tokens per KB\n", code_density); | 
|  278   log.Print("Code size:               %" Pd64 " KB\n", total_code_size / 1024); |  284   log.Print("Code size:               %" Pd64 " KB\n", total_code_size / 1024); | 
|  279   log.Print("  Instr size:            %" Pd64 " KB\n", |  285   log.Print("  Instr size:            %" Pd64 " KB\n", | 
|  280             total_instr_size / 1024); |  286             total_instr_size / 1024); | 
|  281   log.Print("  Pc Desc size:          %" Pd64 " KB\n", pc_desc_size / 1024); |  287   log.Print("  Pc Desc size:          %" Pd64 " KB\n", pc_desc_size / 1024); | 
|  282   log.Print("  VarDesc size:          %" Pd64 " KB\n", vardesc_size / 1024); |  288   log.Print("  VarDesc size:          %" Pd64 " KB\n", vardesc_size / 1024); | 
|  283   log.Flush(); |  289   log.Flush(); | 
|  284   char* stats_text = text; |  290   char* stats_text = text; | 
|  285   text = NULL; |  291   text = NULL; | 
|  286   return stats_text; |  292   return stats_text; | 
|  287 } |  293 } | 
|  288  |  294  | 
|  289 }  // namespace dart |  295 }  // namespace dart | 
| OLD | NEW |