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 |