diff --git a/Libraries/ReactNative/ReactNativeBaseComponent.js b/Libraries/ReactNative/ReactNativeBaseComponent.js index 844923a2b..92896127b 100644 --- a/Libraries/ReactNative/ReactNativeBaseComponent.js +++ b/Libraries/ReactNative/ReactNativeBaseComponent.js @@ -35,6 +35,8 @@ type ReactNativeBaseComponentViewConfig = { uiViewClassName: string; } +// require('UIManagerStatTracker').install(); // uncomment to enable + /** * @constructor ReactNativeBaseComponent * @extends ReactComponent diff --git a/Libraries/ReactNative/UIManagerStatTracker.js b/Libraries/ReactNative/UIManagerStatTracker.js new file mode 100644 index 000000000..ef9c64b2b --- /dev/null +++ b/Libraries/ReactNative/UIManagerStatTracker.js @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule UIManagerStatTracker + * @flow + */ +'use strict'; + +var RCTUIManager = require('NativeModules').UIManager; + +var installed = false; +var UIManagerStatTracker = { + install: function() { + if (installed) { + return; + } + installed = true; + var statLogHandle; + var stats = {}; + function printStats() { + console.log({UIManagerStatTracker: stats}); + statLogHandle = null; + } + function incStat(key: string, increment: number) { + stats[key] = (stats[key] || 0) + increment; + if (!statLogHandle) { + statLogHandle = setImmediate(printStats); + } + } + var createViewOrig = RCTUIManager.createView; + RCTUIManager.createView = function(tag, className, rootTag, props) { + incStat('createView', 1); + incStat('setProp', Object.keys(props || []).length); + createViewOrig(tag, className, rootTag, props); + }; + var updateViewOrig = RCTUIManager.updateView; + RCTUIManager.updateView = function(tag, className, props) { + incStat('updateView', 1); + incStat('setProp', Object.keys(props || []).length); + updateViewOrig(tag, className, props); + }; + var manageChildrenOrig = RCTUIManager.manageChildren; + RCTUIManager.manageChildren = function(tag, moveFrom, moveTo, addTags, addIndices, remove) { + incStat('manageChildren', 1); + incStat('move', Object.keys(moveFrom || []).length); + incStat('remove', Object.keys(remove || []).length); + manageChildrenOrig(tag, moveFrom, moveTo, addTags, addIndices, remove); + }; + }, +}; + +module.exports = UIManagerStatTracker;