+ [android] tracing
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/38bffdf3 Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/38bffdf3 Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/38bffdf3 Branch: refs/heads/0.16-dev Commit: 38bffdf3654859ab5687e5db866d5962be1c5929 Parents: 6ae8f8d Author: moxun.ljf <furm...@foxmail.com> Authored: Mon Jun 12 15:35:50 2017 +0800 Committer: moxun.ljf <furm...@foxmail.com> Committed: Mon Jun 12 15:35:50 2017 +0800 ---------------------------------------------------------------------- .../java/com/taobao/weex/common/WXTracing.java | 33 ++++++++++++++++++++ .../taobao/weex/dom/DOMActionContextImpl.java | 10 +++++- .../java/com/taobao/weex/dom/WXDomHandler.java | 9 ++++++ .../java/com/taobao/weex/dom/WXDomModule.java | 2 -- .../java/com/taobao/weex/dom/WXDomTask.java | 1 + .../dom/action/AbstractAddElementAction.java | 8 +++++ .../weex/dom/action/AddElementAction.java | 6 +++- .../taobao/weex/dom/action/AddEventAction.java | 5 +++ .../com/taobao/weex/ui/WXRenderManager.java | 8 ++++- 9 files changed, 77 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38bffdf3/android/sdk/src/main/java/com/taobao/weex/common/WXTracing.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/common/WXTracing.java b/android/sdk/src/main/java/com/taobao/weex/common/WXTracing.java index 49fbe4b..bc37386 100644 --- a/android/sdk/src/main/java/com/taobao/weex/common/WXTracing.java +++ b/android/sdk/src/main/java/com/taobao/weex/common/WXTracing.java @@ -1,5 +1,10 @@ package com.taobao.weex.common; +import android.os.Message; + +import com.taobao.weex.dom.WXDomHandler; +import com.taobao.weex.dom.WXDomTask; +import com.taobao.weex.dom.action.Action; import com.taobao.weex.utils.WXLogUtils; import java.util.concurrent.atomic.AtomicInteger; @@ -40,4 +45,32 @@ public class WXTracing { return sb.toString(); } } + + public static String getFunctionName(Message msg) { + Object obj = msg.obj; + if (obj != null && obj instanceof WXDomTask) { + Object action = ((WXDomTask) obj).args.get(0); + if (action instanceof Action) { + return getFunctionName(action.getClass()); + } + } + + String actionName = "unknown"; + int what = msg.what; + if (what == WXDomHandler.MsgType.WX_DOM_BATCH) { + actionName = "domBatch"; + } else if (what == WXDomHandler.MsgType.WX_DOM_UPDATE_STYLE) { + actionName = "updateStyle"; + } else if (what == WXDomHandler.MsgType.WX_CONSUME_RENDER_TASKS) { + actionName = "consumeRenderTasks"; + } + return actionName; + } + + public static String getFunctionName(Class clazz) { + String simpleName = clazz.getSimpleName(); + char[] chars = simpleName.replace("Action", "").toCharArray(); + chars[0] = Character.toLowerCase(chars[0]); + return new String(chars); + } } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38bffdf3/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java b/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java index c30ba13..6e1e385 100644 --- a/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java +++ b/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java @@ -31,6 +31,7 @@ import com.taobao.weex.ui.WXRenderManager; import com.taobao.weex.ui.animation.WXAnimationBean; import com.taobao.weex.ui.component.WXComponent; import com.taobao.weex.ui.component.WXVContainer; +import com.taobao.weex.utils.Stopwatch; import com.taobao.weex.utils.WXLogUtils; import java.util.ArrayList; @@ -181,8 +182,9 @@ class DOMActionContextImpl implements DOMActionContext { return; } long start0 = System.currentTimeMillis(); - + Stopwatch.tick(); rebuildingFixedDomTree(rootDom); + WXLogUtils.e("Tracing", "rebuildingFixedDomTree " + Stopwatch.tackAndTick() + " ms"); rootDom.traverseTree( new WXDomObject.Consumer() { @Override @@ -193,10 +195,13 @@ class DOMActionContextImpl implements DOMActionContext { dom.layoutBefore(); } }); + WXLogUtils.e("Tracing", "layoutBefore " + Stopwatch.tackAndTick() + " ms"); long start = System.currentTimeMillis(); + long s = System.nanoTime(); rootDom.calculateLayout(mLayoutContext); + WXLogUtils.e("Tracing", "layout " + Stopwatch.tackAndTick() + " ms"); WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(mInstanceId); if (instance != null) { @@ -212,9 +217,11 @@ class DOMActionContextImpl implements DOMActionContext { dom.layoutAfter(); } }); + WXLogUtils.e("Tracing", "layoutAfter " + Stopwatch.tackAndTick() + " ms"); start = System.currentTimeMillis(); rootDom.traverseTree(new ApplyUpdateConsumer()); + WXLogUtils.e("Tracing", "applyUpdateConsumer " + Stopwatch.tackAndTick() + " ms"); if (instance != null) { instance.applyUpdateTime(System.currentTimeMillis() - start); @@ -225,6 +232,7 @@ class DOMActionContextImpl implements DOMActionContext { if (instance != null) { instance.updateDomObjTime(System.currentTimeMillis() - start); } + WXLogUtils.e("Tracing", "updateDomObj " + Stopwatch.tack() + " ms"); parseAnimation(); boolean isPreRenderMode = instance != null && instance.isPreRenderMode(); http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38bffdf3/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java index eec3d0b..03f6940 100644 --- a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java +++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java @@ -20,9 +20,12 @@ package com.taobao.weex.dom; import android.os.Handler; import android.os.Message; +import android.os.SystemClock; import com.alibaba.fastjson.JSONObject; +import com.taobao.weex.common.WXTracing; import com.taobao.weex.dom.action.Actions; +import com.taobao.weex.utils.WXLogUtils; /** * Handler for dom operations. @@ -42,6 +45,8 @@ public class WXDomHandler implements Handler.Callback { @Override public boolean handleMessage(Message msg) { + long s = System.nanoTime(); + String actionName = WXTracing.getFunctionName(msg); if (msg == null) { return false; } @@ -51,6 +56,9 @@ public class WXDomHandler implements Handler.Callback { if (obj instanceof WXDomTask) { task = (WXDomTask) obj; + WXLogUtils.e("Tracing", "Method " + actionName + ", Queue time " + ((s - task.startTime) / 1000000.0) + " ms"); + } else { + WXLogUtils.e("Tracing", "Method " + actionName + ", Queue time " + (SystemClock.uptimeMillis() - msg.getWhen()) + " ms"); } if (!mHasBatch) { @@ -78,6 +86,7 @@ public class WXDomHandler implements Handler.Callback { default: break; } + WXLogUtils.e("Tracing", "Method " + actionName + ", Dom execute time " + ((System.nanoTime() - s) / 1000000.0) + " ms"); return true; } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38bffdf3/android/sdk/src/main/java/com/taobao/weex/dom/WXDomModule.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomModule.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomModule.java index 192481f..7d63c39 100644 --- a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomModule.java +++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomModule.java @@ -18,8 +18,6 @@ */ package com.taobao.weex.dom; -import android.os.Message; - import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.taobao.weex.WXSDKInstance; http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38bffdf3/android/sdk/src/main/java/com/taobao/weex/dom/WXDomTask.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomTask.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomTask.java index df5943b..140b668 100644 --- a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomTask.java +++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomTask.java @@ -30,4 +30,5 @@ public class WXDomTask implements IWXTask { public String instanceId; public List<Object> args; + public long startTime = System.nanoTime(); } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38bffdf3/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractAddElementAction.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractAddElementAction.java b/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractAddElementAction.java index fa017cb..b3b27a6 100644 --- a/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractAddElementAction.java +++ b/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractAddElementAction.java @@ -31,6 +31,7 @@ import com.taobao.weex.dom.WXDomObject; import com.taobao.weex.ui.component.WXComponent; import com.taobao.weex.ui.component.WXComponentFactory; import com.taobao.weex.ui.component.WXVContainer; +import com.taobao.weex.utils.Stopwatch; import com.taobao.weex.utils.WXLogUtils; /** @@ -80,7 +81,9 @@ abstract class AbstractAddElementAction implements DOMAction, RenderAction { } //only non-root has parent. + Stopwatch.tick(); WXDomObject domObject = WXDomObject.parse(dom, instance); + WXLogUtils.e("Tracing", "Component " + domObject.getRef() + " parseDomObject " + Stopwatch.tackAndTick() + " ms"); if (domObject == null || context.getDomByRef(domObject.getRef()) != null) { if (WXEnvironment.isApkDebugable()) { @@ -90,11 +93,14 @@ abstract class AbstractAddElementAction implements DOMAction, RenderAction { return; } appendDomToTree(context, domObject); + WXLogUtils.e("Tracing", "Component " + domObject.getRef() + " appendDomToTree " + Stopwatch.tackAndTick() + " ms"); domObject.traverseTree( context.getAddDOMConsumer(), context.getApplyStyleConsumer() ); + WXLogUtils.e("Tracing", "Component " + domObject.getRef() + " traverseTree " + Stopwatch.tackAndTick() + " ms"); + //Create component in dom thread WXComponent component = createComponent(context, domObject); @@ -103,6 +109,8 @@ abstract class AbstractAddElementAction implements DOMAction, RenderAction { //stop redner, some fatal happened. return; } + WXLogUtils.e("Tracing", "Component " + domObject.getRef() + " createComponent " + Stopwatch.tackAndTick() + " ms"); + context.addDomInfo(domObject.getRef(), component); context.postRenderTask(this); addAnimationForDomTree(context, domObject); http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38bffdf3/android/sdk/src/main/java/com/taobao/weex/dom/action/AddElementAction.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/action/AddElementAction.java b/android/sdk/src/main/java/com/taobao/weex/dom/action/AddElementAction.java index a5e1254..a4b3adf 100644 --- a/android/sdk/src/main/java/com/taobao/weex/dom/action/AddElementAction.java +++ b/android/sdk/src/main/java/com/taobao/weex/dom/action/AddElementAction.java @@ -27,6 +27,7 @@ import com.taobao.weex.dom.RenderActionContext; import com.taobao.weex.dom.WXDomObject; import com.taobao.weex.ui.component.WXComponent; import com.taobao.weex.ui.component.WXVContainer; +import com.taobao.weex.utils.Stopwatch; import com.taobao.weex.utils.WXLogUtils; /** @@ -97,11 +98,14 @@ final class AddElementAction extends AbstractAddElementAction { if (parent == null || component == null) { return; } - + Stopwatch.tick(); parent.addChild(component, mAddIndex); parent.createChildViewAt(mAddIndex); + WXLogUtils.e("Tracing", "Component " + mRef + " createViewTree " + Stopwatch.tackAndTick() + " ms"); component.applyLayoutAndEvent(component); + WXLogUtils.e("Tracing", "Component " + mRef + " applyLayoutAndEvent " + Stopwatch.tackAndTick() + " ms"); component.bindData(component); + WXLogUtils.e("Tracing", "Component " + mRef + " bindData " + Stopwatch.tackAndTick() + " ms"); } catch (Exception e) { WXLogUtils.e("add component failed.", e); } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38bffdf3/android/sdk/src/main/java/com/taobao/weex/dom/action/AddEventAction.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/action/AddEventAction.java b/android/sdk/src/main/java/com/taobao/weex/dom/action/AddEventAction.java index 13dac2f..e051917 100644 --- a/android/sdk/src/main/java/com/taobao/weex/dom/action/AddEventAction.java +++ b/android/sdk/src/main/java/com/taobao/weex/dom/action/AddEventAction.java @@ -27,6 +27,8 @@ import com.taobao.weex.dom.RenderAction; import com.taobao.weex.dom.RenderActionContext; import com.taobao.weex.dom.WXDomObject; import com.taobao.weex.ui.component.WXComponent; +import com.taobao.weex.utils.Stopwatch; +import com.taobao.weex.utils.WXLogUtils; /** * Created by sospartan on 01/03/2017. @@ -69,8 +71,11 @@ class AddEventAction implements DOMAction, RenderAction { WXComponent comp = context.getComponent(mRef); if(comp != null){ //sync dom change to component + Stopwatch.tick(); comp.updateDom(mUpdatedDom); + WXLogUtils.e("Tracing", "updateDom " + Stopwatch.tackAndTick() + " ms"); comp.addEvent(mEvent); + WXLogUtils.e("Tracing", "addEvent " + Stopwatch.tackAndTick() + " ms"); } } } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38bffdf3/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java b/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java index 9c74b36..77e1b1b 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java @@ -24,10 +24,12 @@ import android.text.TextUtils; import com.taobao.weex.WXSDKInstance; import com.taobao.weex.common.WXRuntimeException; import com.taobao.weex.common.WXThread; +import com.taobao.weex.common.WXTracing; import com.taobao.weex.dom.RenderAction; import com.taobao.weex.dom.RenderActionContext; import com.taobao.weex.dom.WXDomObject; import com.taobao.weex.ui.component.WXComponent; +import com.taobao.weex.utils.WXLogUtils; import com.taobao.weex.utils.WXUtils; import java.util.ArrayList; @@ -102,14 +104,18 @@ public class WXRenderManager { } public void runOnThread(final String instanceId, final RenderAction action) { + final long start = System.nanoTime(); + final String actionName = WXTracing.getFunctionName(action.getClass()); mWXRenderHandler.post(WXThread.secure(new Runnable() { - @Override public void run() { + long s = System.nanoTime(); + WXLogUtils.e("Tracing", "Method " + actionName + ", Queue time " + (s - start) + " ns"); if (mRegistries.get(instanceId) == null) { return; } action.executeRender(getRenderContext(instanceId)); + WXLogUtils.e("Tracing", "Method " + actionName + ", Render time " + (System.nanoTime() - s) + " ns"); } })); }