You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by ky...@apache.org on 2018/05/16 12:09:19 UTC

[1/5] incubator-weex git commit: * [core] Support WeexCore Performance.

Repository: incubator-weex
Updated Branches:
  refs/heads/master 6d5992ee5 -> 97da4cb71


* [core] Support WeexCore Performance.


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/1806f233
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/1806f233
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/1806f233

Branch: refs/heads/master
Commit: 1806f233ccd54294249a5e75c4519ffab82ce07d
Parents: 6d5992e
Author: miomin <69...@qq.com>
Authored: Thu May 10 17:31:05 2018 +0800
Committer: miomin <69...@qq.com>
Committed: Wed May 16 17:46:06 2018 +0800

----------------------------------------------------------------------
 .../java/com/taobao/weex/WXSDKInstance.java     |  92 ++-------
 .../java/com/taobao/weex/bridge/WXBridge.java   |  71 +------
 .../com/taobao/weex/bridge/WXBridgeManager.java |  16 +-
 .../java/com/taobao/weex/common/IWXBridge.java  |  10 +-
 .../com/taobao/weex/common/WXPerformance.java   |  53 +----
 .../action/GraphicActionAbstractAddElement.java |   7 +
 .../weex/ui/action/GraphicActionAddElement.java |   5 +-
 .../weex/ui/action/GraphicActionCreateBody.java |   7 +-
 .../weex/ui/action/GraphicActionLayout.java     |   5 -
 .../android/bridge/impl/bridge_impl_android.cpp | 195 ++++++++++++-------
 .../bridge/impl/weexcore_impl_android.cpp       |  84 +++++++-
 .../jniprebuild/jniheader/WXBridge_jni.h        |  12 +-
 .../Source/core/moniter/render_performance.cpp  |  35 ++--
 .../Source/core/moniter/render_performance.h    |  38 ++--
 .../render/action/render_action_add_element.cpp |   6 -
 .../render/action/render_action_add_event.cpp   |   9 -
 .../render/action/render_action_createbody.cpp  |   7 -
 .../action/render_action_createfinish.cpp       |   7 -
 .../core/render/action/render_action_layout.cpp |   7 -
 .../action/render_action_move_element.cpp       |   6 -
 .../action/render_action_remove_element.cpp     |   6 -
 .../action/render_action_remove_event.cpp       |   9 -
 .../render/action/render_action_update_attr.cpp |   7 -
 .../action/render_action_update_style.cpp       |   7 -
 .../core/render/manager/render_manager.cpp      |  15 +-
 .../Source/core/render/page/render_page.cpp     |  79 +++-----
 weex_core/Source/core/render/page/render_page.h |  26 +--
 27 files changed, 333 insertions(+), 488 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
index 682e9f2..5459bbc 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
@@ -1119,14 +1119,16 @@ public class WXSDKInstance implements IWXActivityStateListener,View.OnLayoutChan
     firstScreenRenderFinished();
 
     long time = System.currentTimeMillis() - mRenderStartTime;
+    long[] renderFinishTime = WXBridgeManager.getInstance().getRenderFinishTime(getInstanceId());
     WXLogUtils.renderPerformanceLog("onRenderSuccess", time);
-    WXLogUtils.renderPerformanceLog("   firstCallAddElementSumTime("+mWXPerformance.mActionAddElementCount+")", mWXPerformance.mCallAddElementSumTime);
-    WXLogUtils.renderPerformanceLog("   firstCallLayoutSumTime("+mWXPerformance.mActionLayoutCount+")", mWXPerformance.mCallLayoutSumTime);
     WXLogUtils.renderPerformanceLog("   invokeCreateInstance",mWXPerformance.communicateTime);
-    WXLogUtils.renderPerformanceLog("   TotalApplyUpdateTime", mWXPerformance.applyUpdateTime);
-    WXLogUtils.renderPerformanceLog("   TotalUpdateDomObjTime", mWXPerformance.updateDomObjTime);
+    WXLogUtils.renderPerformanceLog("   onRenderSuccessCallBridgeTime", renderFinishTime[0]);
+    WXLogUtils.renderPerformanceLog("   onRenderSuccessCssLayoutTime", renderFinishTime[1]);
+    WXLogUtils.renderPerformanceLog("   onRenderSuccessParseJsonTime", renderFinishTime[2]);
 
-    WXBridgeManager.getInstance().printRenderFinishTime(getInstanceId());
+    mWXPerformance.callBridgeTime = renderFinishTime[0];
+    mWXPerformance.cssLayoutTime = renderFinishTime[1];
+    mWXPerformance.parseJsonTime = renderFinishTime[2];
 
     mWXPerformance.totalTime = time;
     if(mWXPerformance.screenRenderTime<0.001){
@@ -1246,13 +1248,6 @@ public class WXSDKInstance implements IWXActivityStateListener,View.OnLayoutChan
     }
   }
 
-  public void callNativeTime(final long time) {
-    if (!mEnd){
-      mWXPerformance.fsCallNativeTotalTime += time;
-      mWXPerformance.fsCallNativeTotalNum++;
-    }
-  }
-
   public void callJsTime(final long time){
     if (!mEnd){
       mWXPerformance.fsCallJsTotalTime+=time;
@@ -1260,34 +1255,6 @@ public class WXSDKInstance implements IWXActivityStateListener,View.OnLayoutChan
     }
   }
 
-  public void callCreateBodyTime(long time) {
-        mWXPerformance.mCallCreateBodySumTime += time;
-    }
-
-  public void callAddElementTime(long time) {
-      mWXPerformance.mCallAddElementSumTime += time;
-  }
-
-  public void callLayoutTime(long time) {
-      mWXPerformance.mCallLayoutSumTime += time;
-  }
-
-  public void callLayoutUpdateDemissionTime(long time) {
-      mWXPerformance.mCallLayoutUpdateDemissionSumTime += time;
-  }
-
-  public void callLayoutaAplyLayoutAndEventTime(long time) {
-      mWXPerformance.mCallLayoutApplyLayoutAndEventSumTime += time;
-  }
-
-  public void callLayoutBindDataCoreTime(long time) {
-      mWXPerformance.mCallLayoutBindDataSumTime += time;
-  }
-
-  public void callActionLayoutTime(long time) {
-        mWXPerformance.mActionLayoutSumTime += time;
-    }
-
   public void onComponentCreate(WXComponent component,long createTime) {
       mWXPerformance.mActionAddElementCount++;
       mWXPerformance.mActionAddElementSumTime += createTime;
@@ -1299,28 +1266,8 @@ public class WXSDKInstance implements IWXActivityStateListener,View.OnLayoutChan
       mWXPerformance.componentCreateTime+=createTime;
   }
 
-  public void callActionCreateBodyTime(long time) {
-      mWXPerformance.mActionCreateBodySumTime += time;
-  }
-
-  public void callActionOtherTime(long time) {
-        mWXPerformance.mActionOtherSumTime += time;
-    }
-
-  public void callActionCreateBodyCount() {
-        mWXPerformance.mActionCreateBodyCount++;
-    }
-
-  public void callActionLayoutCount() {
-        mWXPerformance.mActionLayoutCount++;
-    }
-
-  public void callActionOtherCount() {
-        mWXPerformance.mActionOtherCount++;
-    }
-
-  public void jsonParseTime(long time) {
-    mWXPerformance.parseJsonTime += time;
+  public void callActionAddElementTime(long time) {
+      mWXPerformance.mActionAddElementSumTime += time;
   }
 
   public void firstScreenRenderFinished() {
@@ -1344,23 +1291,12 @@ public class WXSDKInstance implements IWXActivityStateListener,View.OnLayoutChan
 
       mWXPerformance.screenRenderTime = System.currentTimeMillis() - mRenderStartTime;
       mWXPerformance.fsRenderTime = System.currentTimeMillis();
-      WXLogUtils.renderPerformanceLog("firstScreenJSFAndWeexCoreExecuteTime", mWXPerformance.firstScreenJSFExecuteTime);
+      long[] fitstScreenPerformance = WXBridgeManager.getInstance().getFirstScreenRenderTime(getInstanceId());
       WXLogUtils.renderPerformanceLog("firstScreenRenderFinished", mWXPerformance.screenRenderTime);
-      WXLogUtils.renderPerformanceLog("   firstScreenApplyUpdateTime", mWXPerformance.applyUpdateTime);
-      WXLogUtils.renderPerformanceLog("   firstScreenUpdateDomObjTime", mWXPerformance.updateDomObjTime);
-      WXLogUtils.renderPerformanceLog("   firstCallCreateBodySumTime("+mWXPerformance.mActionCreateBodyCount+")", mWXPerformance.mCallCreateBodySumTime);
-      WXLogUtils.renderPerformanceLog("   firstCallAddElementSumTime("+mWXPerformance.mActionAddElementCount+")", mWXPerformance.mCallAddElementSumTime);
-      WXLogUtils.renderPerformanceLog("   firstCallLayoutSumTime("+mWXPerformance.mActionLayoutCount+")", mWXPerformance.mCallLayoutSumTime);
-      WXLogUtils.renderPerformanceLog("   firstScreenRenderSumTime", mWXPerformance.renderSumTime());
-      WXLogUtils.renderPerformanceLog("       firstActionCreateBodySumTime", mWXPerformance.mActionCreateBodySumTime);
-      WXLogUtils.renderPerformanceLog("       firstActionAddElementSumTime", mWXPerformance.mActionAddElementSumTime);
-      WXLogUtils.renderPerformanceLog("       firstActionLayoutSumTime", mWXPerformance.mActionLayoutSumTime);
-      WXLogUtils.renderPerformanceLog("           firstCallLayoutUpdateDemissionSumTime", mWXPerformance.mCallLayoutUpdateDemissionSumTime);
-      WXLogUtils.renderPerformanceLog("           firstCallLayoutApplyLayoutAndEventSumTime", mWXPerformance.mCallLayoutApplyLayoutAndEventSumTime);
-      WXLogUtils.renderPerformanceLog("           firstCallLayoutBindDataSumTime", mWXPerformance.mCallLayoutBindDataSumTime);
-      WXLogUtils.renderPerformanceLog("       firstActionOtherSumTime("+mWXPerformance.mActionOtherCount+")", mWXPerformance.mActionOtherSumTime);
-
-    WXBridgeManager.getInstance().printFirstScreenRenderTime(getInstanceId());
+      WXLogUtils.renderPerformanceLog("    firstScreenJSFExecuteTime", mWXPerformance.firstScreenJSFExecuteTime);
+      WXLogUtils.renderPerformanceLog("    firstScreenCallBridgeTime", fitstScreenPerformance[0]);
+      WXLogUtils.renderPerformanceLog("    firstScreenCssLayoutTime", fitstScreenPerformance[1]);
+      WXLogUtils.renderPerformanceLog("    firstScreenParseJsonTime", fitstScreenPerformance[2]);
   }
 
   public void createInstanceFinished(long time) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
index f335a8a..a9f6730 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
@@ -19,13 +19,11 @@
 package com.taobao.weex.bridge;
 
 import android.util.Log;
-import android.util.SparseArray;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.taobao.weex.WXEnvironment;
-import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.WXSDKManager;
 import com.taobao.weex.adapter.IWXUserTrackAdapter;
 import com.taobao.weex.common.IWXBridge;
@@ -69,9 +67,9 @@ public class WXBridge implements IWXBridge {
 
   private native void nativeSetRenderContainerWrapContent(boolean wrap, String instanceId);
 
-  public native int nativePrintFirstScreenRenderTime(String instanceId);
+  public native long[] nativeGetFirstScreenRenderTime(String instanceId);
 
-  public native int nativePrintRenderFinishTime(String instanceId);
+  public native long[] nativeGetRenderFinishTime(String instanceId);
 
   private native void nativeSetDefaultHeightAndWidthIntoRootDom(String instanceId, float defaultWidth, float defaultHeight, boolean isWidthWrapContent, boolean isHeightWrapContent);
 
@@ -171,11 +169,6 @@ public class WXBridge implements IWXBridge {
 
   @Override
   public int callNative(String instanceId, String tasks, String callback) {
-    long start = System.currentTimeMillis();
-    WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(instanceId);
-    if (instance != null) {
-      instance.firstScreenCreateInstanceTime(start);
-    }
     int errorCode = IWXBridge.INSTANCE_RENDERING;
     try {
       errorCode = WXBridgeManager.getInstance().callNative(instanceId, tasks, callback);
@@ -183,9 +176,6 @@ public class WXBridge implements IWXBridge {
       WXLogUtils.e(TAG, "callNative throw exception:" + e.getMessage());
     }
 
-    if (instance != null) {
-      instance.callNativeTime(System.currentTimeMillis() - start);
-    }
     if (WXEnvironment.isApkDebugable()) {
       if (errorCode == IWXBridge.DESTROY_INSTANCE) {
         WXLogUtils.w("destroyInstance :" + instanceId + " JSF must stop callNative");
@@ -251,12 +241,6 @@ public class WXBridge implements IWXBridge {
 
   @Override
   public int callUpdateFinish(String instanceId, byte[] tasks, String callback) {
-
-    long start = System.currentTimeMillis();
-    WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(instanceId);
-    if (instance != null) {
-      instance.firstScreenCreateInstanceTime(start);
-    }
     int errorCode = IWXBridge.INSTANCE_RENDERING;
     try {
       errorCode = WXBridgeManager.getInstance().callUpdateFinish(instanceId, callback);
@@ -266,19 +250,11 @@ public class WXBridge implements IWXBridge {
         WXLogUtils.e(TAG, "callCreateBody throw exception:" + e.getMessage());
       }
     }
-    if (instance != null) {
-      instance.callNativeTime(System.currentTimeMillis() - start);
-    }
     return errorCode;
   }
 
   @Override
   public int callRefreshFinish(String instanceId, byte[] tasks, String callback) {
-    long start = System.currentTimeMillis();
-    WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(instanceId);
-    if (instance != null) {
-      instance.firstScreenCreateInstanceTime(start);
-    }
     int errorCode = IWXBridge.INSTANCE_RENDERING;
     try {
       errorCode = WXBridgeManager.getInstance().callRefreshFinish(instanceId, callback);
@@ -288,9 +264,6 @@ public class WXBridge implements IWXBridge {
         WXLogUtils.e(TAG, "callCreateFinish throw exception:" + e.getMessage());
       }
     }
-    if (instance != null) {
-      instance.callNativeTime(System.currentTimeMillis() - start);
-    }
     return errorCode;
   }
 
@@ -349,11 +322,6 @@ public class WXBridge implements IWXBridge {
 
   @Override
   public int callRemoveElement(String instanceId, String ref) {
-    long start = System.currentTimeMillis();
-    WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(instanceId);
-    if (instance != null) {
-      instance.firstScreenCreateInstanceTime(start);
-    }
     int errorCode = IWXBridge.INSTANCE_RENDERING;
     try {
       errorCode = WXBridgeManager.getInstance().callRemoveElement(instanceId, ref);
@@ -362,19 +330,11 @@ public class WXBridge implements IWXBridge {
         WXLogUtils.e(TAG, "callRemoveElement throw exception:" + e.getMessage());
       }
     }
-    if (instance != null) {
-      instance.callNativeTime(System.currentTimeMillis() - start);
-    }
     return errorCode;
   }
 
   @Override
   public int callMoveElement(String instanceId, String ref, String parentref, int index) {
-    long start = System.currentTimeMillis();
-    WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(instanceId);
-    if (instance != null) {
-      instance.firstScreenCreateInstanceTime(start);
-    }
     int errorCode = IWXBridge.INSTANCE_RENDERING;
     try {
       errorCode = WXBridgeManager.getInstance().callMoveElement(instanceId, ref, parentref, index);
@@ -383,19 +343,11 @@ public class WXBridge implements IWXBridge {
         WXLogUtils.e(TAG, "callMoveElement throw exception:" + e.getMessage());
       }
     }
-    if (instance != null) {
-      instance.callNativeTime(System.currentTimeMillis() - start);
-    }
     return errorCode;
   }
 
   @Override
   public int callAddEvent(String instanceId, String ref, String event) {
-    long start = System.currentTimeMillis();
-    WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(instanceId);
-    if (instance != null) {
-      instance.firstScreenCreateInstanceTime(start);
-    }
     int errorCode = IWXBridge.INSTANCE_RENDERING;
     try {
       errorCode = WXBridgeManager.getInstance().callAddEvent(instanceId, ref, event);
@@ -405,19 +357,11 @@ public class WXBridge implements IWXBridge {
       WXLogUtils.e(TAG, "callAddEvent throw exception:" + e.getMessage());
       // }
     }
-    if (instance != null) {
-      instance.callNativeTime(System.currentTimeMillis() - start);
-    }
     return errorCode;
   }
 
   @Override
   public int callRemoveEvent(String instanceId, String ref, String event) {
-    long start = System.currentTimeMillis();
-    WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(instanceId);
-    if (instance != null) {
-      instance.firstScreenCreateInstanceTime(start);
-    }
     int errorCode = IWXBridge.INSTANCE_RENDERING;
     try {
       errorCode = WXBridgeManager.getInstance().callRemoveEvent(instanceId, ref, event);
@@ -427,9 +371,6 @@ public class WXBridge implements IWXBridge {
         WXLogUtils.e(TAG, "callRemoveEvent throw exception:" + e.getMessage());
       }
     }
-    if (instance != null) {
-      instance.callNativeTime(System.currentTimeMillis() - start);
-    }
     return errorCode;
   }
 
@@ -530,13 +471,13 @@ public class WXBridge implements IWXBridge {
   }
 
   @Override
-  public int printFirstScreenRenderTime(String instanceId) {
-    return nativePrintFirstScreenRenderTime(instanceId);
+  public long[] getFirstScreenRenderTime(String instanceId) {
+    return nativeGetFirstScreenRenderTime(instanceId);
   }
 
   @Override
-  public int printRenderFinishTime(String instanceId) {
-    return nativePrintRenderFinishTime(instanceId);
+  public long[] getRenderFinishTime(String instanceId) {
+    return nativeGetRenderFinishTime(instanceId);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
index 560358d..93bf0b8 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
@@ -577,15 +577,10 @@ public class WXBridgeManager implements Callback, BactchExecutor {
     }
 
 
-    long start = System.currentTimeMillis();
     long parseNanos = System.nanoTime();
     JSONArray array = JSON.parseArray(tasks);
     parseNanos = System.nanoTime() - parseNanos;
 
-    if (WXSDKManager.getInstance().getSDKInstance(instanceId) != null) {
-      WXSDKManager.getInstance().getSDKInstance(instanceId).jsonParseTime(System.currentTimeMillis() - start);
-    }
-
     if (null != array && array.size() > 0) {
       int size = array.size();
       try {
@@ -2279,7 +2274,6 @@ public class WXBridgeManager implements Callback, BactchExecutor {
               WXLogUtils.getStackTrace(e), null);
     }
 
-    WXSDKManager.getInstance().getSDKInstance(pageId).callCreateBodyTime(System.currentTimeMillis() - start);
     return IWXBridge.INSTANCE_RENDERING;
   }
 
@@ -2328,7 +2322,6 @@ public class WXBridgeManager implements Callback, BactchExecutor {
               WXLogUtils.getStackTrace(e), null);
     }
 
-    WXSDKManager.getInstance().getSDKInstance(pageId).callAddElementTime(System.currentTimeMillis() - start);
     return IWXBridge.INSTANCE_RENDERING;
   }
 
@@ -2569,7 +2562,6 @@ public class WXBridgeManager implements Callback, BactchExecutor {
               WXLogUtils.getStackTrace(e), null);
     }
 
-    WXSDKManager.getInstance().getSDKInstance(pageId).callLayoutTime(System.currentTimeMillis() - start);
     return IWXBridge.INSTANCE_RENDERING;
   }
 
@@ -2681,12 +2673,12 @@ public class WXBridgeManager implements Callback, BactchExecutor {
     mWXBridge.setStyleHeight(instanceId, ref, value);
   }
 
-  public int printFirstScreenRenderTime(String instanceId) {
-    return mWXBridge.printFirstScreenRenderTime(instanceId);
+  public long[] getFirstScreenRenderTime(String instanceId) {
+    return mWXBridge.getFirstScreenRenderTime(instanceId);
   }
 
-  public int printRenderFinishTime(String instanceId) {
-    return mWXBridge.printRenderFinishTime(instanceId);
+  public long[] getRenderFinishTime(String instanceId) {
+    return mWXBridge.getRenderFinishTime(instanceId);
   }
 
   public void setViewPortWidth(String instanceId, float value) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java b/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
index 35f6bf1..725f32b 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
@@ -120,11 +120,11 @@ public interface IWXBridge extends IWXObject {
   void reportServerCrash(String instanceId, String crashFile);
 
 
-  public int callCreateBody(String instanceId, String componentType, String ref,
+  int callCreateBody(String instanceId, String componentType, String ref,
                             HashMap<String, String> styles, HashMap<String, String> attributes, HashSet<String> events,
                             float[] margins, float[] paddings, float[] borders);
 
-  public int callAddElement(String instanceId, String componentType, String ref, int index, String parentRef,
+  int callAddElement(String instanceId, String componentType, String ref, int index, String parentRef,
                             HashMap<String, String> styles, HashMap<String, String> attributes, HashSet<String> events,
                             float[] margins, float[] paddings, float[] borders, boolean willLayout);
 
@@ -136,7 +136,7 @@ public interface IWXBridge extends IWXObject {
 
   int callRemoveEvent(String instanceId, String ref, String event);
 
-  public int callUpdateStyle(String instanceId, String ref,
+  int callUpdateStyle(String instanceId, String ref,
                              HashMap<String, Object> styles,
                              HashMap<String, String> paddings,
                              HashMap<String, String> margins,
@@ -159,9 +159,9 @@ public interface IWXBridge extends IWXObject {
 
   void setRenderContainerWrapContent(boolean wrap, String instanceId);
 
-  int printFirstScreenRenderTime(String instanceId);
+  long[] getFirstScreenRenderTime(String instanceId);
 
-  int printRenderFinishTime(String instanceId);
+  long[] getRenderFinishTime(String instanceId);
 
   void setDefaultHeightAndWidthIntoRootDom(String instanceId, float defaultWidth, float defaultHeight, boolean isWidthWrapContent, boolean isHeightWrapContent);
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/android/sdk/src/main/java/com/taobao/weex/common/WXPerformance.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/WXPerformance.java b/android/sdk/src/main/java/com/taobao/weex/common/WXPerformance.java
index 0b25c55..d058236 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/WXPerformance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/WXPerformance.java
@@ -94,6 +94,10 @@ public class WXPerformance {
     measureTime4(0D, Double.MAX_VALUE),
     measureTime5(0D, Double.MAX_VALUE),
 
+    callBridgeTime(0D, Double.MAX_VALUE),
+    cssLayoutTime(0D, Double.MAX_VALUE),
+    parseJsonTime(0D, Double.MAX_VALUE),
+
     communicateTime(0D, 5000D),
     screenRenderTime(0D, 5000D),
     totalTime(0D, 5000D),
@@ -234,7 +238,7 @@ public class WXPerformance {
   /**
    * Call native Time spent when rendering first screen
    */
-  public long callNativeTime;
+  public long callBridgeTime;
 
   /**
    * Create Instance Time spent when rendering first screen
@@ -244,25 +248,9 @@ public class WXPerformance {
   /**
    * Call native Time spent when rendering first screen
    */
-  public long batchTime;
-
-  /**
-   * Call native Time spent when rendering first screen
-   */
   public long parseJsonTime;
 
   /**
-   * UpdateDomObj Time spent when rendering first screen
-   */
-  public long updateDomObjTime;
-
-  /**
-   * ApplyUpdate Time spent when rendering first screen
-   */
-  public long applyUpdateTime;
-
-
-  /**
    * CssLayout Time spent when rendering first screen
    */
   public long cssLayoutTime;
@@ -362,28 +350,9 @@ public class WXPerformance {
   /**
    * RenderAction
    */
-  public int mCallCreateBodySumTime = 0;
-  public int mCallAddElementSumTime = 0;
-
-  public int mCallLayoutSumTime = 0;
-  public int mCallLayoutUpdateDemissionSumTime = 0;
-  public int mCallLayoutApplyLayoutAndEventSumTime = 0;
-  public int mCallLayoutBindDataSumTime = 0;
-
-  public int mActionTotalSumTime = 0;
-  public int mActionLayoutCount = 0;
-  public int mActionLayoutSumTime = 0;
-
   public int mActionAddElementCount = 0;
   public int mActionAddElementSumTime = 0;
 
-  public int mActionCreateBodyCount = 0;
-  public int mActionCreateBodySumTime = 0;
-
-  public int mActionOtherCount = 0;
-  public int mActionOtherSumTime = 0;
-
-
   public WXPerformance(){
     mErrMsgBuilder=new StringBuilder();
   }
@@ -438,6 +407,10 @@ public class WXPerformance {
     quotas.put(Measure.imgSizeCount.toString(), wrongImgSizeCount);
     quotas.put(Measure.interactionTime.toString(), (double) interactionTime);
 
+    quotas.put(Measure.callBridgeTime.toString(), (double) callBridgeTime);
+    quotas.put(Measure.cssLayoutTime.toString(), (double) cssLayoutTime);
+    quotas.put(Measure.parseJsonTime.toString(), (double) parseJsonTime);
+
     // TODO the following attribute is no longer needed and will be deleted soon.
     quotas.put(Measure.screenRenderTime.toString(), (double) screenRenderTime);
     quotas.put(Measure.communicateTime.toString(), (double) communicateTime);
@@ -558,12 +531,4 @@ public class WXPerformance {
 
   public void afterInstanceDestroy(String instanceId) {
   }
-
-  public int renderSumTime() {
-    return mActionAddElementSumTime + mActionCreateBodySumTime + mActionLayoutSumTime + mActionOtherSumTime;
-  }
-
-  public int renderSumCount() {
-    return mActionAddElementCount + mActionCreateBodyCount + mActionLayoutCount + mActionOtherCount;
-  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAbstractAddElement.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAbstractAddElement.java b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAbstractAddElement.java
index 8846f4e..3a9848d 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAbstractAddElement.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAbstractAddElement.java
@@ -40,9 +40,11 @@ public abstract class GraphicActionAbstractAddElement extends BasicGraphicAction
   protected float[] mMargins;
   protected float[] mPaddings;
   protected float[] mBorders;
+  private long startTime;
 
   public GraphicActionAbstractAddElement(String pageId, String ref) {
     super(pageId, ref);
+    startTime = System.currentTimeMillis();
   }
 
   protected WXComponent createComponent(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) {
@@ -69,6 +71,11 @@ public abstract class GraphicActionAbstractAddElement extends BasicGraphicAction
     return component;
   }
 
+  @Override
+  public void executeAction() {
+    WXSDKManager.getInstance().getSDKInstance(getPageId()).callActionAddElementTime(System.currentTimeMillis() - startTime);
+  }
+
   public String getComponentType() {
     return mComponentType;
   }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAddElement.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAddElement.java b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAddElement.java
index 77bb5e2..6bdb0b7 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAddElement.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAddElement.java
@@ -109,20 +109,17 @@ public class GraphicActionAddElement extends GraphicActionAbstractAddElement {
 
   @Override
   public void executeAction() {
+    super.executeAction();
     try {
       parent.addChild(child, mIndex);
       parent.createChildViewAt(mIndex);
 
-      long start = System.currentTimeMillis();
       if(layoutPosition !=null && layoutSize != null) {
         child.setDemission(layoutSize, layoutPosition);
       }
       child.applyLayoutAndEvent(child);
-      WXSDKManager.getInstance().getSDKInstance(getPageId()).callLayoutaAplyLayoutAndEventTime(System.currentTimeMillis() - start);
 
-      start = System.currentTimeMillis();
       child.bindData(child);
-      WXSDKManager.getInstance().getSDKInstance(getPageId()).callLayoutBindDataCoreTime(System.currentTimeMillis() - start);
     } catch (Exception e) {
       WXLogUtils.e("add component failed.", e);
     }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionCreateBody.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionCreateBody.java b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionCreateBody.java
index f59b0e1..0d99623 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionCreateBody.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionCreateBody.java
@@ -69,16 +69,11 @@ public class GraphicActionCreateBody extends GraphicActionAbstractAddElement {
 
   @Override
   public void executeAction() {
+    super.executeAction();
     try {
       component.createView();
-
-      long start = System.currentTimeMillis();
       component.applyLayoutAndEvent(component);
-      WXSDKManager.getInstance().getSDKInstance(getPageId()).callLayoutaAplyLayoutAndEventTime(System.currentTimeMillis() - start);
-
-      start = System.currentTimeMillis();
       component.bindData(component);
-      WXSDKManager.getInstance().getSDKInstance(getPageId()).callLayoutBindDataCoreTime(System.currentTimeMillis() - start);
 
       if (component instanceof WXScroller) {
         WXScroller scroller = (WXScroller) component;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionLayout.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionLayout.java b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionLayout.java
index 693096a..3ebdd16 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionLayout.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionLayout.java
@@ -39,13 +39,8 @@ public class GraphicActionLayout extends BasicGraphicAction {
       return;
     }
 
-    long start = System.currentTimeMillis();
     component.setDemission(mLayoutSize, mLayoutPosition);
-    WXSDKManager.getInstance().getSDKInstance(getPageId()).callLayoutUpdateDemissionTime(System.currentTimeMillis() - start);
-
     component.setLayout(component);
     component.setPadding(component.getPadding(), component.getBorder());
-
-    WXSDKManager.getInstance().getSDKInstance(getPageId()).callActionLayoutCount();
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp b/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp
index 27a4b92..58fcdcf 100644
--- a/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp
+++ b/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp
@@ -142,6 +142,7 @@ namespace WeexCore {
   }
 
   void Bridge_Impl_Android::setJSVersion(const char* version) {
+
     JNIEnv *env = getJNIEnv();
     jstring jVersion = env->NewStringUTF(version);
 
@@ -154,9 +155,15 @@ namespace WeexCore {
 
     if (jVersion != nullptr)
       env->DeleteLocalRef(jVersion);
+
+
   }
 
   void Bridge_Impl_Android::reportException(const char* pageId, const char *func, const char *exception_string) {
+
+    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+    long long startTime = getCurrentTime();
+
     JNIEnv *env = getJNIEnv();
     jstring jFunc = env->NewStringUTF(func);
     jstring jExceptionString = env->NewStringUTF(exception_string);
@@ -175,9 +182,16 @@ namespace WeexCore {
       env->DeleteLocalRef(jFunc);
     if (jExceptionString != nullptr)
       env->DeleteLocalRef(jExceptionString);
+
+    if (page != nullptr)
+      page->CallBridgeTime(getCurrentTime() - startTime);
   }
 
   int Bridge_Impl_Android::callNative(const char* pageId, const char *task, const char *callback) {
+
+    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+    long long startTime = getCurrentTime();
+
     JNIEnv *env = getJNIEnv();
     jbyteArray jTask = newJByteArray(env, task);
     jstring jCallback = env->NewStringUTF(callback);
@@ -205,11 +219,17 @@ namespace WeexCore {
       env->DeleteLocalRef(jTask);
     if (jCallback != nullptr)
       env->DeleteLocalRef(jCallback);
+
+    if (page != nullptr)
+      page->CallBridgeTime(getCurrentTime() - startTime);
     return flag;
   }
 
   jobject Bridge_Impl_Android::callNativeModule(const char* pageId, const char *module, const char *method,
                                                 const char *argString, const char *optString) {
+    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+    long long startTime = getCurrentTime();
+
     JNIEnv *env = getJNIEnv();
     jstring jModule = env->NewStringUTF(module);
     jstring jMethod = env->NewStringUTF(method);
@@ -239,12 +259,18 @@ namespace WeexCore {
       env->DeleteLocalRef(jArgString);
     if (jOptString != nullptr)
       env->DeleteLocalRef(jOptString);
+
+    if (page != nullptr)
+      page->CallBridgeTime(getCurrentTime() - startTime);
     return result;
   }
 
   void Bridge_Impl_Android::callNativeComponent(const char* pageId, const char* ref,
                                                 const char *method, const char *argString,
                                                 const char *optString) {
+    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+    long long startTime = getCurrentTime();
+
     JNIEnv *env = getJNIEnv();
     jstring jMethod = env->NewStringUTF(method);
     jbyteArray jArgString = newJByteArray(env, argString);
@@ -271,6 +297,9 @@ namespace WeexCore {
       env->DeleteLocalRef(jArgString);
     if (jOptString != nullptr)
       env->DeleteLocalRef(jOptString);
+
+    if (page != nullptr)
+      page->CallBridgeTime(getCurrentTime() - startTime);
   }
 
   void Bridge_Impl_Android::setTimeout(const char* callbackID, const char* time) {
@@ -313,6 +342,10 @@ namespace WeexCore {
   }
 
   int Bridge_Impl_Android::callUpdateFinish(const char* pageId, const char *task, const char *callback) {
+
+    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+    long long startTime = getCurrentTime();
+
     JNIEnv *env = getJNIEnv();
     jbyteArray jTask = newJByteArray(env, task);
     jstring jCallback = env->NewStringUTF(callback);
@@ -336,10 +369,17 @@ namespace WeexCore {
       env->DeleteLocalRef(jTask);
     if (jCallback != nullptr)
       env->DeleteLocalRef(jCallback);
+
+    if (page != nullptr)
+      page->CallBridgeTime(getCurrentTime() - startTime);
     return flag;
   }
 
   int Bridge_Impl_Android::callRefreshFinish(const char* pageId, const char *task, const char *callback) {
+
+    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+    long long startTime = getCurrentTime();
+
     JNIEnv *env = getJNIEnv();
     jbyteArray jTask = newJByteArray(env, task);
     jstring jCallback = env->NewStringUTF(callback);
@@ -362,6 +402,9 @@ namespace WeexCore {
       env->DeleteLocalRef(jTask);
     if (jCallback != nullptr)
       env->DeleteLocalRef(jCallback);
+
+    if (page != nullptr)
+      page->CallBridgeTime(getCurrentTime() - startTime);
     return flag;
   }
 
@@ -372,16 +415,13 @@ namespace WeexCore {
                                           const WXCoreMargin &margins,
                                           const WXCorePadding &paddings,
                                           const WXCoreBorderWidth &borders) {
+    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+    long long startTime = getCurrentTime();
+
     JNIEnv *env = getJNIEnv();
     jstring jPageId = env->NewStringUTF(pageId);
     jstring jRef = env->NewStringUTF(ref);
 
-    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    if (page == nullptr)
-      return -1;
-
-    long long startTime = getCurrentTime();
-
     if (jMapConstructorMethodId == NULL)
       jMapConstructorMethodId = env->GetMethodID(jMapClazz, "<init>", "()V");
     if (jMapPutMethodId == NULL)
@@ -401,8 +441,6 @@ namespace WeexCore {
     cpyCMap2JMap(attributes, jAttributes, env);
     cpyCSet2JSet(events, jEvents, env);
 
-    page->CreateJMapJNITime(getCurrentTime() - startTime);
-
     float c_margins[4];
     float c_paddings[4];
     float c_borders[4];
@@ -428,8 +466,6 @@ namespace WeexCore {
     c_borders[3] = borders.getBorderWidth(kBorderWidthRight);
     env->SetFloatArrayRegion(jBorders, 0, 4, c_borders);
 
-    long long startTimeCallBridge = getCurrentTime();
-
     if (jCallCreateBodyMethodId == NULL)
       jCallCreateBodyMethodId = env->GetMethodID(jBridgeClazz,
                                                  "callCreateBody",
@@ -446,8 +482,6 @@ namespace WeexCore {
                               jComponentType, jRef, jStyles, jAttributes,
                               jEvents, jMargins, jPaddings, jBorders);
 
-    page->CallBridgeTime(getCurrentTime() - startTimeCallBridge);
-
     if (flag == -1) {
       LOGE("instance destroy JFM must stop callCreateBody");
     }
@@ -462,6 +496,9 @@ namespace WeexCore {
     env->DeleteLocalRef(jMargins);
     env->DeleteLocalRef(jPaddings);
     env->DeleteLocalRef(jBorders);
+
+    if (page != nullptr)
+      page->CallBridgeTime(getCurrentTime() - startTime);
     return flag;
   }
 
@@ -474,17 +511,12 @@ namespace WeexCore {
                                           const WXCorePadding &paddings,
                                           const WXCoreBorderWidth &borders,
                                           bool willLayout) {
+
     JNIEnv *env = getJNIEnv();
     jstring jPageId = env->NewStringUTF(pageId);
     jstring jRef = env->NewStringUTF(ref);
     jstring jParentRef = env->NewStringUTF(parentRef);
 
-    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    if (page == nullptr)
-      return -1;
-
-    long long startTime = getCurrentTime();
-
     if (jMapConstructorMethodId == NULL)
       jMapConstructorMethodId = env->GetMethodID(jMapClazz, "<init>", "()V");
     if (jMapPutMethodId == NULL)
@@ -504,8 +536,6 @@ namespace WeexCore {
     cpyCMap2JMap(attributes, jAttributes, env);
     cpyCSet2JSet(events, jEvents, env);
 
-    page->CreateJMapJNITime(getCurrentTime() - startTime);
-
     float c_margins[4];
     float c_paddings[4];
     float c_borders[4];
@@ -531,8 +561,6 @@ namespace WeexCore {
     c_borders[3] = borders.getBorderWidth(kBorderWidthRight);
     env->SetFloatArrayRegion(jBorders, 0, 4, c_borders);
 
-    long long startTimeCallBridge = getCurrentTime();
-
     if (jCallAddElementMethodId == NULL)
       jCallAddElementMethodId = env->GetMethodID(jBridgeClazz,
                                                            "callAddElement",
@@ -547,8 +575,6 @@ namespace WeexCore {
     flag = env->CallIntMethod(jThis, jCallAddElementMethodId, jPageId, jComponentType, jRef, index,
                               jParentRef, jStyles, jAttributes, jEvents, jMargins, jPaddings, jBorders, willLayout);
 
-    page->CallBridgeTime(getCurrentTime() - startTimeCallBridge);
-
     if (flag == -1) {
       LOGE("instance destroy JFM must stop callAddElement");
     }
@@ -565,10 +591,17 @@ namespace WeexCore {
     env->DeleteLocalRef(jMargins);
     env->DeleteLocalRef(jPaddings);
     env->DeleteLocalRef(jBorders);
+
+    if (page != nullptr)
+      page->CallBridgeTime(getCurrentTime() - startTime);
     return flag;
   }
 
   int Bridge_Impl_Android::callRemoveElement(const char* pageId, const char* ref) {
+
+    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+    long long startTime = getCurrentTime();
+
     JNIEnv *env = getJNIEnv();
     jstring jPageId = env->NewStringUTF(pageId);
     jstring jRef = env->NewStringUTF(ref);
@@ -588,10 +621,17 @@ namespace WeexCore {
       env->DeleteLocalRef(jPageId);
     if (jRef != nullptr)
       env->DeleteLocalRef(jRef);
+
+    if (page != nullptr)
+      page->CallBridgeTime(getCurrentTime() - startTime);
     return 0;
   }
 
   int Bridge_Impl_Android::callMoveElement(const char* pageId, const char* ref, const char* parentRef, int index) {
+
+    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+    long long startTime = getCurrentTime();
+
     JNIEnv *env = getJNIEnv();
     jstring jPageId = env->NewStringUTF(pageId);
     jstring jRef = env->NewStringUTF(ref);
@@ -614,10 +654,17 @@ namespace WeexCore {
       env->DeleteLocalRef(jRef);
     if (jParentRef != nullptr)
       env->DeleteLocalRef(jParentRef);
+
+    if (page != nullptr)
+      page->CallBridgeTime(getCurrentTime() - startTime);
     return 0;
   }
 
   int Bridge_Impl_Android::callAddEvent(const char* pageId, const char* ref, const char *event) {
+
+    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+    long long startTime = getCurrentTime();
+
     JNIEnv *env = getJNIEnv();
     jstring jPageId = env->NewStringUTF(pageId);
     jstring jRef = env->NewStringUTF(ref);
@@ -639,10 +686,17 @@ namespace WeexCore {
     if (jRef != nullptr)
       env->DeleteLocalRef(jRef);
     env->DeleteLocalRef(jEventId);
+
+    if (page != nullptr)
+      page->CallBridgeTime(getCurrentTime() - startTime);
     return flag;
   }
 
   int Bridge_Impl_Android::callRemoveEvent(const char* pageId, const char* ref, const char *event) {
+
+    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+    long long startTime = getCurrentTime();
+
     JNIEnv *env = getJNIEnv();
     jstring jPageId = env->NewStringUTF(pageId);
     jstring jRef = env->NewStringUTF(ref);
@@ -664,6 +718,9 @@ namespace WeexCore {
     if (jRef != nullptr)
       env->DeleteLocalRef(jRef);
     env->DeleteLocalRef(jEventId);
+
+    if (page != nullptr)
+      page->CallBridgeTime(getCurrentTime() - startTime);
     return flag;
   }
 
@@ -672,16 +729,13 @@ namespace WeexCore {
                                            std::vector<std::pair<std::string, std::string>> *margin,
                                            std::vector<std::pair<std::string, std::string>> *padding,
                                            std::vector<std::pair<std::string, std::string>> *border) {
+    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+    long long startTime = getCurrentTime();
+
     JNIEnv *env = getJNIEnv();
     jstring jPageId = env->NewStringUTF(pageId);
     jstring jRef = env->NewStringUTF(ref);
 
-    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    if (page == nullptr)
-      return -1;
-
-    long long startTime = getCurrentTime();
-
     if (jMapConstructorMethodId == NULL)
       jMapConstructorMethodId = env->GetMethodID(jMapClazz, "<init>", "()V");
     if (jMapPutMethodId == NULL)
@@ -709,10 +763,6 @@ namespace WeexCore {
       cpyCVector2JMap(border, jBorders, env);
     }
 
-    page->CreateJMapJNITime(getCurrentTime() - startTime);
-
-    long long startTimeCallBridge = getCurrentTime();
-
     if (jCallUpdateStyleMethodId == NULL)
       jCallUpdateStyleMethodId = env->GetMethodID(jBridgeClazz,
                                                             "callUpdateStyle",
@@ -721,8 +771,6 @@ namespace WeexCore {
     int flag = 0;
     flag = env->CallIntMethod(jThis, jCallUpdateStyleMethodId, jPageId, jRef, jStyles, jMargins, jPaddings, jBorders);
 
-    page->CallBridgeTime(getCurrentTime() - startTimeCallBridge);
-
     if (flag == -1) {
       LOGE("instance destroy JFM must stop callUpdateStyle");
     }
@@ -735,20 +783,21 @@ namespace WeexCore {
     env->DeleteLocalRef(jMargins);
     env->DeleteLocalRef(jPaddings);
     env->DeleteLocalRef(jBorders);
+
+    if (page != nullptr)
+      page->CallBridgeTime(getCurrentTime() - startTime);
     return flag;
   }
 
   int Bridge_Impl_Android::callUpdateAttr(const char* pageId, const char* ref, std::vector<std::pair<std::string, std::string>> *attrs) {
-    JNIEnv *env = getJNIEnv();
-    jstring jPageId = env->NewStringUTF(pageId);
-    jstring jRef = env->NewStringUTF(ref);
 
     RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    if (page == nullptr)
-      return -1;
-
     long long startTime = getCurrentTime();
 
+    JNIEnv *env = getJNIEnv();
+    jstring jPageId = env->NewStringUTF(pageId);
+    jstring jRef = env->NewStringUTF(ref);
+
     if (jMapConstructorMethodId == NULL)
       jMapConstructorMethodId = env->GetMethodID(jMapClazz, "<init>", "()V");
     if (jMapPutMethodId == NULL)
@@ -761,10 +810,6 @@ namespace WeexCore {
       cpyCVector2JMap(attrs, jAttrs, env);
     }
 
-    page->CreateJMapJNITime(getCurrentTime() - startTime);
-
-    long long startTimeCallBridge = getCurrentTime();
-
     if (jCallUpdateAttrsMethodId == NULL) {
       jCallUpdateAttrsMethodId = env->GetMethodID(jBridgeClazz,
                                                             "callUpdateAttrs",
@@ -774,8 +819,6 @@ namespace WeexCore {
     int flag = 0;
     flag = env->CallIntMethod(jThis, jCallUpdateAttrsMethodId, jPageId, jRef, jAttrs);
 
-    page->CallBridgeTime(getCurrentTime() - startTimeCallBridge);
-
     if (flag == -1) {
       LOGE("instance destroy JFM must stop callUpdateStyle");
     }
@@ -785,21 +828,22 @@ namespace WeexCore {
     if (jRef != nullptr)
       env->DeleteLocalRef(jRef);
     env->DeleteLocalRef(jAttrs);
+
+    if (page != nullptr)
+      page->CallBridgeTime(getCurrentTime() - startTime);
     return flag;
   }
 
   int Bridge_Impl_Android::callLayout(const char* pageId, const char* ref,
                                       int top, int bottom, int left, int right,
                                       int height, int width, int index) {
-    JNIEnv *env = getJNIEnv();
-    jstring jPageId = env->NewStringUTF(pageId);
-    jstring jRef = env->NewStringUTF(ref);
 
     RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    if (page == nullptr)
-      return -1;
+    long long startTime = getCurrentTime();
 
-    long long startTimeCallBridge = getCurrentTime();
+    JNIEnv *env = getJNIEnv();
+    jstring jPageId = env->NewStringUTF(pageId);
+    jstring jRef = env->NewStringUTF(ref);
 
     if (jCallLayoutMethodId == NULL)
       jCallLayoutMethodId = env->GetMethodID(jBridgeClazz,
@@ -810,8 +854,6 @@ namespace WeexCore {
     flag = env->CallIntMethod(jThis, jCallLayoutMethodId, jPageId,
                               jRef, top, bottom, left, right, height, width, index);
 
-    page->CallBridgeTime(getCurrentTime() - startTimeCallBridge);
-
     if (flag == -1) {
       LOGE("instance destroy JFM must stop callLayout");
     }
@@ -820,18 +862,19 @@ namespace WeexCore {
       env->DeleteLocalRef(jPageId);
     if (jRef != nullptr)
       env->DeleteLocalRef(jRef);
+
+    if (page != nullptr)
+      page->CallBridgeTime(getCurrentTime() - startTime);
     return flag;
   }
 
   int Bridge_Impl_Android::callCreateFinish(const char* pageId) {
-    JNIEnv *env = getJNIEnv();
-    jstring jPageId = env->NewStringUTF(pageId);
 
     RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    if (page == nullptr)
-      return -1;
+    long long startTime = getCurrentTime();
 
-    long long startTimeCallBridge = getCurrentTime();
+    JNIEnv *env = getJNIEnv();
+    jstring jPageId = env->NewStringUTF(pageId);
 
     if (jCallCreateFinishMethodId == NULL)
       jCallCreateFinishMethodId = env->GetMethodID(jBridgeClazz,
@@ -840,18 +883,23 @@ namespace WeexCore {
 
     int flag = env->CallIntMethod(jThis, jCallCreateFinishMethodId, jPageId);
 
-    page->CallBridgeTime(getCurrentTime() - startTimeCallBridge);
-
     if (flag == -1) {
       LOGE("instance destroy JFM must stop callCreateFinish");
     }
 
     if (jPageId != nullptr)
       env->DeleteLocalRef(jPageId);
+
+    if (page != nullptr)
+      page->CallBridgeTime(getCurrentTime() - startTime);
     return flag;
   }
 
   int Bridge_Impl_Android::callAppendTreeCreateFinish(const char *pageId, const char *ref) {
+
+    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+    long long startTime = getCurrentTime();
+
     JNIEnv *env = getJNIEnv();
     jstring jPageId = env->NewStringUTF(pageId);
     jstring jRef = env->NewStringUTF(ref);
@@ -872,20 +920,21 @@ namespace WeexCore {
       env->DeleteLocalRef(jPageId);
     if (jRef != nullptr)
       env->DeleteLocalRef(jRef);
+
+    if (page != nullptr)
+      page->CallBridgeTime(getCurrentTime() - startTime);
     return flag;
   }
 
   int Bridge_Impl_Android::callHasTransitionPros(const char* pageId, const char* ref, std::vector<std::pair<std::string, std::string>> *style) {
-    JNIEnv *env = getJNIEnv();
-    jstring jPageId = env->NewStringUTF(pageId);
-    jstring jRef = env->NewStringUTF(ref);
 
     RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    if (page == nullptr)
-      return -1;
-
     long long startTime = getCurrentTime();
 
+    JNIEnv *env = getJNIEnv();
+    jstring jPageId = env->NewStringUTF(pageId);
+    jstring jRef = env->NewStringUTF(ref);
+
     if (jMapConstructorMethodId == NULL)
       jMapConstructorMethodId = env->GetMethodID(jMapClazz, "<init>", "()V");
     if (jMapPutMethodId == NULL)
@@ -898,10 +947,6 @@ namespace WeexCore {
       cpyCVector2JMap(style, jStyles, env);
     }
 
-    page->CreateJMapJNITime(getCurrentTime() - startTime);
-
-    long long startTimeCallBridge = getCurrentTime();
-
     if (jCallHasTransitionProsMethodId == NULL)
         jCallHasTransitionProsMethodId = env->GetMethodID(jBridgeClazz,
                                                             "callHasTransitionPros",
@@ -909,13 +954,15 @@ namespace WeexCore {
 
     int flag = 0;
     flag = env->CallIntMethod(jThis, jCallHasTransitionProsMethodId, jPageId, jRef, jStyles);
-    page->CallBridgeTime(getCurrentTime() - startTimeCallBridge);
 
     if (jPageId != nullptr)
       env->DeleteLocalRef(jPageId);
     if (jRef != nullptr)
       env->DeleteLocalRef(jRef);
     env->DeleteLocalRef(jStyles);
+
+    if (page != nullptr)
+      page->CallBridgeTime(getCurrentTime() - startTime);
     return flag;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp b/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp
index d5dcd10..d7bc154 100644
--- a/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp
+++ b/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp
@@ -151,20 +151,96 @@ static void SetRenderContainerWrapContent(JNIEnv* env, jobject jcaller, jboolean
   page->SetRenderContainerWidthWrapContent(wrap);
 }
 
-static jint PrintFirstScreenRenderTime(JNIEnv *env, jobject jcaller, jstring instanceId) {
+static jlongArray GetFirstScreenRenderTime(JNIEnv *env, jobject jcaller, jstring instanceId) {
+  jlongArray jRet = env->NewLongArray(3);
+
+  RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));
+  if (page == nullptr)
+    return jRet;
+
+  std::vector<long> temp = page->PrintFirstScreenLog();
+
+  jlong ret[3];
+
+  ret[0] = temp[0];
+  ret[1] = temp[1];
+  ret[2] = temp[2];
+  env->SetLongArrayRegion(jRet, 0, 3, ret);
+
+  return jRet;
+}
+
+static jlongArray GetRenderFinishTime(JNIEnv *env, jobject jcaller, jstring instanceId) {
+  jlongArray jRet = env->NewLongArray(3);
+
+  RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));
+  if (page == nullptr)
+    return 0;
+
+  std::vector<long> temp = page->PrintRenderSuccessLog();
+
+  jlong ret[3];
+
+  ret[0] = temp[0];
+  ret[1] = temp[1];
+  ret[2] = temp[2];
+  env->SetLongArrayRegion(jRet, 0, 3, ret);
+
+  return jRet;
+}
+
+static jlong GetFirstScreenCallBridgeTime(JNIEnv* env, jobject jcaller,
+                                          jstring instanceId) {
+  RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));
+  if (page == nullptr)
+    return 0;
+
+  return page->GetFirstScreenCallBridgeTime();
+}
+
+static jlong GetFirstScreenCssLayoutTime(JNIEnv* env, jobject jcaller,
+                                         jstring instanceId) {
+  RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));
+  if (page == nullptr)
+    return 0;
+
+  return page->GetFirstScreenCssLayoutTime();
+}
+
+static jlong GetFirstScreenParseJsonTime(JNIEnv* env, jobject jcaller,
+                                         jstring instanceId) {
+  RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));
+  if (page == nullptr)
+    return 0;
+
+  return page->GetFirstScreenParseJsonTime();
+}
+
+static jlong GetOnRenderSuccessCallBridgeTime(JNIEnv* env, jobject jcaller,
+                                              jstring instanceId) {
+  RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));
+  if (page == nullptr)
+    return 0;
+
+  return page->GetOnRenderSuccessCallBridgeTime();
+}
+
+static jlong GetOnRenderSuccessCssLayoutTime(JNIEnv* env, jobject jcaller,
+                                             jstring instanceId) {
   RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));
   if (page == nullptr)
     return 0;
 
-  return page->PrintFirstScreenLog();
+  return page->GetOnRenderSuccessCssLayoutTime();
 }
 
-static jint PrintRenderFinishTime(JNIEnv *env, jobject jcaller, jstring instanceId) {
+static jlong GetOnRenderSuccessParseJsonTime(JNIEnv* env, jobject jcaller,
+                                             jstring instanceId) {
   RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));
   if (page == nullptr)
     return 0;
 
-  return page->PrintRenderSuccessLog();
+  return page->GetOnRenderSuccessParseJsonTime();
 }
 
 //Notice that this method is invoked from main thread.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/weex_core/Source/android/jniprebuild/jniheader/WXBridge_jni.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/jniprebuild/jniheader/WXBridge_jni.h b/weex_core/Source/android/jniprebuild/jniheader/WXBridge_jni.h
index 201799f..e89ad36 100644
--- a/weex_core/Source/android/jniprebuild/jniheader/WXBridge_jni.h
+++ b/weex_core/Source/android/jniprebuild/jniheader/WXBridge_jni.h
@@ -81,10 +81,10 @@ static void SetRenderContainerWrapContent(JNIEnv* env, jobject jcaller,
     jboolean wrap,
     jstring instanceId);
 
-static jint PrintFirstScreenRenderTime(JNIEnv* env, jobject jcaller,
+static jlongArray GetFirstScreenRenderTime(JNIEnv* env, jobject jcaller,
     jstring instanceId);
 
-static jint PrintRenderFinishTime(JNIEnv* env, jobject jcaller,
+static jlongArray GetRenderFinishTime(JNIEnv* env, jobject jcaller,
     jstring instanceId);
 
 static void SetDefaultHeightAndWidthIntoRootDom(JNIEnv* env, jobject jcaller,
@@ -234,16 +234,16 @@ static const JNINativeMethod kMethodsWXBridge[] = {
 "Ljava/lang/String;"
 ")"
 "V", reinterpret_cast<void*>(SetRenderContainerWrapContent) },
-    { "nativePrintFirstScreenRenderTime",
+    { "nativeGetFirstScreenRenderTime",
 "("
 "Ljava/lang/String;"
 ")"
-"I", reinterpret_cast<void*>(PrintFirstScreenRenderTime) },
-    { "nativePrintRenderFinishTime",
+"[J", reinterpret_cast<void*>(GetFirstScreenRenderTime) },
+    { "nativeGetRenderFinishTime",
 "("
 "Ljava/lang/String;"
 ")"
-"I", reinterpret_cast<void*>(PrintRenderFinishTime) },
+"[J", reinterpret_cast<void*>(GetRenderFinishTime) },
     { "nativeSetDefaultHeightAndWidthIntoRootDom",
 "("
 "Ljava/lang/String;"

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/weex_core/Source/core/moniter/render_performance.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/moniter/render_performance.cpp b/weex_core/Source/core/moniter/render_performance.cpp
index a966aeb..4fe594b 100644
--- a/weex_core/Source/core/moniter/render_performance.cpp
+++ b/weex_core/Source/core/moniter/render_performance.cpp
@@ -17,34 +17,29 @@
  * under the License.
  */
 #include "render_performance.h"
-#include <android/base/log_utils.h>
 
 namespace WeexCore {
 
-  int
-  RenderPerformance::PrintPerformanceLogImplAndroid(const PerformanceStage &performanceStage) {
+  std::vector<long> RenderPerformance::PrintPerformanceLog(PerformanceStage performanceStage) {
 
-#if PERFORMANCE_LOG
+    std::vector<long> ret(3);
 
     if (performanceStage == onFirstScreen) {
-      LOGD("[WeexCore render time]onFirstScreen");
+      firstScreenCallBridgeTime = callBridgeTime;
+      firstScreenCssLayoutTime = cssLayoutTime;
+      firstScreenParseJsonTime = parseJsonTime;
+      ret[0] = firstScreenCallBridgeTime;
+      ret[1] = firstScreenCssLayoutTime;
+      ret[2] = firstScreenParseJsonTime;
     } else {
-      LOGD("[WeexCore render time]onRenderSuccess");
+      onRenderSuccessCallBridgeTime = callBridgeTime;
+      onRenderSuccessCssLayoutTime = cssLayoutTime;
+      onRenderSuccessParseJsonTime = parseJsonTime;
+      ret[0] = onRenderSuccessCallBridgeTime;
+      ret[1] = onRenderSuccessCssLayoutTime;
+      ret[2] = onRenderSuccessParseJsonTime;
     }
-    LOGD("[WeexCore render time]      jniCallTime: %lld", jniCallTime);
-    LOGD("[WeexCore render time]        -addElementActionJNITime: %lld", addElementActionJNITime);
-    LOGD("[WeexCore render time]         layoutActionJNITime: %lld", layoutActionJniTime);
-    LOGD("[WeexCore render time]        -jniCallBridgeTime: %lld", jniCallBridgeTime);
-    LOGD("[WeexCore render time]         createJMapJNITime: %lld", createJMapJNITime);
-    LOGD("[WeexCore render time]      cssLayoutTime: %lld", cssLayoutTime);
-    LOGD("[WeexCore render time]      parseJsonTime: %lld", parseJsonTime);
-    LOGD("[WeexCore render time]      buildRenderObjectTime: %lld", buildRenderObjectTime);
-#endif
 
-    return cssLayoutTime;
-  }
-
-  int RenderPerformance::PrintPerformanceLogImplIOS(const PerformanceStage &performanceStage) {
-    return 0;
+    return ret;
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/weex_core/Source/core/moniter/render_performance.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/moniter/render_performance.h b/weex_core/Source/core/moniter/render_performance.h
index 69e9928..f6c24ee 100644
--- a/weex_core/Source/core/moniter/render_performance.h
+++ b/weex_core/Source/core/moniter/render_performance.h
@@ -19,6 +19,8 @@
 #ifndef WEEX_PROJECT_WXPERFORMANCE_H
 #define WEEX_PROJECT_WXPERFORMANCE_H
 
+#include <vector>
+
 namespace WeexCore {
 
   typedef enum PerformanceStage {
@@ -29,40 +31,30 @@ namespace WeexCore {
 
   public:
 
-    long long jniCallTime;
-
-    long long jniCallBridgeTime;
+    long long callBridgeTime;
 
     long long cssLayoutTime;
 
-    long long addElementActionJNITime;
-
-    long long addEventActionJNITime;
-
-    long long removeEventActionJNITime;
-
-    long long layoutActionJniTime;
-
     long long parseJsonTime;
 
-    long long buildRenderObjectTime;
+    long long firstScreenCallBridgeTime;
+
+    long long firstScreenCssLayoutTime;
 
-    long long createJMapJNITime;
+    long long firstScreenParseJsonTime;
 
-    RenderPerformance() : jniCallTime(0), jniCallBridgeTime(0), cssLayoutTime(0),
-                          addElementActionJNITime(0),
-                          layoutActionJniTime(0), parseJsonTime(0), buildRenderObjectTime(0),
-                          createJMapJNITime(0) {}
+    long long onRenderSuccessCallBridgeTime;
 
-    inline int PrintPerformanceLog(PerformanceStage performanceStage) {
-      return PrintPerformanceLogImplAndroid(performanceStage);
-    }
+    long long onRenderSuccessCssLayoutTime;
 
-  private:
+    long long onRenderSuccessParseJsonTime;
 
-    int PrintPerformanceLogImplAndroid(const PerformanceStage &performanceStage);
+    RenderPerformance() : callBridgeTime(0), cssLayoutTime(0), parseJsonTime(0),
+                          firstScreenCallBridgeTime(0), firstScreenCssLayoutTime(0),
+                          firstScreenParseJsonTime(0), onRenderSuccessCallBridgeTime(0),
+                          onRenderSuccessCssLayoutTime(0), onRenderSuccessParseJsonTime(0) {}
 
-    int PrintPerformanceLogImplIOS(const PerformanceStage &performanceStage);
+    std::vector<long> PrintPerformanceLog(PerformanceStage performanceStage);
   };
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/weex_core/Source/core/render/action/render_action_add_element.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/action/render_action_add_element.cpp b/weex_core/Source/core/render/action/render_action_add_element.cpp
index fd039db..0ca77b6 100644
--- a/weex_core/Source/core/render/action/render_action_add_element.cpp
+++ b/weex_core/Source/core/render/action/render_action_add_element.cpp
@@ -37,16 +37,10 @@ namespace WeexCore {
   }
 
   void RenderActionAddElement::ExecuteAction() {
-    RenderPage *page = RenderManager::GetInstance()->GetPage(mPageId);
-    if (page == nullptr)
-      return;
-
-    long long startTime = getCurrentTime();
     Bridge_Impl_Android::getInstance()->callAddElement(mPageId.c_str(), mComponentType.c_str(), mRef.c_str(),
                                                        mIndex, mParentRef.c_str(), mStyles, mAttributes,
                                                        mEvents, mMargins, mPaddings, mBorders, mWillLayout);
     page->JniCallTime(getCurrentTime() - startTime);
     page->AddElementActionJNITime(getCurrentTime() - startTime);
   }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/weex_core/Source/core/render/action/render_action_add_event.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/action/render_action_add_event.cpp b/weex_core/Source/core/render/action/render_action_add_event.cpp
index 04129d8..460852a 100644
--- a/weex_core/Source/core/render/action/render_action_add_event.cpp
+++ b/weex_core/Source/core/render/action/render_action_add_event.cpp
@@ -27,16 +27,7 @@ namespace WeexCore {
   }
 
   void RenderActionAddEvent::ExecuteAction() {
-    RenderPage *page = RenderManager::GetInstance()->GetPage(mPageId);
-    if (page == nullptr)
-      return;
-
-    long long startTime = getCurrentTime();
-
     Bridge_Impl_Android::getInstance()->callAddEvent(mPageId.c_str(), mRef.c_str(), mEvent.c_str());
-
-    page->JniCallTime(getCurrentTime() - startTime);
-    page->AddEventActionJNITime(getCurrentTime() - startTime);
   }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/weex_core/Source/core/render/action/render_action_createbody.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/action/render_action_createbody.cpp b/weex_core/Source/core/render/action/render_action_createbody.cpp
index 4d77b30..6fe79ea 100644
--- a/weex_core/Source/core/render/action/render_action_createbody.cpp
+++ b/weex_core/Source/core/render/action/render_action_createbody.cpp
@@ -33,15 +33,8 @@ namespace WeexCore {
   }
 
   void RenderActionCreateBody::ExecuteAction() {
-    RenderPage *page = RenderManager::GetInstance()->GetPage(mPageId);
-    if (page == nullptr)
-      return;
-
-    long long startTime = getCurrentTime();
     Bridge_Impl_Android::getInstance()->callCreateBody(mPageId.c_str(), mComponentType.c_str(), mRef.c_str(),
                                                        mStyles, mAttributes, mEvents,
                                                        mMargins, mPaddings, mBorders);
-    page->JniCallTime(getCurrentTime() - startTime);
-    page->AddElementActionJNITime(getCurrentTime() - startTime);
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/weex_core/Source/core/render/action/render_action_createfinish.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/action/render_action_createfinish.cpp b/weex_core/Source/core/render/action/render_action_createfinish.cpp
index f9163ca..b447603 100644
--- a/weex_core/Source/core/render/action/render_action_createfinish.cpp
+++ b/weex_core/Source/core/render/action/render_action_createfinish.cpp
@@ -25,13 +25,6 @@ namespace WeexCore {
   }
 
   void RenderActionCreateFinish::ExecuteAction() {
-    RenderPage *page = RenderManager::GetInstance()->GetPage(mPageId);
-    if (page == nullptr)
-      return;
-
-    long long startTime = getCurrentTime();
     Bridge_Impl_Android::getInstance()->callCreateFinish(mPageId.c_str());
-
-    page->JniCallTime(getCurrentTime() - startTime);
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/weex_core/Source/core/render/action/render_action_layout.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/action/render_action_layout.cpp b/weex_core/Source/core/render/action/render_action_layout.cpp
index 39a302e..70d244d 100644
--- a/weex_core/Source/core/render/action/render_action_layout.cpp
+++ b/weex_core/Source/core/render/action/render_action_layout.cpp
@@ -28,16 +28,9 @@ namespace WeexCore {
   }
 
   void RenderActionLayout::ExecuteAction() {
-    RenderPage *page = RenderManager::GetInstance()->GetPage(mPageId);
-    if (page == nullptr)
-      return;
-
-    long long startTime = getCurrentTime();
     Bridge_Impl_Android::getInstance()->callLayout(mPageId.c_str(), mRef.c_str(),
                                                    mTop, mBottom, mLeft, mRight,
                                                    mHeight, mWidth, index);
-    page->JniCallTime(getCurrentTime() - startTime);
-    page->LayoutActionJniTime(getCurrentTime() - startTime);
   }
 
   void RenderActionLayout::GetLayoutInfo(const WXCoreLayoutNode *node) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/weex_core/Source/core/render/action/render_action_move_element.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/action/render_action_move_element.cpp b/weex_core/Source/core/render/action/render_action_move_element.cpp
index 5501d78..f7081c8 100644
--- a/weex_core/Source/core/render/action/render_action_move_element.cpp
+++ b/weex_core/Source/core/render/action/render_action_move_element.cpp
@@ -29,12 +29,6 @@ namespace WeexCore {
   }
 
   void RenderActionMoveElement::ExecuteAction() {
-    RenderPage *page = RenderManager::GetInstance()->GetPage(mPageId);
-    if (page == nullptr)
-      return;
-
-    long long startTime = getCurrentTime();
     Bridge_Impl_Android::getInstance()->callMoveElement(mPageId.c_str(), mRef.c_str(), mParentRef.c_str(), mIndex);
-    page->JniCallTime(getCurrentTime() - startTime);
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/weex_core/Source/core/render/action/render_action_remove_element.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/action/render_action_remove_element.cpp b/weex_core/Source/core/render/action/render_action_remove_element.cpp
index 52abde8..ef33a36 100644
--- a/weex_core/Source/core/render/action/render_action_remove_element.cpp
+++ b/weex_core/Source/core/render/action/render_action_remove_element.cpp
@@ -26,12 +26,6 @@ namespace WeexCore {
   }
 
   void RenderActionRemoveElement::ExecuteAction() {
-    RenderPage *page = RenderManager::GetInstance()->GetPage(mPageId);
-    if (page == nullptr)
-      return;
-
-    long long startTime = getCurrentTime();
     Bridge_Impl_Android::getInstance()->callRemoveElement(mPageId.c_str(), mRef.c_str());
-    page->JniCallTime(getCurrentTime() - startTime);
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/weex_core/Source/core/render/action/render_action_remove_event.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/action/render_action_remove_event.cpp b/weex_core/Source/core/render/action/render_action_remove_event.cpp
index 3bbb15c..94bd61e 100644
--- a/weex_core/Source/core/render/action/render_action_remove_event.cpp
+++ b/weex_core/Source/core/render/action/render_action_remove_event.cpp
@@ -27,16 +27,7 @@ namespace WeexCore {
   }
 
   void RenderActionRemoveEvent::ExecuteAction() {
-    RenderPage *page = RenderManager::GetInstance()->GetPage(mPageId);
-    if (page == nullptr)
-      return;
-
-    long long startTime = getCurrentTime();
-
     Bridge_Impl_Android::getInstance()->callRemoveEvent(mPageId.c_str(), mRef.c_str(), mEvent.c_str());
-
-    page->JniCallTime(getCurrentTime() - startTime);
-    page->RemoveEventActionJNITime(getCurrentTime() - startTime);
   }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/weex_core/Source/core/render/action/render_action_update_attr.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/action/render_action_update_attr.cpp b/weex_core/Source/core/render/action/render_action_update_attr.cpp
index 99cb49f..082fc69 100644
--- a/weex_core/Source/core/render/action/render_action_update_attr.cpp
+++ b/weex_core/Source/core/render/action/render_action_update_attr.cpp
@@ -28,13 +28,6 @@ namespace WeexCore {
   }
 
   void RenderActionUpdateAttr::ExecuteAction() {
-    RenderPage *page = RenderManager::GetInstance()->GetPage(mPageId);
-    if (page == nullptr)
-      return;
-
-    long long startTime = getCurrentTime();
     Bridge_Impl_Android::getInstance()->callUpdateAttr(mPageId.c_str(), mRef.c_str(), mAttrs);
-    if (page != nullptr)
-      page->JniCallTime(getCurrentTime() - startTime);
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/weex_core/Source/core/render/action/render_action_update_style.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/action/render_action_update_style.cpp b/weex_core/Source/core/render/action/render_action_update_style.cpp
index 3c15514..9f3509d 100644
--- a/weex_core/Source/core/render/action/render_action_update_style.cpp
+++ b/weex_core/Source/core/render/action/render_action_update_style.cpp
@@ -34,14 +34,7 @@ namespace WeexCore {
   }
 
   void RenderActionUpdateStyle::ExecuteAction() {
-    RenderPage *page = RenderManager::GetInstance()->GetPage(mPageId);
-    if (page == nullptr)
-      return;
-
-    long long startTime = getCurrentTime();
     Bridge_Impl_Android::getInstance()->callUpdateStyle(mPageId.c_str(), mRef.c_str(), mStyle, mMargin,
                                                         mPadding, mBorder);
-    if (page != nullptr)
-      page->JniCallTime(getCurrentTime() - startTime);
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/weex_core/Source/core/render/manager/render_manager.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/manager/render_manager.cpp b/weex_core/Source/core/render/manager/render_manager.cpp
index da61a12..d3e9b11 100644
--- a/weex_core/Source/core/render/manager/render_manager.cpp
+++ b/weex_core/Source/core/render/manager/render_manager.cpp
@@ -34,12 +34,13 @@ namespace WeexCore {
 
     RenderPage *page = new RenderPage(pageId);
     mPages.insert(std::pair<std::string, RenderPage *>(pageId, page));
+
     long long startTime = getCurrentTime();
     char *c_data = (char *) data.data();
     RenderObject *root = Json2RenderObject(c_data, pageId);
-    page->updateDirty(true);
     page->ParseJsonTime(getCurrentTime() - startTime);
-    page->BuildRenderTreeTime(getCurrentTime() - startTime);
+
+    page->updateDirty(true);
     return page->CreateRootRender(root);
   }
 
@@ -59,7 +60,7 @@ namespace WeexCore {
     char *c_data = (char *) data.data();
     RenderObject *child = Json2RenderObject(c_data, pageId);
     page->ParseJsonTime(getCurrentTime() - startTime);
-    page->BuildRenderTreeTime(getCurrentTime() - startTime);
+
     if (child == nullptr)
       return false;
 
@@ -111,9 +112,9 @@ namespace WeexCore {
     long long startTime = getCurrentTime();
     char *c_data = (char *) data.data();
     std::vector<std::pair<std::string, std::string>> *attrs = Json2Pairs(c_data);
-    page->updateDirty(true);
     page->ParseJsonTime(getCurrentTime() - startTime);
-    page->BuildRenderTreeTime(getCurrentTime() - startTime);
+
+    page->updateDirty(true);
     return page->UpdateAttr(ref, attrs);
   }
 
@@ -131,9 +132,9 @@ namespace WeexCore {
     long long startTime = getCurrentTime();
     char *c_data = (char *) data.data();
     std::vector<std::pair<std::string, std::string>> *styles = Json2Pairs(c_data);
-    page->updateDirty(true);
     page->ParseJsonTime(getCurrentTime() - startTime);
-    page->BuildRenderTreeTime(getCurrentTime() - startTime);
+
+    page->updateDirty(true);
     return page->UpdateStyle(ref, styles);
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/weex_core/Source/core/render/page/render_page.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/page/render_page.cpp b/weex_core/Source/core/render/page/render_page.cpp
index 6acf8be..b01050b 100644
--- a/weex_core/Source/core/render/page/render_page.cpp
+++ b/weex_core/Source/core/render/page/render_page.cpp
@@ -142,7 +142,6 @@ namespace WeexCore {
     if (root == nullptr)
       return false;
 
-    long long startTime = getCurrentTime();
     SetRootRenderObject(root);
 
     if (isnan(render_root->getStyleWidth())) {
@@ -156,7 +155,6 @@ namespace WeexCore {
     }
     PushRenderToRegisterMap(root);
 
-    BuildRenderTreeTime(getCurrentTime() - startTime);
     SendCreateBodyAction(root);
     return true;
   }
@@ -169,7 +167,6 @@ namespace WeexCore {
   }
 
   bool RenderPage::AddRenderObject(const std::string &parentRef, int insertPosition, RenderObject *child) {
-    long long startTime = getCurrentTime();
     RenderObject *parent = GetRenderObject(parentRef);
     if (parent == nullptr || child == nullptr) {
       return false;
@@ -182,7 +179,6 @@ namespace WeexCore {
     }
 
     PushRenderToRegisterMap(child);
-    BuildRenderTreeTime(getCurrentTime() - startTime);
     SendAddElementAction(child, parent, insertPosition, false);
 
     Batch();
@@ -190,7 +186,6 @@ namespace WeexCore {
   }
 
   bool RenderPage::RemoveRenderObject(const std::string &ref) {
-    long long startTime = getCurrentTime();
     RenderObject *child = GetRenderObject(ref);
     if (child == nullptr)
       return false;
@@ -204,15 +199,11 @@ namespace WeexCore {
     RemoveRenderFromRegisterMap(child);
     delete child;
 
-    BuildRenderTreeTime(getCurrentTime() - startTime);
-
     SendRemoveElementAction(ref);
     return true;
   }
 
   bool RenderPage::MoveRenderObject(const std::string &ref, const std::string &parentRef, int index) {
-    long long startTime = getCurrentTime();
-
     RenderObject *child = GetRenderObject(ref);
     if (child == nullptr)
       return false;
@@ -235,14 +226,11 @@ namespace WeexCore {
     child->getParent()->removeChild(child);
     newParent->addChildAt(child, index);
 
-    BuildRenderTreeTime(getCurrentTime() - startTime);
-
     SendMoveElementAction(ref, parentRef, index);
     return true;
   }
 
   bool RenderPage::UpdateStyle(const std::string &ref, std::vector<std::pair<std::string, std::string>> *src) {
-    long long startTime = getCurrentTime();
     RenderObject *render = GetRenderObject(ref);
     if (render == nullptr || src == nullptr || src->empty())
       return false;
@@ -257,7 +245,6 @@ namespace WeexCore {
     int result = Bridge_Impl_Android::getInstance()->callHasTransitionPros(mPageId.c_str(), ref.c_str(), src);
 
     if (result == 1) {
-      BuildRenderTreeTime(getCurrentTime() - startTime);
       SendUpdateStyleAction(render, src, margin, padding, border);
     } else {
       for (auto iter = src->begin(); iter != src->end(); iter++) {
@@ -312,8 +299,6 @@ namespace WeexCore {
       }
     }
 
-    BuildRenderTreeTime(getCurrentTime() - startTime);
-
     if (style != nullptr || margin != nullptr || padding != nullptr || border != nullptr)
       SendUpdateStyleAction(render, style, margin, padding, border);
 
@@ -358,7 +343,6 @@ namespace WeexCore {
   }
 
   bool RenderPage::UpdateAttr(const std::string &ref, std::vector<std::pair<std::string, std::string>> *attrs) {
-    long long startTime = getCurrentTime();
     RenderObject *render = GetRenderObject(ref);
     if (render == nullptr || attrs == nullptr || attrs->empty())
       return false;
@@ -408,13 +392,11 @@ namespace WeexCore {
   }
 
   bool RenderPage::AddEvent(const std::string &ref, const std::string &event) {
-    long long startTime = getCurrentTime();
     RenderObject *render = GetRenderObject(ref);
     if (render == nullptr)
       return false;
 
     render->AddEvent(event);
-    BuildRenderTreeTime(getCurrentTime() - startTime);
 
     render_action *action = new RenderActionAddEvent(mPageId, ref, event);
     PostRenderAction(action);
@@ -422,13 +404,11 @@ namespace WeexCore {
   }
 
   bool RenderPage::RemoveEvent(const std::string &ref, const std::string &event) {
-    long long startTime = getCurrentTime();
     RenderObject *render = GetRenderObject(ref);
     if (render == nullptr)
       return false;
 
     render->RemoveEvent(event);
-    BuildRenderTreeTime(getCurrentTime() - startTime);
 
     render_action *action = new RenderActionRemoveEvent(mPageId, ref, event);
     PostRenderAction(action);
@@ -588,66 +568,69 @@ namespace WeexCore {
     PostRenderAction(action);
   }
 
-  void RenderPage::JniCallTime(const long long &time) {
-    if (mWXCorePerformance != nullptr)
-      mWXCorePerformance->jniCallTime += time;
-  }
-
   void RenderPage::CssLayoutTime(const long long &time) {
     if (mWXCorePerformance != nullptr)
       mWXCorePerformance->cssLayoutTime += time;
   }
 
-  void RenderPage::AddEventActionJNITime(const long long &time) {
+  long long RenderPage::GetFirstScreenCssLayoutTime() {
     if (mWXCorePerformance != nullptr)
-      mWXCorePerformance->addEventActionJNITime += time;
+      return mWXCorePerformance->firstScreenCssLayoutTime;
+    return 0;
   }
 
-  void RenderPage::RemoveEventActionJNITime(const long long &time) {
+  long long RenderPage::GetOnRenderSuccessCssLayoutTime() {
     if (mWXCorePerformance != nullptr)
-      mWXCorePerformance->removeEventActionJNITime += time;
+      return mWXCorePerformance->onRenderSuccessCssLayoutTime;
+    return 0;
   }
 
-  void RenderPage::AddElementActionJNITime(const long long &time) {
+  void RenderPage::ParseJsonTime(const long long &time) {
     if (mWXCorePerformance != nullptr)
-      mWXCorePerformance->addElementActionJNITime += time;
+      mWXCorePerformance->parseJsonTime += time;
   }
 
-  void RenderPage::LayoutActionJniTime(const long long &time) {
-    if (mWXCorePerformance != nullptr)
-      mWXCorePerformance->layoutActionJniTime += time;
+  long long RenderPage::GetFirstScreenParseJsonTime() {
+if (mWXCorePerformance != nullptr)
+      return mWXCorePerformance->firstScreenParseJsonTime;
+    return 0;
   }
 
-  void RenderPage::ParseJsonTime(const long long &time) {
+  long long RenderPage::GetOnRenderSuccessParseJsonTime() {
     if (mWXCorePerformance != nullptr)
-      mWXCorePerformance->parseJsonTime += time;
+      return mWXCorePerformance->onRenderSuccessParseJsonTime;
+    return 0;
   }
 
-  void RenderPage::BuildRenderTreeTime(const long long &time) {
+  void RenderPage::CallBridgeTime(const long long &time) {
     if (mWXCorePerformance != nullptr)
-      mWXCorePerformance->buildRenderObjectTime += time;
+      mWXCorePerformance->callBridgeTime += time;
   }
 
-  void RenderPage::CreateJMapJNITime(const long long &time) {
+  long long RenderPage::GetFirstScreenCallBridgeTime() {
     if (mWXCorePerformance != nullptr)
-      mWXCorePerformance->createJMapJNITime += time;
+      return mWXCorePerformance->firstScreenCallBridgeTime;
+    return 0;
   }
 
-  void RenderPage::CallBridgeTime(const long long &time) {
+  long long RenderPage::GetOnRenderSuccessCallBridgeTime() {
     if (mWXCorePerformance != nullptr)
-      mWXCorePerformance->jniCallBridgeTime += time;
+      return mWXCorePerformance->onRenderSuccessCallBridgeTime;
+    return 0;
   }
 
-  int RenderPage::PrintFirstScreenLog() {
+  std::vector<long> RenderPage::PrintFirstScreenLog() {
+    std::vector<long> ret;
     if (mWXCorePerformance != nullptr)
-      return mWXCorePerformance->PrintPerformanceLog(onFirstScreen);
-    return 0;
+      ret = mWXCorePerformance->PrintPerformanceLog(onFirstScreen);
+    return ret;
   }
 
-  int RenderPage::PrintRenderSuccessLog() {
+  std::vector<long> RenderPage::PrintRenderSuccessLog() {
+    std::vector<long> ret;
     if (mWXCorePerformance != nullptr)
-      return mWXCorePerformance->PrintPerformanceLog(onRenderSuccess);
-    return 0;
+      ret = mWXCorePerformance->PrintPerformanceLog(onRenderSuccess);
+    return ret;
   }
 
   void RenderPage::Batch() {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1806f233/weex_core/Source/core/render/page/render_page.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/page/render_page.h b/weex_core/Source/core/render/page/render_page.h
index cffcc99..6a52b11 100644
--- a/weex_core/Source/core/render/page/render_page.h
+++ b/weex_core/Source/core/render/page/render_page.h
@@ -102,29 +102,27 @@ namespace WeexCore {
 
     void Batch();
 
-    void JniCallTime(const long long &time);
-
     void CssLayoutTime(const long long &time);
 
-    void AddEventActionJNITime(const long long &time);
-
-    void RemoveEventActionJNITime(const long long &time);
+    long long GetFirstScreenCssLayoutTime();
 
-    void AddElementActionJNITime(const long long &time);
-
-    void LayoutActionJniTime(const long long &time);
+    long long GetOnRenderSuccessCssLayoutTime();
 
     void ParseJsonTime(const long long &time);
 
-    void BuildRenderTreeTime(const long long &time);
+    long long GetFirstScreenParseJsonTime();
 
-    void CreateJMapJNITime(const long long &time);
+    long long GetOnRenderSuccessParseJsonTime();
 
     void CallBridgeTime(const long long &time);
 
-    int PrintFirstScreenLog();
+    long long GetFirstScreenCallBridgeTime();
+
+    long long GetOnRenderSuccessCallBridgeTime();
 
-    int PrintRenderSuccessLog();
+    std::vector<long> PrintFirstScreenLog();
+
+    std::vector<long> PrintRenderSuccessLog();
 
     void LayoutImmediately();
 
@@ -139,10 +137,6 @@ namespace WeexCore {
 
     void SetRootRenderObject(RenderObject *root);
 
-    inline RenderObject * GetRootRenderObject() const {
-      return render_root;
-    }
-
     inline std::string PageId() {
       return mPageId;
     }


[3/5] incubator-weex git commit: [Core] reset var to null

Posted by ky...@apache.org.
[Core] reset var to null


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/ef12b7b9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/ef12b7b9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/ef12b7b9

Branch: refs/heads/master
Commit: ef12b7b939fa6a7627127c804dfba85247de9470
Parents: a14b217
Author: 立省 <li...@alibaba-inc.com>
Authored: Thu May 10 19:23:38 2018 +0800
Committer: miomin <69...@qq.com>
Committed: Wed May 16 18:05:48 2018 +0800

----------------------------------------------------------------------
 weex_core/Source/android/bridge/impl/bridge_impl_android.cpp | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ef12b7b9/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp b/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp
index 58fcdcf..d46dd0d 100644
--- a/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp
+++ b/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp
@@ -95,6 +95,7 @@ namespace WeexCore {
     jCallHasTransitionProsMethodId = NULL;
     jCallUpdateAttrsMethodId = NULL;
     jCallLayoutMethodId = NULL;
+    jCallAppendTreeCreateFinishMethodId = NULL;
     jCallCreateFinishMethodId = NULL;
   }
 


[2/5] incubator-weex git commit: * [core] Fix crash due to layer-limit.

Posted by ky...@apache.org.
* [core] Fix crash due to layer-limit.


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/a14b217b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/a14b217b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/a14b217b

Branch: refs/heads/master
Commit: a14b217bac4276828430284de928fbe6243c5b3f
Parents: 1806f23
Author: miomin <69...@qq.com>
Authored: Thu May 10 18:14:05 2018 +0800
Committer: miomin <69...@qq.com>
Committed: Wed May 16 17:46:32 2018 +0800

----------------------------------------------------------------------
 .../sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/a14b217b/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java
index eb3d676..8e3638d 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java
@@ -105,8 +105,8 @@ public class WXFrameLayout extends FrameLayout implements WXGestureObservable,IR
       try {
         dispatchDrawInterval(canvas);
       } catch (StackOverflowError e) {
-        int deep = reportLayerOverFlowError();
-        throw new LayerOverFlowLimitException("Layer overflow limit error: " + deep + " layers!");
+        reportLayerOverFlowError();
+        WXLogUtils.e("FlatGUI Crashed when dispatchDraw", WXLogUtils.getStackTrace(e));
       }
     } else {
       try {


[4/5] incubator-weex git commit: * [core] Use gnustl runtime.

Posted by ky...@apache.org.
* [core] Use gnustl runtime.


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/02d9983e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/02d9983e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/02d9983e

Branch: refs/heads/master
Commit: 02d9983e0044042fa7ad4d026af6e35e4ee9d3ff
Parents: ef12b7b
Author: miomin <69...@qq.com>
Authored: Tue May 15 19:39:08 2018 +0800
Committer: miomin <69...@qq.com>
Committed: Wed May 16 19:34:37 2018 +0800

----------------------------------------------------------------------
 android/sdk/build.gradle                        |   5 +-
 android/sdk/libs/armeabi/libweexjsc.so          | Bin 948168 -> 1320820 bytes
 weex_core/Source/CMakeLists.txt                 |   1 -
 .../bridge/impl/weexcore_impl_android.cpp       |  54 ---
 weex_core/Source/base/Compatible.cpp            | 122 -------
 weex_core/Source/base/ViewUtils.h               |   8 +
 weex_core/Source/base/fpconv.cpp                | 332 -------------------
 weex_core/Source/base/fpconv.h                  |  33 --
 weex_core/Source/base/powers.h                  | 129 -------
 weex_core/Source/core/layout/layout.cpp         |   1 +
 weex_core/Source/core/parser/dom_parser.cpp     |  30 +-
 weex_core/Source/core/render/node/render_list.h |  12 +-
 weex_core/Source/core/render/node/render_mask.h |   4 +-
 .../Source/core/render/node/render_object.h     |   1 +
 .../Source/core/render/page/render_page.cpp     |  42 +--
 weex_core/Source/core/render/page/render_page.h |  13 +-
 16 files changed, 27 insertions(+), 760 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/android/sdk/build.gradle
----------------------------------------------------------------------
diff --git a/android/sdk/build.gradle b/android/sdk/build.gradle
index 7eed76a..6fd1ee8 100755
--- a/android/sdk/build.gradle
+++ b/android/sdk/build.gradle
@@ -120,7 +120,7 @@ android {
             cmake {
                 arguments '-DANDROID_PLATFORM=android-19',
                         '-DANDROID_TOOLCHAIN=gcc',
-                        '-DANDROID_STL=c++_static',
+                        '-DANDROID_STL=gnustl_static',
                         '-DCMAKE_BUILD_TYPE=Release'
             }
         }
@@ -215,9 +215,6 @@ if(file('../license/LICENSE').exists()){
                          'Source/android/base/base64/**/*.h','Source/android/base/base64/**/*.cpp',
                          'Source/android/jniprebuild/jniheader/*.h',
                          'Source/base/Compatible.cpp',
-                         'Source/base/fpconv.cpp',
-                         'Source/base/fpconv.h',
-                         'Source/base/powers.h',
                          'Source/IPC/**/*.h','Source/IPC/**/*.cpp'])
     }
     preBuild.dependsOn licenseFormat

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/android/sdk/libs/armeabi/libweexjsc.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/armeabi/libweexjsc.so b/android/sdk/libs/armeabi/libweexjsc.so
index bb45615..eb909cd 100644
Binary files a/android/sdk/libs/armeabi/libweexjsc.so and b/android/sdk/libs/armeabi/libweexjsc.so differ

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/weex_core/Source/CMakeLists.txt b/weex_core/Source/CMakeLists.txt
index ef92a1f..77ba922 100644
--- a/weex_core/Source/CMakeLists.txt
+++ b/weex_core/Source/CMakeLists.txt
@@ -24,7 +24,6 @@ include_directories("include")
 
 add_library(weexjsc SHARED
 
-    ./base/fpconv.cpp
     ./android/jniprebuild/jni_load.cc
     ./android/base/jni/android_jni.cpp
     ./android/base/jni/scoped_java_ref.cpp

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp b/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp
index d7bc154..ef79558 100644
--- a/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp
+++ b/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp
@@ -189,60 +189,6 @@ static jlongArray GetRenderFinishTime(JNIEnv *env, jobject jcaller, jstring inst
   return jRet;
 }
 
-static jlong GetFirstScreenCallBridgeTime(JNIEnv* env, jobject jcaller,
-                                          jstring instanceId) {
-  RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));
-  if (page == nullptr)
-    return 0;
-
-  return page->GetFirstScreenCallBridgeTime();
-}
-
-static jlong GetFirstScreenCssLayoutTime(JNIEnv* env, jobject jcaller,
-                                         jstring instanceId) {
-  RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));
-  if (page == nullptr)
-    return 0;
-
-  return page->GetFirstScreenCssLayoutTime();
-}
-
-static jlong GetFirstScreenParseJsonTime(JNIEnv* env, jobject jcaller,
-                                         jstring instanceId) {
-  RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));
-  if (page == nullptr)
-    return 0;
-
-  return page->GetFirstScreenParseJsonTime();
-}
-
-static jlong GetOnRenderSuccessCallBridgeTime(JNIEnv* env, jobject jcaller,
-                                              jstring instanceId) {
-  RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));
-  if (page == nullptr)
-    return 0;
-
-  return page->GetOnRenderSuccessCallBridgeTime();
-}
-
-static jlong GetOnRenderSuccessCssLayoutTime(JNIEnv* env, jobject jcaller,
-                                             jstring instanceId) {
-  RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));
-  if (page == nullptr)
-    return 0;
-
-  return page->GetOnRenderSuccessCssLayoutTime();
-}
-
-static jlong GetOnRenderSuccessParseJsonTime(JNIEnv* env, jobject jcaller,
-                                             jstring instanceId) {
-  RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));
-  if (page == nullptr)
-    return 0;
-
-  return page->GetOnRenderSuccessParseJsonTime();
-}
-
 //Notice that this method is invoked from main thread.
 static jboolean NotifyLayout(JNIEnv* env, jobject jcaller, jstring instanceId) {
   RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/base/Compatible.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/base/Compatible.cpp b/weex_core/Source/base/Compatible.cpp
deleted file mode 100644
index 3fb0e5c..0000000
--- a/weex_core/Source/base/Compatible.cpp
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *  * Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  * Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <ctype.h>
-#include <errno.h>
-#include <grp.h>
-#include <math.h>
-#include <mntent.h>
-#include <netdb.h>
-#include <pthread.h>
-#include <pwd.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-namespace WeexCore {
-int sigemptyset(sigset_t *set) {
-  if (set == NULL) {
-    errno = EINVAL;
-    return -1;
-  }
-  memset(set, 0, sizeof(sigset_t));
-  return 0;
-}
-
-int sigfillset(sigset_t *set) {
-  if (set == NULL) {
-    errno = EINVAL;
-    return -1;
-  }
-  memset(set, ~0, sizeof(sigset_t));
-  return 0;
-}
-
-int sigaddset(sigset_t *set, int signum) {
-  int bit = signum - 1; // Signal numbers start at 1, but bit positions start at 0.
-  unsigned long *local_set = reinterpret_cast<unsigned long *>(set);
-  if (set == NULL || bit < 0 || bit >= static_cast<int>(8 * sizeof(sigset_t))) {
-    errno = EINVAL;
-    return -1;
-  }
-  local_set[bit / LONG_BIT] |= 1UL << (bit % LONG_BIT);
-  return 0;
-}
-
-int sigdelset(sigset_t *set, int signum) {
-  int bit = signum - 1; // Signal numbers start at 1, but bit positions start at 0.
-  unsigned long *local_set = reinterpret_cast<unsigned long *>(set);
-  if (set == NULL || bit < 0 || bit >= static_cast<int>(8 * sizeof(sigset_t))) {
-    errno = EINVAL;
-    return -1;
-  }
-  local_set[bit / LONG_BIT] &= ~(1UL << (bit % LONG_BIT));
-  return 0;
-}
-
-int getpagesize() {
-  // We dont use sysconf(3) here because that drags in stdio, which makes static binaries fat.
-  return PAGE_SIZE;
-}
-
-void srandom(unsigned int __s) { srand48(__s); }
-
-int isinf(double n) {
-  return __builtin_isinf(n);
-}
-
-int posix_memalign(void **memptr, size_t alignment, size_t bytes) {
-  if (!memptr)
-    return EINVAL;
-  *memptr = memalign(alignment, bytes);
-  if (!*memptr)
-    return ENOMEM;
-  return 0;
-}
-
-int sigismember(const sigset_t *set, int signum) {
-  int bit = signum - 1; // Signal numbers start at 1, but bit positions start at 0.
-  const unsigned long *local_set = reinterpret_cast<const unsigned long *>(set);
-  if (set == NULL || bit < 0 || bit >= static_cast<int>(8 * sizeof(sigset_t))) {
-    errno = EINVAL;
-    return -1;
-  }
-  return static_cast<int>((local_set[bit / LONG_BIT] >> (bit % LONG_BIT)) & 1);
-}
-
-int abs(int j) {
-  return (j < 0 ? -j : j);
-}
-
-long labs(long j) {
-  return (j < 0 ? -j : j);
-}
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/base/ViewUtils.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/base/ViewUtils.h b/weex_core/Source/base/ViewUtils.h
index 8983326..f73aeca 100644
--- a/weex_core/Source/base/ViewUtils.h
+++ b/weex_core/Source/base/ViewUtils.h
@@ -22,6 +22,7 @@
 #include <core/config/core_environment.h>
 #include <cmath>
 #include <cstdlib>
+#include <sstream>
 
 namespace WeexCore {
 
@@ -32,6 +33,13 @@ namespace WeexCore {
   const std::string AUTO_UNIT("auto");
   const std::string NONE("none");
 
+  template<typename T>
+  inline std::string to_string(const T &n) {
+    std::ostringstream stm;
+    stm << n;
+    return stm.str();
+  }
+
   inline std::string &Trim(std::string &s) {
     if (s.empty()) {
       return s;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/base/fpconv.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/base/fpconv.cpp b/weex_core/Source/base/fpconv.cpp
deleted file mode 100755
index 3fbd55a..0000000
--- a/weex_core/Source/base/fpconv.cpp
+++ /dev/null
@@ -1,332 +0,0 @@
-#include <stdbool.h>
-#include <string.h>
-
-#include "fpconv.h"
-#include "powers.h"
-
-#define fracmask  0x000FFFFFFFFFFFFFU
-#define expmask   0x7FF0000000000000U
-#define hiddenbit 0x0010000000000000U
-#define signmask  0x8000000000000000U
-#define expbias   (1023 + 52)
-
-#define absv(n) ((n) < 0 ? -(n) : (n))
-#define minv(a, b) ((a) < (b) ? (a) : (b))
-
-static uint64_t tens[] = {
-    10000000000000000000U, 1000000000000000000U, 100000000000000000U,
-    10000000000000000U, 1000000000000000U, 100000000000000U,
-    10000000000000U, 1000000000000U, 100000000000U,
-    10000000000U, 1000000000U, 100000000U,
-    10000000U, 1000000U, 100000U,
-    10000U, 1000U, 100U,
-    10U, 1U
-};
-
-static inline uint64_t get_dbits(double d)
-{
-    union {
-        double   dbl;
-        uint64_t i;
-    } dbl_bits = { d };
-
-    return dbl_bits.i;
-}
-
-static Fp build_fp(double d)
-{
-    uint64_t bits = get_dbits(d);
-
-    Fp fp;
-    fp.frac = bits & fracmask;
-    fp.exp = (bits & expmask) >> 52;
-
-    if(fp.exp) {
-        fp.frac += hiddenbit;
-        fp.exp -= expbias;
-
-    } else {
-        fp.exp = -expbias + 1;
-    }
-
-    return fp;
-}
-
-static void normalize(Fp* fp)
-{
-    while ((fp->frac & hiddenbit) == 0) {
-        fp->frac <<= 1;
-        fp->exp--;
-    }
-
-    int shift = 64 - 52 - 1;
-    fp->frac <<= shift;
-    fp->exp -= shift;
-}
-
-static void get_normalized_boundaries(Fp* fp, Fp* lower, Fp* upper)
-{
-    upper->frac = (fp->frac << 1) + 1;
-    upper->exp  = fp->exp - 1;
-
-    while ((upper->frac & (hiddenbit << 1)) == 0) {
-        upper->frac <<= 1;
-        upper->exp--;
-    }
-
-    int u_shift = 64 - 52 - 2;
-
-    upper->frac <<= u_shift;
-    upper->exp = upper->exp - u_shift;
-
-
-    int l_shift = fp->frac == hiddenbit ? 2 : 1;
-
-    lower->frac = (fp->frac << l_shift) - 1;
-    lower->exp = fp->exp - l_shift;
-
-
-    lower->frac <<= lower->exp - upper->exp;
-    lower->exp = upper->exp;
-}
-
-static Fp multiply(Fp* a, Fp* b)
-{
-    const uint64_t lomask = 0x00000000FFFFFFFF;
-
-    uint64_t ah_bl = (a->frac >> 32)    * (b->frac & lomask);
-    uint64_t al_bh = (a->frac & lomask) * (b->frac >> 32);
-    uint64_t al_bl = (a->frac & lomask) * (b->frac & lomask);
-    uint64_t ah_bh = (a->frac >> 32)    * (b->frac >> 32);
-
-    uint64_t tmp = (ah_bl & lomask) + (al_bh & lomask) + (al_bl >> 32); 
-    /* round up */
-    tmp += 1U << 31;
-
-    Fp fp = {
-        ah_bh + (ah_bl >> 32) + (al_bh >> 32) + (tmp >> 32),
-        a->exp + b->exp + 64
-    };
-
-    return fp;
-}
-
-static void round_digit(char* digits, int ndigits, uint64_t delta, uint64_t rem, uint64_t kappa, uint64_t frac)
-{
-    while (rem < frac && delta - rem >= kappa &&
-           (rem + kappa < frac || frac - rem > rem + kappa - frac)) {
-
-        digits[ndigits - 1]--;
-        rem += kappa;
-    }
-}
-
-static int generate_digits(Fp* fp, Fp* upper, Fp* lower, char* digits, int* K)
-{
-    uint64_t wfrac = upper->frac - fp->frac;
-    uint64_t delta = upper->frac - lower->frac;
-
-    Fp one;
-    one.frac = 1ULL << -upper->exp;
-    one.exp  = upper->exp;
-
-    uint64_t part1 = upper->frac >> -one.exp;
-    uint64_t part2 = upper->frac & (one.frac - 1);
-
-    int idx = 0, kappa = 10;
-    uint64_t* divp;
-    /* 1000000000 */
-    for(divp = tens + 10; kappa > 0; divp++) {
-
-        uint64_t div = *divp;
-        unsigned digit = part1 / div;
-
-        if (digit || idx) {
-            digits[idx++] = digit + '0';
-        }
-
-        part1 -= digit * div;
-        kappa--;
-
-        uint64_t tmp = (part1 <<-one.exp) + part2;
-        if (tmp <= delta) {
-            *K += kappa;
-            round_digit(digits, idx, delta, tmp, div << -one.exp, wfrac);
-
-            return idx;
-        }
-    }
-
-    /* 10 */
-    uint64_t* unit = tens + 18;
-
-    while(true) {
-        part2 *= 10;
-        delta *= 10;
-        kappa--;
-
-        unsigned digit = part2 >> -one.exp;
-        if (digit || idx) {
-            digits[idx++] = digit + '0';
-        }
-
-        part2 &= one.frac - 1;
-        if (part2 < delta) {
-            *K += kappa;
-            round_digit(digits, idx, delta, part2, one.frac, wfrac * *unit);
-
-            return idx;
-        }
-
-        unit--;
-    }
-}
-
-static int grisu2(double d, char* digits, int* K)
-{
-    Fp w = build_fp(d);
-
-    Fp lower, upper;
-    get_normalized_boundaries(&w, &lower, &upper);
-
-    normalize(&w);
-
-    int k;
-    Fp cp = find_cachedpow10(upper.exp, &k);
-
-    w     = multiply(&w,     &cp);
-    upper = multiply(&upper, &cp);
-    lower = multiply(&lower, &cp);
-
-    lower.frac++;
-    upper.frac--;
-
-    *K = -k;
-
-    return generate_digits(&w, &upper, &lower, digits, K);
-}
-
-static int emit_digits(char* digits, int ndigits, char* dest, int K, bool neg)
-{
-    int exp = absv(K + ndigits - 1);
-
-    /* write plain integer */
-    if(K >= 0 && (exp < (ndigits + 7))) {
-        memcpy(dest, digits, ndigits);
-        memset(dest + ndigits, '0', K);
-
-        return ndigits + K;
-    }
-
-    /* write decimal w/o scientific notation */
-    if(K < 0 && (K > -7 || exp < 4)) {
-        int offset = ndigits - absv(K);
-        /* fp < 1.0 -> write leading zero */
-        if(offset <= 0) {
-            offset = -offset;
-            dest[0] = '0';
-            dest[1] = '.';
-            memset(dest + 2, '0', offset);
-            memcpy(dest + offset + 2, digits, ndigits);
-
-            return ndigits + 2 + offset;
-
-        /* fp > 1.0 */
-        } else {
-            memcpy(dest, digits, offset);
-            dest[offset] = '.';
-            memcpy(dest + offset + 1, digits + offset, ndigits - offset);
-
-            return ndigits + 1;
-        }
-    }
-
-    /* write decimal w/ scientific notation */
-    ndigits = minv(ndigits, 18 - neg);
-
-    int idx = 0;
-    dest[idx++] = digits[0];
-
-    if(ndigits > 1) {
-        dest[idx++] = '.';
-        memcpy(dest + idx, digits + 1, ndigits - 1);
-        idx += ndigits - 1;
-    }
-
-    dest[idx++] = 'e';
-
-    char sign = K + ndigits - 1 < 0 ? '-' : '+';
-    dest[idx++] = sign;
-
-    int cent = 0;
-
-    if(exp > 99) {
-        cent = exp / 100;
-        dest[idx++] = cent + '0';
-        exp -= cent * 100;
-    }
-    if(exp > 9) {
-        int dec = exp / 10;
-        dest[idx++] = dec + '0';
-        exp -= dec * 10;
-
-    } else if(cent) {
-        dest[idx++] = '0';
-    }
-
-    dest[idx++] = exp % 10 + '0';
-
-    return idx;
-}
-
-static int filter_special(double fp, char* dest)
-{
-    if(fp == 0.0) {
-        dest[0] = '0';
-        return 1;
-    }
-
-    uint64_t bits = get_dbits(fp);
-
-    bool nan = (bits & expmask) == expmask;
-
-    if(!nan) {
-        return 0;
-    }
-
-    if(bits & fracmask) {
-        dest[0] = 'n'; dest[1] = 'a'; dest[2] = 'n';
-
-    } else {
-        dest[0] = 'i'; dest[1] = 'n'; dest[2] = 'f';
-    }
-
-    return 3;
-}
-
-int fpconv_dtoa(double d, char dest[24])
-{
-    char digits[18];
-
-    int str_len = 0;
-    bool neg = false;
-
-    if(get_dbits(d) & signmask) {
-        dest[0] = '-';
-        str_len++;
-        neg = true;
-    }
-
-    int spec = filter_special(d, dest + str_len);
-
-    if(spec) {
-        return str_len + spec;
-    }
-
-    int K = 0;
-    int ndigits = grisu2(d, digits, &K);
-
-    str_len += emit_digits(digits, ndigits, dest + str_len, K, neg);
-
-    return str_len;
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/base/fpconv.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/base/fpconv.h b/weex_core/Source/base/fpconv.h
deleted file mode 100755
index 58bbccc..0000000
--- a/weex_core/Source/base/fpconv.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef FPCONV_H
-#define FPCONV_H
-
-/* Fast and accurate double to string conversion based on Florian Loitsch's
- * Grisu-algorithm[1].
- *
- * Input:
- * fp -> the double to convert, dest -> destination buffer.
- * The generated string will never be longer than 24 characters.
- * Make sure to pass a pointer to at least 24 bytes of memory.
- * The emitted string will not be null terminated.
- *
- * Output:
- * The number of written characters.
- *
- * Exemplary usage:
- *
- * void print(double d)
- * {
- *      char buf[24 + 1] // plus null terminator
- *      int str_len = fpconv_dtoa(d, buf);
- *
- *      buf[str_len] = '\0';
- *      printf("%s", buf);
- * }
- *
- */
-
-int fpconv_dtoa(double fp, char dest[24]);
-
-#endif
-
-/* [1] http://florian.loitsch.com/publications/dtoa-pldi2010.pdf */

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/base/powers.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/base/powers.h b/weex_core/Source/base/powers.h
deleted file mode 100755
index 52e5da5..0000000
--- a/weex_core/Source/base/powers.h
+++ /dev/null
@@ -1,129 +0,0 @@
-#include <stdint.h>
-
-#define npowers     87
-#define steppowers  8
-#define firstpower -348 /* 10 ^ -348 */
-
-#define expmax     -32
-#define expmin     -60
-
-
-typedef struct Fp {
-    uint64_t frac;
-    int exp;
-} Fp;
-
-static Fp powers_ten[] = {
-        {18054884314459144840U, -1220},
-        {13451937075301367670U, -1193},
-        {10022474136428063862U, -1166},
-        {14934650266808366570U, -1140},
-        {11127181549972568877U, -1113},
-        {16580792590934885855U, -1087},
-        {12353653155963782858U, -1060},
-        {18408377700990114895U, -1034},
-        {13715310171984221708U, -1007},
-        {10218702384817765436U, -980},
-        {15227053142812498563U, -954},
-        {11345038669416679861U, -927},
-        {16905424996341287883U, -901},
-        {12595523146049147757U, -874},
-        {9384396036005875287U,  -847},
-        {13983839803942852151U, -821},
-        {10418772551374772303U, -794},
-        {15525180923007089351U, -768},
-        {11567161174868858868U, -741},
-        {17236413322193710309U, -715},
-        {12842128665889583758U, -688},
-        {9568131466127621947U,  -661},
-        {14257626930069360058U, -635},
-        {10622759856335341974U, -608},
-        {15829145694278690180U, -582},
-        {11793632577567316726U, -555},
-        {17573882009934360870U, -529},
-        {13093562431584567480U, -502},
-        {9755464219737475723U,  -475},
-        {14536774485912137811U, -449},
-        {10830740992659433045U, -422},
-        {16139061738043178685U, -396},
-        {12024538023802026127U, -369},
-        {17917957937422433684U, -343},
-        {13349918974505688015U, -316},
-        {9946464728195732843U,  -289},
-        {14821387422376473014U, -263},
-        {11042794154864902060U, -236},
-        {16455045573212060422U, -210},
-        {12259964326927110867U, -183},
-        {18268770466636286478U, -157},
-        {13611294676837538539U, -130},
-        {10141204801825835212U, -103},
-        {15111572745182864684U, -77},
-        {11258999068426240000U, -50},
-        {16777216000000000000U, -24},
-        {12500000000000000000U, 3},
-        {9313225746154785156U,  30},
-        {13877787807814456755U, 56},
-        {10339757656912845936U, 83},
-        {15407439555097886824U, 109},
-        {11479437019748901445U, 136},
-        {17105694144590052135U, 162},
-        {12744735289059618216U, 189},
-        {9495567745759798747U,  216},
-        {14149498560666738074U, 242},
-        {10542197943230523224U, 269},
-        {15709099088952724970U, 295},
-        {11704190886730495818U, 322},
-        {17440603504673385349U, 348},
-        {12994262207056124023U, 375},
-        {9681479787123295682U,  402},
-        {14426529090290212157U, 428},
-        {10748601772107342003U, 455},
-        {16016664761464807395U, 481},
-        {11933345169920330789U, 508},
-        {17782069995880619868U, 534},
-        {13248674568444952270U, 561},
-        {9871031767461413346U,  588},
-        {14708983551653345445U, 614},
-        {10959046745042015199U, 641},
-        {16330252207878254650U, 667},
-        {12166986024289022870U, 694},
-        {18130221999122236476U, 720},
-        {13508068024458167312U, 747},
-        {10064294952495520794U, 774},
-        {14996968138956309548U, 800},
-        {11173611982879273257U, 827},
-        {16649979327439178909U, 853},
-        {12405201291620119593U, 880},
-        {9242595204427927429U,  907},
-        {13772540099066387757U, 933},
-        {10261342003245940623U, 960},
-        {15290591125556738113U, 986},
-        {11392378155556871081U, 1013},
-        {16975966327722178521U, 1039},
-        {12648080533535911531U, 1066}
-};
-
-static Fp find_cachedpow10(int exp, int *k) {
-  const double one_log_ten = 0.30102999566398114;
-
-  int approx = -(exp + npowers) * one_log_ten;
-  int idx = (approx - firstpower) / steppowers;
-
-  while (1) {
-    int current = exp + powers_ten[idx].exp + 64;
-
-    if (current < expmin) {
-      idx++;
-      continue;
-    }
-
-    if (current > expmax) {
-      idx--;
-      continue;
-    }
-
-    *k = (firstpower + idx * steppowers);
-
-    return powers_ten[idx];
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/core/layout/layout.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/layout/layout.cpp b/weex_core/Source/core/layout/layout.cpp
index a2fc800..cbccbab 100644
--- a/weex_core/Source/core/layout/layout.cpp
+++ b/weex_core/Source/core/layout/layout.cpp
@@ -17,6 +17,7 @@
  * under the License.
  */
 #include "layout.h"
+#include <tuple>
 
 using namespace WeexCore;
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/core/parser/dom_parser.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/parser/dom_parser.cpp b/weex_core/Source/core/parser/dom_parser.cpp
index 89aac39..13d9132 100644
--- a/weex_core/Source/core/parser/dom_parser.cpp
+++ b/weex_core/Source/core/parser/dom_parser.cpp
@@ -18,10 +18,10 @@
  */
 
 #include "dom_parser.h"
-#include <base/fpconv.h>
 #include <core/render/node/render_object.h>
 #include <core/render/page/render_page.h>
 #include <core/render/node/factory/render_creator.h>
+#include <base/ViewUtils.h>
 
 using namespace std;
 using namespace rapidjson;
@@ -365,23 +365,10 @@ namespace WeexCore {
         while (const char *key2 = r.NextObjectKey()) {
           if (r.PeekType() == kNumberType) {
             RAPIDJSON_ASSERT(r.PeekType() == kNumberType);
-            char *temp = new char[65];
             if (0 == strcmp(key, "attr")) {
-              int len = fpconv_dtoa(r.GetDouble(), temp);
-              temp[len] = '\0';
-              char value[len + 1];
-              strcpy(value, temp);
-              render->AddAttr(key2, value);
+              render->AddAttr(key2, to_string(r.GetDouble()));
             } else if (0 == strcmp(key, "style")) {
-              int len = fpconv_dtoa(r.GetDouble(), temp);
-              temp[len] = '\0';
-              char value[len + 1];
-              strcpy(value, temp);
-              render->AddStyle(key2, value);
-            }
-            if (temp != nullptr) {
-              delete[]temp;
-              temp = nullptr;
+              render->AddStyle(key2, to_string(r.GetDouble()));
             }
           } else if (r.PeekType() == kStringType) {
             RAPIDJSON_ASSERT(r.PeekType() == kStringType);
@@ -499,17 +486,8 @@ namespace WeexCore {
     while (const char *key = r.NextObjectKey()) {
       if (r.PeekType() == kNumberType) {
         RAPIDJSON_ASSERT(r.PeekType() == kNumberType);
-        char *temp = new char[65];
-        int len = fpconv_dtoa(r.GetDouble(), temp);
-        temp[len] = '\0';
-        char value[len + 1];
-        strcpy(value, temp);
-        std::pair<std::string, std::string> myPair(key, value);
+        std::pair<std::string, std::string> myPair(key, to_string(r.GetDouble()));
         pairs->insert(pairs->end(), myPair);
-        if (temp != nullptr) {
-          delete[]temp;
-          temp = nullptr;
-        }
       } else if (r.PeekType() == kStringType) {
         RAPIDJSON_ASSERT(r.PeekType() == kStringType);
         const char *value = r.GetString();

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/core/render/node/render_list.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/node/render_list.h b/weex_core/Source/core/render/node/render_list.h
index 2e985bf..a1cb190 100644
--- a/weex_core/Source/core/render/node/render_list.h
+++ b/weex_core/Source/core/render/node/render_list.h
@@ -156,9 +156,9 @@ namespace WeexCore {
 
             mIsPreCalculateCellWidth = true;
             if(getColumnCount() > 0 || getColumnWidth() > 0 || mColumnCount > COLUMN_COUNT_NORMAL){
-                attrs->insert(std::pair<std::string, std::string>(COLUMN_COUNT, std::to_string(mColumnCount)));
-                attrs->insert(std::pair<std::string, std::string>(COLUMN_GAP, std::to_string(mColumnGap)));
-                attrs->insert(std::pair<std::string, std::string>(COLUMN_WIDTH, std::to_string(mColumnWidth)));
+                attrs->insert(std::pair<std::string, std::string>(COLUMN_COUNT, to_string(mColumnCount)));
+                attrs->insert(std::pair<std::string, std::string>(COLUMN_GAP, to_string(mColumnGap)));
+                attrs->insert(std::pair<std::string, std::string>(COLUMN_WIDTH, to_string(mColumnWidth)));
             }
         }
         return attrs;
@@ -205,11 +205,11 @@ namespace WeexCore {
     void AddRenderObjectWidth(RenderObject *child, const bool updating) {
         if (Type() == kRenderWaterfall || Type() == kRenderRecycleList) {
             if(child->Type() == kRenderHeader || child->Type() == kRenderFooter) {
-                child->ApplyStyle(WIDTH, std::to_string(mAvailableWidth), updating);
+                child->ApplyStyle(WIDTH, to_string(mAvailableWidth), updating);
             } else if (child->getStypePositionType() == kSticky) {
-                child->ApplyStyle(WIDTH, std::to_string(GetViewPortWidth()), updating);
+                child->ApplyStyle(WIDTH, to_string(GetViewPortWidth()), updating);
             } else if (child->Type() == kRenderCell || child->Type() == kRenderCellSlot){
-                child->ApplyStyle(WIDTH, std::to_string(mColumnWidth), updating);
+                child->ApplyStyle(WIDTH, to_string(mColumnWidth), updating);
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/core/render/node/render_mask.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/node/render_mask.h b/weex_core/Source/core/render/node/render_mask.h
index 690acdb..da7250a 100644
--- a/weex_core/Source/core/render/node/render_mask.h
+++ b/weex_core/Source/core/render/node/render_mask.h
@@ -45,8 +45,8 @@ namespace WeexCore {
       }
 
       style->insert(std::pair<std::string, std::string>(POSITION, "absolute"));
-      style->insert(std::pair<std::string, std::string>(WIDTH, std::to_string(getWebPxByWidth(width, GetViewPortWidth()))));
-      style->insert(std::pair<std::string, std::string>(HEIGHT, std::to_string(getWebPxByWidth(height, GetViewPortWidth()))));
+      style->insert(std::pair<std::string, std::string>(WIDTH, to_string(getWebPxByWidth(width, GetViewPortWidth()))));
+      style->insert(std::pair<std::string, std::string>(HEIGHT, to_string(getWebPxByWidth(height, GetViewPortWidth()))));
       style->insert(std::pair<std::string, std::string>(TOP, "0"));
       return style;
     }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/core/render/node/render_object.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/node/render_object.h b/weex_core/Source/core/render/node/render_object.h
index 2671fe1..15d3f8c 100644
--- a/weex_core/Source/core/render/node/render_object.h
+++ b/weex_core/Source/core/render/node/render_object.h
@@ -32,6 +32,7 @@
 #include <core/render/page/render_page.h>
 #include <core/css/constants_value.h>
 #include <android/base/log_utils.h>
+#include <functional>
 
 
 #define JSON_OBJECT_MARK_CHAR  '{'

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/core/render/page/render_page.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/page/render_page.cpp b/weex_core/Source/core/render/page/render_page.cpp
index b01050b..f0c6a05 100644
--- a/weex_core/Source/core/render/page/render_page.cpp
+++ b/weex_core/Source/core/render/page/render_page.cpp
@@ -264,7 +264,7 @@ namespace WeexCore {
                                 (*iter).second,
                                 0,
                                 [=, &flag](float foo) {
-                                  (*iter).second = std::to_string(foo),
+                                  (*iter).second = to_string(foo),
                                       margin->insert(margin->end(), (*iter)),
                                   flag = true;
                                 });
@@ -277,7 +277,7 @@ namespace WeexCore {
                                 (*iter).second,
                                 0,
                                 [=, &flag](float foo) {
-                                  (*iter).second = std::to_string(foo),
+                                  (*iter).second = to_string(foo),
                                       padding->insert(padding->end(), (*iter)),
                                   flag = true;
                                 });
@@ -290,7 +290,7 @@ namespace WeexCore {
                                 (*iter).second,
                                 0,
                                 [=, &flag](float foo) {
-                                  (*iter).second = std::to_string(foo),
+                                  (*iter).second = to_string(foo),
                                       border->insert(border->end(), (*iter)),
                                   flag = true;
                                 });
@@ -573,52 +573,16 @@ namespace WeexCore {
       mWXCorePerformance->cssLayoutTime += time;
   }
 
-  long long RenderPage::GetFirstScreenCssLayoutTime() {
-    if (mWXCorePerformance != nullptr)
-      return mWXCorePerformance->firstScreenCssLayoutTime;
-    return 0;
-  }
-
-  long long RenderPage::GetOnRenderSuccessCssLayoutTime() {
-    if (mWXCorePerformance != nullptr)
-      return mWXCorePerformance->onRenderSuccessCssLayoutTime;
-    return 0;
-  }
-
   void RenderPage::ParseJsonTime(const long long &time) {
     if (mWXCorePerformance != nullptr)
       mWXCorePerformance->parseJsonTime += time;
   }
 
-  long long RenderPage::GetFirstScreenParseJsonTime() {
-if (mWXCorePerformance != nullptr)
-      return mWXCorePerformance->firstScreenParseJsonTime;
-    return 0;
-  }
-
-  long long RenderPage::GetOnRenderSuccessParseJsonTime() {
-    if (mWXCorePerformance != nullptr)
-      return mWXCorePerformance->onRenderSuccessParseJsonTime;
-    return 0;
-  }
-
   void RenderPage::CallBridgeTime(const long long &time) {
     if (mWXCorePerformance != nullptr)
       mWXCorePerformance->callBridgeTime += time;
   }
 
-  long long RenderPage::GetFirstScreenCallBridgeTime() {
-    if (mWXCorePerformance != nullptr)
-      return mWXCorePerformance->firstScreenCallBridgeTime;
-    return 0;
-  }
-
-  long long RenderPage::GetOnRenderSuccessCallBridgeTime() {
-    if (mWXCorePerformance != nullptr)
-      return mWXCorePerformance->onRenderSuccessCallBridgeTime;
-    return 0;
-  }
-
   std::vector<long> RenderPage::PrintFirstScreenLog() {
     std::vector<long> ret;
     if (mWXCorePerformance != nullptr)

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/02d9983e/weex_core/Source/core/render/page/render_page.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/page/render_page.h b/weex_core/Source/core/render/page/render_page.h
index 6a52b11..4a96a87 100644
--- a/weex_core/Source/core/render/page/render_page.h
+++ b/weex_core/Source/core/render/page/render_page.h
@@ -24,6 +24,7 @@
 #include <map>
 #include <jni.h>
 #include <cmath>
+#include <atomic>
 
 namespace WeexCore {
 
@@ -104,22 +105,10 @@ namespace WeexCore {
 
     void CssLayoutTime(const long long &time);
 
-    long long GetFirstScreenCssLayoutTime();
-
-    long long GetOnRenderSuccessCssLayoutTime();
-
     void ParseJsonTime(const long long &time);
 
-    long long GetFirstScreenParseJsonTime();
-
-    long long GetOnRenderSuccessParseJsonTime();
-
     void CallBridgeTime(const long long &time);
 
-    long long GetFirstScreenCallBridgeTime();
-
-    long long GetOnRenderSuccessCallBridgeTime();
-
     std::vector<long> PrintFirstScreenLog();
 
     std::vector<long> PrintRenderSuccessLog();



[5/5] incubator-weex git commit: * [core] Fix compile error.

Posted by ky...@apache.org.
* [core] Fix compile error.


Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/97da4cb7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/97da4cb7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/97da4cb7

Branch: refs/heads/master
Commit: 97da4cb710f4fc3d9de2f14000b88f495ad58a84
Parents: 02d9983
Author: miomin <69...@qq.com>
Authored: Wed May 16 19:36:41 2018 +0800
Committer: miomin <69...@qq.com>
Committed: Wed May 16 19:36:41 2018 +0800

----------------------------------------------------------------------
 weex_core/Source/android/bridge/impl/bridge_impl_android.cpp     | 2 --
 .../bridge/impl/native_render_object_utils_impl_android.cpp      | 4 ----
 .../Source/core/render/action/render_action_add_element.cpp      | 2 --
 3 files changed, 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/97da4cb7/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp b/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp
index d46dd0d..be72c92 100644
--- a/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp
+++ b/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp
@@ -593,8 +593,6 @@ namespace WeexCore {
     env->DeleteLocalRef(jPaddings);
     env->DeleteLocalRef(jBorders);
 
-    if (page != nullptr)
-      page->CallBridgeTime(getCurrentTime() - startTime);
     return flag;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/97da4cb7/weex_core/Source/android/bridge/impl/native_render_object_utils_impl_android.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/bridge/impl/native_render_object_utils_impl_android.cpp b/weex_core/Source/android/bridge/impl/native_render_object_utils_impl_android.cpp
index 6d43347..f56ee1f 100644
--- a/weex_core/Source/android/bridge/impl/native_render_object_utils_impl_android.cpp
+++ b/weex_core/Source/android/bridge/impl/native_render_object_utils_impl_android.cpp
@@ -95,10 +95,6 @@ static jlong CopyRenderObject(JNIEnv* env, jclass jcaller, jlong ptr){
 }
 
 static  void showRenderObjectLayout(RenderObject *renderObject, int level){
-   LOGE("RenderObject", "layout %s %d %p %f %f %f %f ",  renderObject->Type().c_str(),
-                        renderObject->getStypePositionType(),
-                        renderObject, renderObject->getLayoutHeight(), renderObject->getLayoutWidth(),
-    renderObject->getLayoutPositionLeft(), renderObject->getLayoutPositionRight());
     for(auto it = renderObject->ChildListIterBegin(); it != renderObject->ChildListIterEnd(); it++){
         RenderObject* child = static_cast<RenderObject*>(*it);
         showRenderObjectLayout(child, level + 1);

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/97da4cb7/weex_core/Source/core/render/action/render_action_add_element.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/core/render/action/render_action_add_element.cpp b/weex_core/Source/core/render/action/render_action_add_element.cpp
index 0ca77b6..8be0efb 100644
--- a/weex_core/Source/core/render/action/render_action_add_element.cpp
+++ b/weex_core/Source/core/render/action/render_action_add_element.cpp
@@ -40,7 +40,5 @@ namespace WeexCore {
     Bridge_Impl_Android::getInstance()->callAddElement(mPageId.c_str(), mComponentType.c_str(), mRef.c_str(),
                                                        mIndex, mParentRef.c_str(), mStyles, mAttributes,
                                                        mEvents, mMargins, mPaddings, mBorders, mWillLayout);
-    page->JniCallTime(getCurrentTime() - startTime);
-    page->AddElementActionJNITime(getCurrentTime() - startTime);
   }
 }