| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 library analysis_server.src.status.get_handler; | 5 library analysis_server.src.status.get_handler; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:collection'; | 8 import 'dart:collection'; |
| 9 import 'dart:convert'; | 9 import 'dart:convert'; |
| 10 import 'dart:io'; | 10 import 'dart:io'; |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 */ | 291 */ |
| 292 void _returnAnalysisPerformance(HttpRequest request) { | 292 void _returnAnalysisPerformance(HttpRequest request) { |
| 293 AnalysisServer analysisServer = _server.analysisServer; | 293 AnalysisServer analysisServer = _server.analysisServer; |
| 294 if (analysisServer == null) { | 294 if (analysisServer == null) { |
| 295 return _returnFailure(request, 'Analysis server is not running'); | 295 return _returnFailure(request, 'Analysis server is not running'); |
| 296 } | 296 } |
| 297 _writeResponse(request, (StringBuffer buffer) { | 297 _writeResponse(request, (StringBuffer buffer) { |
| 298 _writePage(buffer, 'Analysis Server - Analysis Performance', [], | 298 _writePage(buffer, 'Analysis Server - Analysis Performance', [], |
| 299 (StringBuffer buffer) { | 299 (StringBuffer buffer) { |
| 300 buffer.write('<h3>Analysis Performance</h3>'); | 300 buffer.write('<h3>Analysis Performance</h3>'); |
| 301 | |
| 302 // | 301 // |
| 303 // Write performance tags. | 302 // Write performance tags. |
| 304 // | 303 // |
| 305 { | 304 buffer.write('<p><b>Performance tag data</b></p>'); |
| 306 buffer.write('<p><b>Time spent in each phase of analysis</b></p>'); | 305 buffer.write( |
| 307 buffer.write( | 306 '<table style="border-collapse: separate; border-spacing: 10px 5px;"
>'); |
| 308 '<table style="border-collapse: separate; border-spacing: 10px 5px
;">'); | 307 _writeRow(buffer, ['Time (in ms)', 'Percent', 'Tag name'], |
| 309 _writeRow(buffer, ['Time (in ms)', 'Percent', 'Analysis Phase'], | 308 header: true); |
| 310 header: true); | 309 // prepare sorted tags |
| 311 // prepare sorted tags | 310 List<PerformanceTag> tags = PerformanceTag.all.toList(); |
| 312 List<PerformanceTag> tags = PerformanceTag.all.toList(); | 311 tags.remove(ServerPerformanceStatistics.idle); |
| 313 tags.remove(ServerPerformanceStatistics.idle); | 312 tags.sort((a, b) => b.elapsedMs - a.elapsedMs); |
| 314 tags.sort((a, b) => b.elapsedMs - a.elapsedMs); | 313 // prepare total time |
| 315 // prepare total time | 314 int totalTagTime = 0; |
| 316 int totalTime = 0; | 315 tags.forEach((PerformanceTag tag) { |
| 317 tags.forEach((PerformanceTag tag) { | 316 totalTagTime += tag.elapsedMs; |
| 318 totalTime += tag.elapsedMs; | 317 }); |
| 319 }); | 318 // write rows |
| 320 // write rows | 319 void writeRow(PerformanceTag tag) { |
| 321 void writeRow(PerformanceTag tag) { | 320 double percent = (tag.elapsedMs * 100) / totalTagTime; |
| 322 double percent = (tag.elapsedMs * 100) / totalTime; | 321 String percentStr = '${percent.toStringAsFixed(2)}%'; |
| 323 String percentStr = '${percent.toStringAsFixed(2)}%'; | 322 _writeRow(buffer, [tag.elapsedMs, percentStr, tag.label], |
| 324 _writeRow(buffer, [tag.elapsedMs, percentStr, tag.label], | 323 classes: ["right", "right", null]); |
| 325 classes: ["right", "right", null]); | 324 } |
| 325 tags.forEach(writeRow); |
| 326 buffer.write('</table>'); |
| 327 // |
| 328 // Write task model timing information. |
| 329 // |
| 330 buffer.write('<p><b>Task performace data</b></p>'); |
| 331 buffer.write( |
| 332 '<table style="border-collapse: separate; border-spacing: 10px 5px;"
>'); |
| 333 _writeRow(buffer, [ |
| 334 'Task Name', |
| 335 'Count', |
| 336 'Total Time (in ms)', |
| 337 'Average Time (in ms)' |
| 338 ], header: true); |
| 339 |
| 340 Map<Type, int> countMap = AnalysisTask.countMap; |
| 341 Map<Type, Stopwatch> stopwatchMap = AnalysisTask.stopwatchMap; |
| 342 List<Type> taskClasses = stopwatchMap.keys.toList(); |
| 343 taskClasses.sort((Type first, Type second) => |
| 344 first.toString().compareTo(second.toString())); |
| 345 int totalTaskTime = 0; |
| 346 taskClasses.forEach((Type taskClass) { |
| 347 int count = countMap[taskClass]; |
| 348 if (count == null) { |
| 349 count = 0; |
| 326 } | 350 } |
| 327 tags.forEach(writeRow); | 351 int taskTime = stopwatchMap[taskClass].elapsedMilliseconds; |
| 328 buffer.write('</table>'); | 352 totalTaskTime += taskTime; |
| 329 } | |
| 330 | |
| 331 // | |
| 332 // Write new task model timing information. | |
| 333 // | |
| 334 if (AnalysisEngine.instance.useTaskModel) { | |
| 335 buffer.write('<p><b>Task performace data</b></p>'); | |
| 336 buffer.write( | |
| 337 '<table style="border-collapse: separate; border-spacing: 10px 5px
;">'); | |
| 338 _writeRow(buffer, [ | 353 _writeRow(buffer, [ |
| 339 'Task Name', | 354 taskClass.toString(), |
| 340 'Count', | 355 count, |
| 341 'Total Time (in ms)', | 356 taskTime, |
| 342 'Average Time (in ms)' | 357 count <= 0 ? '-' : (taskTime / count).toStringAsFixed(3) |
| 343 ], header: true); | 358 ], classes: [null, "right", "right", "right"]); |
| 344 | 359 }); |
| 345 Map<Type, int> countMap = AnalysisTask.countMap; | 360 _writeRow(buffer, ['Total', '-', totalTaskTime, '-'], |
| 346 Map<Type, Stopwatch> stopwatchMap = AnalysisTask.stopwatchMap; | 361 classes: [null, "right", "right", "right"]); |
| 347 List<Type> taskClasses = stopwatchMap.keys.toList(); | 362 buffer.write('</table>'); |
| 348 taskClasses.sort((Type first, Type second) => | |
| 349 first.toString().compareTo(second.toString())); | |
| 350 int totalTime = 0; | |
| 351 taskClasses.forEach((Type taskClass) { | |
| 352 int count = countMap[taskClass]; | |
| 353 if (count == null) { | |
| 354 count = 0; | |
| 355 } | |
| 356 int taskTime = stopwatchMap[taskClass].elapsedMilliseconds; | |
| 357 totalTime += taskTime; | |
| 358 _writeRow(buffer, [ | |
| 359 taskClass.toString(), | |
| 360 count, | |
| 361 taskTime, | |
| 362 count <= 0 ? '-' : (taskTime / count).toStringAsFixed(3) | |
| 363 ], classes: [null, "right", "right", "right"]); | |
| 364 }); | |
| 365 _writeRow(buffer, ['Total', '-', totalTime, '-'], | |
| 366 classes: [null, "right", "right", "right"]); | |
| 367 buffer.write('</table>'); | |
| 368 } | |
| 369 | |
| 370 // | |
| 371 // Write old task model transition information. | |
| 372 // | |
| 373 { | |
| 374 Map<DataDescriptor, Map<CacheState, int>> transitionMap = | |
| 375 SourceEntry.transitionMap; | |
| 376 buffer.write( | |
| 377 '<p><b>Number of times a state transitioned to VALID (grouped by d
escriptor)</b></p>'); | |
| 378 if (transitionMap.isEmpty) { | |
| 379 buffer.write('<p>none</p>'); | |
| 380 } else { | |
| 381 List<DataDescriptor> descriptors = transitionMap.keys.toList(); | |
| 382 descriptors.sort((DataDescriptor first, DataDescriptor second) => | |
| 383 first.toString().compareTo(second.toString())); | |
| 384 for (DataDescriptor key in descriptors) { | |
| 385 Map<CacheState, int> countMap = transitionMap[key]; | |
| 386 List<CacheState> oldStates = countMap.keys.toList(); | |
| 387 oldStates.sort((CacheState first, CacheState second) => | |
| 388 first.toString().compareTo(second.toString())); | |
| 389 buffer.write('<p>${key.toString()}</p>'); | |
| 390 buffer.write( | |
| 391 '<table style="border-collapse: separate; border-spacing: 10px
5px;">'); | |
| 392 _writeRow(buffer, ['Count', 'Previous State'], header: true); | |
| 393 for (CacheState state in oldStates) { | |
| 394 _writeRow(buffer, [countMap[state], state.toString()], | |
| 395 classes: ["right", null]); | |
| 396 } | |
| 397 buffer.write('</table>'); | |
| 398 } | |
| 399 } | |
| 400 } | |
| 401 }); | 363 }); |
| 402 }); | 364 }); |
| 403 } | 365 } |
| 404 | 366 |
| 405 /** | 367 /** |
| 406 * Return a response containing information about an AST structure. | 368 * Return a response containing information about an AST structure. |
| 407 */ | 369 */ |
| 408 void _returnAst(HttpRequest request) { | 370 void _returnAst(HttpRequest request) { |
| 409 AnalysisServer analysisServer = _server.analysisServer; | 371 AnalysisServer analysisServer = _server.analysisServer; |
| 410 if (analysisServer == null) { | 372 if (analysisServer == null) { |
| (...skipping 1258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1669 */ | 1631 */ |
| 1670 static String makeLink( | 1632 static String makeLink( |
| 1671 String path, Map<String, String> params, String innerHtml, | 1633 String path, Map<String, String> params, String innerHtml, |
| 1672 [bool hasError = false]) { | 1634 [bool hasError = false]) { |
| 1673 Uri uri = new Uri(path: path, queryParameters: params); | 1635 Uri uri = new Uri(path: path, queryParameters: params); |
| 1674 String href = HTML_ESCAPE.convert(uri.toString()); | 1636 String href = HTML_ESCAPE.convert(uri.toString()); |
| 1675 String classAttribute = hasError ? ' class="error"' : ''; | 1637 String classAttribute = hasError ? ' class="error"' : ''; |
| 1676 return '<a href="$href"$classAttribute>$innerHtml</a>'; | 1638 return '<a href="$href"$classAttribute>$innerHtml</a>'; |
| 1677 } | 1639 } |
| 1678 } | 1640 } |
| OLD | NEW |