Chrome 中的 React 性能分析
React Performance Profilng in Chrome
我在使用 ag-grid-react 的 SPA React (15.6) 应用程序上使用 Chrome 开发人员工具进行一些性能分析,我在协调分析器与现实。例如,在下面的屏幕截图中,连接的抽屉组件的 (Connect(Drawer),橙色条) "componentWillReceiveProps" 方法似乎花费了 ~2s,但下面什么也没有。在查看方法本身可能花费那么长时间的代码后,我持怀疑态度,因此我在函数内的所有代码周围添加了一些 'console.time' 语句,然后看:
Drawer componentWillReceiveProps: 0.02001953125ms
下面是我的 componentWillReceiveProps 的样子,供参考:
componentWillReceiveProps(nextProps) {
console.time('Drawer componentWillReceiveProps');
if (nextProps.changes.length !== this.props.changes.length &&
nextProps.changes.length === 0 &&
this.state.isDiscarding) {
this.setState({isDiscarding: false});
}
console.timeEnd('Drawer componentWillReceiveProps');
}
那么我在这里错过了什么?我(有点)明白用户计时 api 只显示标记的东西(我今天才知道这个,所以我对 api 的理解至少可以说是有限的.. .),那么 React 是否真的没有为 componentWillReceiveProps 内部发生的事情计时?如果它有用,我正在使用 re-select 和 Redux,但我会假设我的 select 或者在调用 componentWillReceiveProps 之前已经 运行,但也许我错了那个?
无论如何,我认为关于 Chrome 火焰图有一些我不了解的基本知识,但我已经阅读了很多文章,但它对我来说并没有加起来。
更新:添加了 componentWillReceiveProps 实现
更新 2:将 link 添加到 Chrome 配置文件
如果有人有兴趣查看这里的实际配置文件 link,您可以通过打开 Chrome 开发工具,转到性能选项卡,然后单击 "load profile":
https://www.dropbox.com/s/72e9kwyxr0myec3/delete_react_perf_user_timing?dl=0
更新三:componentWillReceiveProps说明
好的,看来 componentWillReceiveProps 确实(以某种方式)最终调用了 mapStateToProps,这可以解释为什么它看起来在配置文件中花费了这么长时间。 我猜测 componentWillReceiveProps 调用被 redux connect 方法或类似的东西取代以完成它的事情,但我还没有验证 看到已接受答案。 无论如何,您可以在以下屏幕截图中看到这一点的证据:
如果你仔细查看火焰图,是 Connect(Drawer).componentWillReceiveProps
调用花费了很长时间,而不是 Drawer 组件本身,这解释了为什么我的计时代码Drawer 组件内部显示的时间与火焰图完全不同。 Connect(Drawer)
组件是一个高阶组件,其全部目的是调用 mapStateToProps 和 mapDispatchToProps 以将状态和动作创建者映射到组件上的道具。在这种情况下,我的 mapStateToProps
调用非常慢,这解释了图中的结果。
附带说明一下,如果 react-redux 添加用户计时 API 以便 mapStateToProps 调用等会显示在火焰图中,那就太好了。
TL;DR 密切注意火焰图中的实际组件名称。
我在使用 ag-grid-react 的 SPA React (15.6) 应用程序上使用 Chrome 开发人员工具进行一些性能分析,我在协调分析器与现实。例如,在下面的屏幕截图中,连接的抽屉组件的 (Connect(Drawer),橙色条) "componentWillReceiveProps" 方法似乎花费了 ~2s,但下面什么也没有。在查看方法本身可能花费那么长时间的代码后,我持怀疑态度,因此我在函数内的所有代码周围添加了一些 'console.time' 语句,然后看:
Drawer componentWillReceiveProps: 0.02001953125ms
下面是我的 componentWillReceiveProps 的样子,供参考:
componentWillReceiveProps(nextProps) {
console.time('Drawer componentWillReceiveProps');
if (nextProps.changes.length !== this.props.changes.length &&
nextProps.changes.length === 0 &&
this.state.isDiscarding) {
this.setState({isDiscarding: false});
}
console.timeEnd('Drawer componentWillReceiveProps');
}
那么我在这里错过了什么?我(有点)明白用户计时 api 只显示标记的东西(我今天才知道这个,所以我对 api 的理解至少可以说是有限的.. .),那么 React 是否真的没有为 componentWillReceiveProps 内部发生的事情计时?如果它有用,我正在使用 re-select 和 Redux,但我会假设我的 select 或者在调用 componentWillReceiveProps 之前已经 运行,但也许我错了那个?
无论如何,我认为关于 Chrome 火焰图有一些我不了解的基本知识,但我已经阅读了很多文章,但它对我来说并没有加起来。
更新:添加了 componentWillReceiveProps 实现
更新 2:将 link 添加到 Chrome 配置文件
如果有人有兴趣查看这里的实际配置文件 link,您可以通过打开 Chrome 开发工具,转到性能选项卡,然后单击 "load profile":
https://www.dropbox.com/s/72e9kwyxr0myec3/delete_react_perf_user_timing?dl=0
更新三:componentWillReceiveProps说明
好的,看来 componentWillReceiveProps 确实(以某种方式)最终调用了 mapStateToProps,这可以解释为什么它看起来在配置文件中花费了这么长时间。 我猜测 componentWillReceiveProps 调用被 redux connect 方法或类似的东西取代以完成它的事情,但我还没有验证 看到已接受答案。 无论如何,您可以在以下屏幕截图中看到这一点的证据:
如果你仔细查看火焰图,是 Connect(Drawer).componentWillReceiveProps
调用花费了很长时间,而不是 Drawer 组件本身,这解释了为什么我的计时代码Drawer 组件内部显示的时间与火焰图完全不同。 Connect(Drawer)
组件是一个高阶组件,其全部目的是调用 mapStateToProps 和 mapDispatchToProps 以将状态和动作创建者映射到组件上的道具。在这种情况下,我的 mapStateToProps
调用非常慢,这解释了图中的结果。
附带说明一下,如果 react-redux 添加用户计时 API 以便 mapStateToProps 调用等会显示在火焰图中,那就太好了。
TL;DR 密切注意火焰图中的实际组件名称。