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 |