Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(236)

Unified Diff: tracing/tracing/extras/chrome/cpu_time_multidimensional_view.md

Issue 2807243002: Construct Cpu Time MultidimensionalView (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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.

Powered by Google App Engine
This is Rietveld 408576698