| 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 |