| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 cpu_profile_table_element; | 5 library cpu_profile_table_element; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:html'; | 8 import 'dart:html'; |
| 9 import 'package:observatory/models.dart' as M; | 9 import 'package:observatory/models.dart' as M; |
| 10 import 'package:observatory/src/elements/containers/virtual_collection.dart'; | 10 import 'package:observatory/src/elements/containers/virtual_collection.dart'; |
| 11 import 'package:observatory/src/elements/cpu_profile/virtual_tree.dart'; | 11 import 'package:observatory/src/elements/cpu_profile/virtual_tree.dart'; |
| 12 import 'package:observatory/src/elements/function_ref.dart'; | 12 import 'package:observatory/src/elements/function_ref.dart'; |
| 13 import 'package:observatory/src/elements/helpers/nav_bar.dart'; |
| 14 import 'package:observatory/src/elements/helpers/nav_menu.dart'; |
| 13 import 'package:observatory/src/elements/helpers/rendering_scheduler.dart'; | 15 import 'package:observatory/src/elements/helpers/rendering_scheduler.dart'; |
| 14 import 'package:observatory/src/elements/helpers/tag.dart'; | 16 import 'package:observatory/src/elements/helpers/tag.dart'; |
| 15 import 'package:observatory/src/elements/helpers/uris.dart'; | 17 import 'package:observatory/src/elements/helpers/uris.dart'; |
| 16 import 'package:observatory/src/elements/nav/bar.dart'; | |
| 17 import 'package:observatory/src/elements/nav/isolate_menu.dart'; | 18 import 'package:observatory/src/elements/nav/isolate_menu.dart'; |
| 18 import 'package:observatory/src/elements/nav/menu.dart'; | |
| 19 import 'package:observatory/src/elements/nav/notify.dart'; | 19 import 'package:observatory/src/elements/nav/notify.dart'; |
| 20 import 'package:observatory/src/elements/nav/refresh.dart'; | 20 import 'package:observatory/src/elements/nav/refresh.dart'; |
| 21 import 'package:observatory/src/elements/nav/top_menu.dart'; | 21 import 'package:observatory/src/elements/nav/top_menu.dart'; |
| 22 import 'package:observatory/src/elements/nav/vm_menu.dart'; | 22 import 'package:observatory/src/elements/nav/vm_menu.dart'; |
| 23 import 'package:observatory/src/elements/sample_buffer_control.dart'; | 23 import 'package:observatory/src/elements/sample_buffer_control.dart'; |
| 24 import 'package:observatory/src/elements/stack_trace_tree_config.dart'; | 24 import 'package:observatory/src/elements/stack_trace_tree_config.dart'; |
| 25 import 'package:observatory/utils.dart'; | 25 import 'package:observatory/utils.dart'; |
| 26 | 26 |
| 27 enum _Table { | 27 enum _Table { |
| 28 functions, | 28 functions, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 40 | 40 |
| 41 enum _SortingDirection { | 41 enum _SortingDirection { |
| 42 ascending, | 42 ascending, |
| 43 descending | 43 descending |
| 44 } | 44 } |
| 45 | 45 |
| 46 class CpuProfileTableElement extends HtmlElement implements Renderable { | 46 class CpuProfileTableElement extends HtmlElement implements Renderable { |
| 47 static const tag = const Tag<CpuProfileTableElement>('cpu-profile-table', | 47 static const tag = const Tag<CpuProfileTableElement>('cpu-profile-table', |
| 48 dependencies: const [ | 48 dependencies: const [ |
| 49 FunctionRefElement.tag, | 49 FunctionRefElement.tag, |
| 50 NavBarElement.tag, | |
| 51 NavTopMenuElement.tag, | 50 NavTopMenuElement.tag, |
| 52 NavVMMenuElement.tag, | 51 NavVMMenuElement.tag, |
| 53 NavIsolateMenuElement.tag, | 52 NavIsolateMenuElement.tag, |
| 54 NavMenuElement.tag, | |
| 55 NavRefreshElement.tag, | 53 NavRefreshElement.tag, |
| 56 NavNotifyElement.tag, | 54 NavNotifyElement.tag, |
| 57 SampleBufferControlElement.tag, | 55 SampleBufferControlElement.tag, |
| 58 StackTraceTreeConfigElement.tag, | 56 StackTraceTreeConfigElement.tag, |
| 59 CpuProfileVirtualTreeElement.tag, | 57 CpuProfileVirtualTreeElement.tag, |
| 60 VirtualCollectionElement.tag | 58 VirtualCollectionElement.tag |
| 61 ]); | 59 ]); |
| 62 | 60 |
| 63 RenderingScheduler<CpuProfileTableElement> _r; | 61 RenderingScheduler<CpuProfileTableElement> _r; |
| 64 | 62 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 | 118 |
| 121 @override | 119 @override |
| 122 detached() { | 120 detached() { |
| 123 super.detached(); | 121 super.detached(); |
| 124 _r.disable(notify: true); | 122 _r.disable(notify: true); |
| 125 children = []; | 123 children = []; |
| 126 } | 124 } |
| 127 | 125 |
| 128 void render() { | 126 void render() { |
| 129 var content = [ | 127 var content = [ |
| 130 new NavBarElement(queue: _r.queue) | 128 navBar([ |
| 131 ..children = [ | 129 new NavTopMenuElement(queue: _r.queue), |
| 132 new NavTopMenuElement(queue: _r.queue), | 130 new NavVMMenuElement(_vm, _events, queue: _r.queue), |
| 133 new NavVMMenuElement(_vm, _events, queue: _r.queue), | 131 new NavIsolateMenuElement(_isolate, _events, queue: _r.queue), |
| 134 new NavIsolateMenuElement(_isolate, _events, queue: _r.queue), | 132 navMenu('cpu profile (table)'), |
| 135 new NavMenuElement('cpu profile (table)', | 133 new NavRefreshElement(queue: _r.queue) |
| 136 link: Uris.cpuProfilerTable(_isolate), last: true, queue: _r.queue
), | 134 ..onRefresh.listen(_refresh), |
| 137 new NavRefreshElement(queue: _r.queue) | 135 new NavRefreshElement(label: 'Clear', queue: _r.queue) |
| 138 ..onRefresh.listen(_refresh), | 136 ..onRefresh.listen(_clearCpuProfile), |
| 139 new NavRefreshElement(label: 'Clear', queue: _r.queue) | 137 new NavNotifyElement(_notifications, queue: _r.queue) |
| 140 ..onRefresh.listen(_clearCpuProfile), | 138 ]), |
| 141 new NavNotifyElement(_notifications, queue: _r.queue) | |
| 142 ], | |
| 143 ]; | 139 ]; |
| 144 if (_progress == null) { | 140 if (_progress == null) { |
| 145 children = content; | 141 children = content; |
| 146 return; | 142 return; |
| 147 } | 143 } |
| 148 content.add(new SampleBufferControlElement(_progress, _progressStream, | 144 content.add(new SampleBufferControlElement(_progress, _progressStream, |
| 149 showTag: false, queue: _r.queue)); | 145 showTag: false, queue: _r.queue)); |
| 150 if (_progress.status == M.SampleProfileLoadingStatus.loaded) { | 146 if (_progress.status == M.SampleProfileLoadingStatus.loaded) { |
| 151 content.add(new BRElement()); | 147 content.add(new BRElement()); |
| 152 content.addAll(_createTables()); | 148 content.addAll(_createTables()); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 _Table.functions, | 249 _Table.functions, |
| 254 _SortingField.exclusive, | 250 _SortingField.exclusive, |
| 255 _SortingDirection.descending), | 251 _SortingDirection.descending), |
| 256 _createHeaderButton(const ['inclusive'], 'Stack(%)', | 252 _createHeaderButton(const ['inclusive'], 'Stack(%)', |
| 257 _Table.functions, | 253 _Table.functions, |
| 258 _SortingField.inclusive, | 254 _SortingField.inclusive, |
| 259 _SortingDirection.descending), | 255 _SortingDirection.descending), |
| 260 _createHeaderButton(const ['name'], 'Method', | 256 _createHeaderButton(const ['name'], 'Method', |
| 261 _Table.functions, | 257 _Table.functions, |
| 262 _SortingField.method, | 258 _SortingField.method, |
| 263 _SortingDirection.descending), | 259 _SortingDirection.ascending), |
| 264 ]; | 260 ]; |
| 265 | 261 |
| 266 void _setSorting(_Table table, | 262 void _setSorting(_Table table, |
| 267 _SortingField field, | 263 _SortingField field, |
| 268 _SortingDirection defaultDirection) { | 264 _SortingDirection defaultDirection) { |
| 269 if (_sortingField[table] == field) { | 265 if (_sortingField[table] == field) { |
| 270 switch (_sortingDirection[table]) { | 266 switch (_sortingDirection[table]) { |
| 271 case _SortingDirection.descending: | 267 case _SortingDirection.descending: |
| 272 _sortingDirection[table] = _SortingDirection.ascending; | 268 _sortingDirection[table] = _SortingDirection.ascending; |
| 273 break; | 269 break; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 new DivElement() | 306 new DivElement() |
| 311 ..classes = ['function-item'] | 307 ..classes = ['function-item'] |
| 312 ..children = [ | 308 ..children = [ |
| 313 _createHeaderButton(const ['inclusive'], 'Callees(%)', | 309 _createHeaderButton(const ['inclusive'], 'Callees(%)', |
| 314 _Table.callee, | 310 _Table.callee, |
| 315 _SortingField.callee, | 311 _SortingField.callee, |
| 316 _SortingDirection.descending), | 312 _SortingDirection.descending), |
| 317 _createHeaderButton(const ['name'], 'Method', | 313 _createHeaderButton(const ['name'], 'Method', |
| 318 _Table.callee, | 314 _Table.callee, |
| 319 _SortingField.method, | 315 _SortingField.method, |
| 320 _SortingDirection.descending), | 316 _SortingDirection.ascending), |
| 321 ]; | 317 ]; |
| 322 | 318 |
| 323 Element _createCaller() { | 319 Element _createCaller() { |
| 324 final element = new DivElement() | 320 final element = new DivElement() |
| 325 ..classes = ['function-item'] | 321 ..classes = ['function-item'] |
| 326 ..children = [ | 322 ..children = [ |
| 327 new SpanElement()..classes = ['inclusive'] | 323 new SpanElement()..classes = ['inclusive'] |
| 328 ..text = '0%', | 324 ..text = '0%', |
| 329 new SpanElement()..classes = ['name'] | 325 new SpanElement()..classes = ['name'] |
| 330 ]; | 326 ]; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 348 new DivElement() | 344 new DivElement() |
| 349 ..classes = ['function-item'] | 345 ..classes = ['function-item'] |
| 350 ..children = [ | 346 ..children = [ |
| 351 _createHeaderButton(const ['inclusive'], 'Callers(%)', | 347 _createHeaderButton(const ['inclusive'], 'Callers(%)', |
| 352 _Table.caller, | 348 _Table.caller, |
| 353 _SortingField.caller, | 349 _SortingField.caller, |
| 354 _SortingDirection.descending), | 350 _SortingDirection.descending), |
| 355 _createHeaderButton(const ['name'], 'Method', | 351 _createHeaderButton(const ['name'], 'Method', |
| 356 _Table.caller, | 352 _Table.caller, |
| 357 _SortingField.method, | 353 _SortingField.method, |
| 358 _SortingDirection.descending), | 354 _SortingDirection.ascending), |
| 359 ]; | 355 ]; |
| 360 | 356 |
| 361 ButtonElement _createHeaderButton(List<String> classes, | 357 ButtonElement _createHeaderButton(List<String> classes, |
| 362 String text, | 358 String text, |
| 363 _Table table, | 359 _Table table, |
| 364 _SortingField field, | 360 _SortingField field, |
| 365 _SortingDirection direction) => | 361 _SortingDirection direction) => |
| 366 new ButtonElement()..classes = classes | 362 new ButtonElement()..classes = classes |
| 367 ..text = _sortingField[table] != field ? text : | 363 ..text = _sortingField[table] != field ? text : |
| 368 _sortingDirection[table] == _SortingDirection.ascending | 364 _sortingDirection[table] == _SortingDirection.ascending |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 451 | 447 |
| 452 static double _getExclusiveT(M.ProfileFunction f) => | 448 static double _getExclusiveT(M.ProfileFunction f) => |
| 453 f.normalizedExclusiveTicks; | 449 f.normalizedExclusiveTicks; |
| 454 static double _getInclusiveT(M.ProfileFunction f) => | 450 static double _getInclusiveT(M.ProfileFunction f) => |
| 455 f.normalizedInclusiveTicks; | 451 f.normalizedInclusiveTicks; |
| 456 double _getCalleeT(M.ProfileFunction f) => | 452 double _getCalleeT(M.ProfileFunction f) => |
| 457 _selected.callees[f] / _selected.callees.values.reduce((a, b) => a + b); | 453 _selected.callees[f] / _selected.callees.values.reduce((a, b) => a + b); |
| 458 double _getCallerT(M.ProfileFunction f) => | 454 double _getCallerT(M.ProfileFunction f) => |
| 459 _selected.callers[f] / _selected.callers.values.reduce((a, b) => a + b); | 455 _selected.callers[f] / _selected.callers.values.reduce((a, b) => a + b); |
| 460 } | 456 } |
| OLD | NEW |