Chromium Code Reviews| Index: tracing/tracing/extras/chrome/cpu_time_multidimensional_view.md |
| diff --git a/tracing/tracing/extras/chrome/cpu_time_multidimensional_view.md b/tracing/tracing/extras/chrome/cpu_time_multidimensional_view.md |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..f687f589f0788728fe79056dbe4f8627892e389f |
| --- /dev/null |
| +++ b/tracing/tracing/extras/chrome/cpu_time_multidimensional_view.md |
| @@ -0,0 +1,77 @@ |
| +<!-- Copyright 2017 The Chromium Authors. All rights reserved. |
| + Use of this source code is governed by a BSD-style license that can be |
| + found in the LICENSE file. |
| +--> |
| + |
| +# CPU Time MultiDimensionalView Explainer |
| + |
| +This document explains the MultiDimensionalView returned by `constructMultiDimensionalView` in `cpuTime.html`. |
| + |
| +The returned MultiDimensionalView in TopDownTreeView mode. It is three |
|
tdresser
2017/04/10 20:48:29
I think this sentence missing a word?
dproy
2017/05/11 00:50:46
Was missing 'is'. Fixed.
|
| +dimensional (processType, threadType, and railStage + initiator). Rail stage and |
| +initiator are not separate dimensions because they are not independent - there |
| +is no such thing as CSS Response or Scroll Load. |
| + |
| +Each node in the tree view contains two values - cpuUsage and cpuTotal. |
| + |
| +When talking about multidimensional tree views, a useful abstration is "path", |
| +which uniquely determines a node in the tree: A path is a 3 element array, and |
| +each of these three elements is a possibly empty array of strings. Here is an |
| +example path: |
| +[ ['browser_process'], ['CrBrowserMain'], ['Animation', 'CSS'] ] |
| + Dimension 1 Dimension 2 Dimension 3 |
| + |
| +We can arrive at the node denoted by this path in many different ways starting |
| +from the root node, so this path is not to be confused with the graph theoretic |
| +notion of path. Here is one of the ways to reach the node (we show the |
| +intermediate paths during the traversal inline): |
| + |
| +```javascript |
| +const node = treeRoot // [[], [], []] |
| + .children[0] // access children along first dimension |
| + .get('browser_process') // [['browser_process'], [], []] |
| + .children[2] // access children along third dimension |
| + .get('Animation') // [['browser_process'], [], ['Animation']] |
| + .children[1] // Access children along second dimension |
| + .get('CrBrowserMain') // [['browser_process'], ['CrBrowserMain'], ['Animation']] |
| + .children[2] // Go further down along third dimension |
| + .get('CSS') // [['browser_process'], ['CrBrowserMain'], ['Animation', 'CSS']] |
| +``` |
| +Now node.values contains the cpu time data for the browser main thread during |
| +the CSS Animation stage: |
| +- `node.values[0]` is `cpuUsage` - cpu time over per unit of wall clock time |
| +- `node.values[1]` is `cpuTotal` - total miliseconds of used cpu time |
| + |
| +The path for the node that hold data for all threads of renderer process |
| +during scroll response expectations is `[['renderer_process'], [], ['Response', 'Scroll']]`. |
| + |
| +As we can see, we simply have an empty array for the second dimension. This |
| +works similarly if we want to get data for all processes for a particular |
| +thread. |
| + |
| +However, if we want to access data for all rail stages and all initiator |
| +types, we have to use the special rail stage `all_stages`, and initiator |
| +type `all_initiators`. For example, to get cpu data during all Response |
| +stages for all processes and threads, we use the node at path |
| + `[[], [], ['Response', 'all_initiators']]` |
| + |
| +To get cpu data for all rail stages for ChildIOThread, we use the path |
| + `[[], ['ChildIOThread'], ['all_stages', 'all_initiators']]` |
| + |
| +This is because the tree view automatically aggregates cpu time |
| +data along each dimension by summing values on the children nodes. For |
| +aggregating rail stages and initiator types, summing is not the right thing |
| +to do since |
| + |
| + 1. User Expectations can overlap (for example, one tab can go through a |
| + Video Animation while another tab is concurrently going through a CSS |
| + Animation - it's worth noting that user expectations are not scoped to a |
| + tab.) |
| + |
| + 2. Different rail stages have different durations (for example, if we |
| + have 200ms of Video Animation with 50% cpuUsage, and 500ms of CSS |
| + Animation with 60% cpuUage, cpuUsage for all Animations is clearly not |
| + 110%.) |
| + |
| +We therefore more manually do the appropriate aggregations and store the |
| +data in `all_stages` and `all_initiators` nodes. |