From 93c5449094b7691a476ba3a258f2d4e64935fe22 Mon Sep 17 00:00:00 2001 From: George Fogle Date: Mon, 27 Jul 2015 22:24:34 -0400 Subject: [PATCH 1/7] hijack lifecycles in ReactClass to perf measure --- src/isomorphic/classic/class/ReactClass.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/isomorphic/classic/class/ReactClass.js b/src/isomorphic/classic/class/ReactClass.js index 74c25242a66..7b264c7feae 100644 --- a/src/isomorphic/classic/class/ReactClass.js +++ b/src/isomorphic/classic/class/ReactClass.js @@ -27,6 +27,8 @@ var warning = require('warning'); var MIXINS_KEY = keyOf({mixins: null}); +var ReactPerf = require('ReactPerf'); + /** * Policies that describe methods in `ReactClassInterface`. */ @@ -901,6 +903,16 @@ var ReactClass = { if (!Constructor.prototype[methodName]) { Constructor.prototype[methodName] = null; } + else { + if (__DEV__) { + // hijack the supplied method and wrap it with Perf + Constructor.prototype[methodName] = ReactPerf.measure( + 'ReactClass', + methodName, + Constructor.prototype[methodName] + ); + } + } } return Constructor; From 492f1a4ee79f5aa154a75fc9935cc3aaa52a8ad0 Mon Sep 17 00:00:00 2001 From: George Fogle Date: Mon, 27 Jul 2015 23:48:35 -0400 Subject: [PATCH 2/7] add metrics to default perf for lifecycle --- src/test/ReactDefaultPerf.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/test/ReactDefaultPerf.js b/src/test/ReactDefaultPerf.js index 8b473a25e18..612d9f0a5ad 100644 --- a/src/test/ReactDefaultPerf.js +++ b/src/test/ReactDefaultPerf.js @@ -142,6 +142,7 @@ var ReactDefaultPerf = { var rv; var start; + // TODO: nested ifs hard to read. split into functions? if (fnName === '_renderNewRootComponent' || fnName === 'flushBatchedUpdates') { // A "measurement" is a set of metrics recorded for each flush. We want @@ -152,6 +153,7 @@ var ReactDefaultPerf = { exclusive: {}, inclusive: {}, render: {}, + lifecycle: {}, counts: {}, writes: {}, displayNames: {}, @@ -254,6 +256,12 @@ var ReactDefaultPerf = { }; return rv; + } else if (moduleName === 'ReactClass') { + + var rootNodeID = args[0]; + var count = entry.lifecycle[fnName].count ? entry.lifecycle[fnName] : 1; + + addValue(entry.lifecycle[fnName], rootNodeID, count); } else { return func.apply(this, args); } From fca37e180e2190f202860347ccab53fd12b9c176 Mon Sep 17 00:00:00 2001 From: George Fogle Date: Mon, 27 Jul 2015 23:58:15 -0400 Subject: [PATCH 3/7] seed default per test file --- src/test/__tests__/ReactDefaultPerf-test.js | 27 +++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/test/__tests__/ReactDefaultPerf-test.js diff --git a/src/test/__tests__/ReactDefaultPerf-test.js b/src/test/__tests__/ReactDefaultPerf-test.js new file mode 100644 index 00000000000..a48e2ad29ee --- /dev/null +++ b/src/test/__tests__/ReactDefaultPerf-test.js @@ -0,0 +1,27 @@ +/** + * Copyright 2013-2015, 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. + * + * @emails react-core + */ + +'use strict'; + +var React; +var ReactDefaultPerf; + +var mocks; + +describe('ReactDefaultPerf', function() { + + beforeEach(function () { + mocks = require('mocks'); + + React = require('React'); + ReactDefaultPerf = require('ReactDefaultPerf'); + }); +}); \ No newline at end of file From 3136e200477f07809973be047b271067ce3c579f Mon Sep 17 00:00:00 2001 From: George Fogle Date: Thu, 30 Jul 2015 09:06:00 -0400 Subject: [PATCH 4/7] slim PR to just ReactClass --- src/test/__tests__/ReactDefaultPerf-test.js | 27 --------------------- 1 file changed, 27 deletions(-) delete mode 100644 src/test/__tests__/ReactDefaultPerf-test.js diff --git a/src/test/__tests__/ReactDefaultPerf-test.js b/src/test/__tests__/ReactDefaultPerf-test.js deleted file mode 100644 index a48e2ad29ee..00000000000 --- a/src/test/__tests__/ReactDefaultPerf-test.js +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright 2013-2015, 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. - * - * @emails react-core - */ - -'use strict'; - -var React; -var ReactDefaultPerf; - -var mocks; - -describe('ReactDefaultPerf', function() { - - beforeEach(function () { - mocks = require('mocks'); - - React = require('React'); - ReactDefaultPerf = require('ReactDefaultPerf'); - }); -}); \ No newline at end of file From 21001bca89fcf8c095f0b4f73180788320b2c277 Mon Sep 17 00:00:00 2001 From: George Fogle Date: Sat, 1 Aug 2015 00:26:05 -0400 Subject: [PATCH 5/7] fix where lifecycle events get reattached --- src/isomorphic/classic/class/ReactClass.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/isomorphic/classic/class/ReactClass.js b/src/isomorphic/classic/class/ReactClass.js index 7b264c7feae..ea20a127e9e 100644 --- a/src/isomorphic/classic/class/ReactClass.js +++ b/src/isomorphic/classic/class/ReactClass.js @@ -905,11 +905,12 @@ var ReactClass = { } else { if (__DEV__) { - // hijack the supplied method and wrap it with Perf - Constructor.prototype[methodName] = ReactPerf.measure( - 'ReactClass', + // spec is the user-defined component + // hijack the defined lifecycle methods and wrap with Perf + spec[methodName] = ReactPerf.measure( + spec.displayName, methodName, - Constructor.prototype[methodName] + spec[methodName] ); } } From 2f37b4f83cfe1c320d628d7d7a15fa9d7eaa382a Mon Sep 17 00:00:00 2001 From: George Fogle Date: Sat, 1 Aug 2015 00:32:03 -0400 Subject: [PATCH 6/7] kill old updates to default perf --- src/test/ReactDefaultPerf.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/test/ReactDefaultPerf.js b/src/test/ReactDefaultPerf.js index 612d9f0a5ad..8b473a25e18 100644 --- a/src/test/ReactDefaultPerf.js +++ b/src/test/ReactDefaultPerf.js @@ -142,7 +142,6 @@ var ReactDefaultPerf = { var rv; var start; - // TODO: nested ifs hard to read. split into functions? if (fnName === '_renderNewRootComponent' || fnName === 'flushBatchedUpdates') { // A "measurement" is a set of metrics recorded for each flush. We want @@ -153,7 +152,6 @@ var ReactDefaultPerf = { exclusive: {}, inclusive: {}, render: {}, - lifecycle: {}, counts: {}, writes: {}, displayNames: {}, @@ -256,12 +254,6 @@ var ReactDefaultPerf = { }; return rv; - } else if (moduleName === 'ReactClass') { - - var rootNodeID = args[0]; - var count = entry.lifecycle[fnName].count ? entry.lifecycle[fnName] : 1; - - addValue(entry.lifecycle[fnName], rootNodeID, count); } else { return func.apply(this, args); } From 6e1448d068552258376bf1bfb95d2bda6ab7cb86 Mon Sep 17 00:00:00 2001 From: George Fogle Date: Sat, 1 Aug 2015 00:36:20 -0400 Subject: [PATCH 7/7] lint errors from no internal plugin --- src/isomorphic/classic/class/ReactClass.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/isomorphic/classic/class/ReactClass.js b/src/isomorphic/classic/class/ReactClass.js index ea20a127e9e..4710160765c 100644 --- a/src/isomorphic/classic/class/ReactClass.js +++ b/src/isomorphic/classic/class/ReactClass.js @@ -902,8 +902,7 @@ var ReactClass = { for (var methodName in ReactClassInterface) { if (!Constructor.prototype[methodName]) { Constructor.prototype[methodName] = null; - } - else { + } else { if (__DEV__) { // spec is the user-defined component // hijack the defined lifecycle methods and wrap with Perf