1
1
import Ember from 'ember' ;
2
- // import require from 'require';
3
- // Import the D3 packages we want to use
4
- // import gFlameGraph from '../../vendor/shims/d3-flame-graphs';
5
- // import gFlameGraph from 'npm:d3-flame-graphs';
6
- // const gFlameGraph = require('d3-flame-graphs/dist/d3-flame-graph');
7
- // import d3 from 'd3';
8
2
import FlameGraph from '../utils/d3-flame-graphs-v4/d3-flame-graph' ;
9
3
10
4
const { run, get, inject } = Ember ;
@@ -13,6 +7,7 @@ export default Ember.Component.extend({
13
7
classNames : [ 'flame-graph' ] ,
14
8
graph : inject . service ( ) ,
15
9
flameGraph : null ,
10
+ totalTime : Ember . computed . alias ( 'graph.data.summary.totalTime' ) ,
16
11
17
12
init ( ) {
18
13
this . _super ( ...arguments ) ;
@@ -24,12 +19,7 @@ export default Ember.Component.extend({
24
19
this . _scheduleDraw ( ) ;
25
20
} ,
26
21
27
- // didInsertElement() {
28
- // this._scheduleDraw();
29
- // },
30
-
31
22
_scheduleDraw ( ) {
32
- // let graphData = get(this, 'graphData');
33
23
let graphData = get ( this , 'graph.graph' ) ;
34
24
35
25
if ( this . _lastGraphData !== graphData && graphData ) {
@@ -39,6 +29,16 @@ export default Ember.Component.extend({
39
29
}
40
30
} ,
41
31
32
+ formatTime ( ms ) {
33
+ if ( ms > 1000000000 ) {
34
+ return ( Math . round ( ms / 1000000000 * 100 ) / 100 ) . toFixed ( 1 ) + 's' ;
35
+ } else if ( ms > 1000000 ) {
36
+ return ( Math . round ( ms / 1000000 * 100 ) / 100 ) . toFixed ( 0 ) + 'ms' ;
37
+ } else {
38
+ return ( Math . round ( ms / 1000000 * 100 ) / 100 ) . toFixed ( 1 ) + 'ms' ;
39
+ }
40
+ } ,
41
+
42
42
convert ( rawData ) {
43
43
let child , node , subTree , _i , _len , _ref ;
44
44
@@ -64,30 +64,36 @@ export default Ember.Component.extend({
64
64
treeValue += subTree . treeValue ;
65
65
}
66
66
node . treeValue = treeValue ;
67
+ node . time = this . formatTime ( node . treeValue ) ;
68
+ node . percent = ( ( node . treeValue / this . get ( 'totalTime' ) ) * 100 ) . toFixed ( 1 ) + "%" ;
67
69
return node ;
68
70
} ,
69
71
70
72
drawFlame ( data ) {
73
+ let _this = this ;
71
74
let profile = this . convert ( data ) ;
72
- console . log ( 'profile: ' , profile ) ;
73
- let indent = 0 ;
74
75
75
- let formatTime = function ( ms ) {
76
- if ( ms > 1000000000 ) {
77
- return ( ms / 1000000000 ) . toFixed ( 3 ) + 's' ;
78
- }
79
- return ( ms / 1000000 ) . toFixed ( 1 ) + 'ms' ;
80
- } ;
76
+ let indent = - 1 ;
81
77
let objToString = function ( obj ) {
82
78
indent ++ ;
83
79
let str = '' ;
80
+ let pad = " " ;
84
81
for ( let p in obj ) {
85
82
if ( obj . hasOwnProperty ( p ) && p !== 'own' ) {
86
83
if ( typeof obj [ p ] === 'object' ) {
87
- str += ' ' . repeat ( indent ) + p + ': ' + ( indent <= 1 && p !== 'time' ? '<br/>' : '' ) + objToString ( obj [ p ] ) ;
84
+ if ( p !== 'time' ) {
85
+ let padded = p + pad . repeat ( 13 ) . substring ( 0 , pad . length * 13 - p . length * 6 ) ;
86
+ str += ' ' . repeat ( indent ) + padded + ( indent <= 0 ? '<br/>' : '' ) + objToString ( obj [ p ] ) ;
87
+ }
88
88
} else {
89
- str += ' ' . repeat ( indent ) + p + ': ' + ( ( p === 'time' || p === 'self' ) ? formatTime ( obj [ p ] ) : obj [ p ] ) ;
90
- str += p !== 'count' ? '<br/>' : '' ;
89
+ if ( p === 'count' ) {
90
+ let padded = pad . repeat ( 5 ) . substring ( 0 , pad . length * 5 - obj [ p ] . toString ( ) . length * 6 ) + obj [ p ] ;
91
+ str += padded ;
92
+ } else if ( p === 'time' ) {
93
+ let time = _this . formatTime ( obj [ p ] ) ;
94
+ let padded = ' ' + pad . repeat ( 8 ) . substring ( 0 , pad . length * 8 - time . length * 6 ) + time + '<br/>' ;
95
+ str += padded ;
96
+ }
91
97
}
92
98
}
93
99
}
@@ -96,20 +102,23 @@ export default Ember.Component.extend({
96
102
} ;
97
103
98
104
let tooltip = function ( d ) {
99
- return "" + d . data . name + " <br/><br/>" + formatTime ( d . data . treeValue ) + " (" + ( ( ( d . data . treeValue / profile . treeValue ) * 100 ) . toFixed ( 2 ) ) + "% of total)<br/>" +
100
- objToString ( d . data . stats ) ;
105
+ let time = _this . formatTime ( d . data . treeValue ) ;
106
+ let percent = " [" + ( ( ( d . data . treeValue / _this . get ( 'totalTime' ) ) * 100 ) . toFixed ( 1 ) ) + "%]" ;
107
+ let self = " (self: " + _this . formatTime ( d . data . stats . time . self ) + ")" ;
108
+ let res = d . data . name + "<br/>" + time + percent + self + "<br/>" + objToString ( d . data . stats ) ;
109
+ return res ;
101
110
} ;
102
111
103
112
let clientHeight = document . getElementsByClassName ( 'flame-graph' ) [ 0 ] . clientHeight ;
113
+ clientHeight -= clientHeight % 20 ;
104
114
let clientWidth = document . getElementsByClassName ( 'flame-graph' ) [ 0 ] . clientWidth ;
105
115
106
116
this . flameGraph = new FlameGraph ( '#d3-flame-graph' , profile , true )
107
- // .size([clientWidth, clientHeight - 3])
108
- . size ( [ 1343 , 640 ] )
117
+ . size ( [ clientWidth , clientHeight ] )
109
118
. cellHeight ( 20 )
110
119
. zoomEnabled ( true )
111
- . zoomAction ( function ( node , event ) {
112
- return console . log ( 'ZoomAction: ' , node , event ) ;
113
- } ) . tooltip ( tooltip ) . render ( ) ;
120
+ . zoomAction ( ( node , event ) => console . log ( 'Zoom: ' , node , event ) )
121
+ . labelFunction ( d => d . data . name + ' [' + d . data . time + ' / ' + d . data . percent + ']' )
122
+ . tooltip ( tooltip ) . render ( ) ;
114
123
}
115
124
} ) ;
0 commit comments