-
Notifications
You must be signed in to change notification settings - Fork 3.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
关于 $digest
性能优化的一点建议
#1090
Comments
另外对第 1 点 |
非常感谢对WePY的深入研究,但1.x版本目前只计划做一些必要的bug修复,至于优化和增加还是交给大家来做吧。 |
@ystarlongzi 我擦哥们你写得这么详尽,佩服啊 |
@ystarlongzi 插个嘴,onShow时$apply的需求我之前在没有使用wepy-redux时遇到了,A,B两个页面共享同一个数据,如果从A跳到B,在B中变更了共享的数据后返回A,此时A的onShow中如果不$apply页面就不会同步了 |
@Gcaufy |
@cuijiemmx |
@ystarlongzi 我准备转mpVue了,可能可以解决遇到的大部分问题... |
😂😂😂 还是用亲儿子好,如果 mpVue 是 KPI 产物就哭了,等 wepy 2.0 发布后,应该会好很多 |
@ystarlongzi 我在想那头会不会也是一堆坑等着我,伤不起啊 |
@Gcaufy 小程序组件化框架 WePY 在性能调优上做出的探究 作者是你嘛? 如果是你,文章里关于小程序 |
@Gcaufy @cuijiemmx 实际上,wepy 在数据脏检测上没有性能问题我这里上拉加载 15 * 10 = 150 条数据,不管是纯 js 对象,还是 Immutable 数据对象,【深比较】都没啥性能问题。 我这里碰的性能问题,最终定位到是由于 |
@ystarlongzi 性能问题还是有的吧,毕竟是深比较,可能纯js对象数据结构不够深不够复杂? |
我这里深度只有 3,随着数据量的增加,发现性能变化并不大 |
我这里碰到的性能是 |
@ystarlongzi this.setData()被封装在wepy里面了,所以你最后还是改的框架? |
嗯嗯,我本地修改后,然后 debug 调试,对比了下 |
在数据量较多的情况下,深度对比是非常损耗性能的,在手机上,会产生明显的卡顿。已经在项目中验证了。其实wepy采用了类似angularjs 1的脏检查机制,效率并不高。阅读wepy 2.0部分代码后,发现这方面确实有改善,期望2.0能尽快发布。 |
@lingxuan630 我这里碰到的性能是因为 Immutable 数据导致的,脏检测对性能影响并不大 |
@ystarlongzi 作者是我,那篇文章中setData 的代码是通过查看和调试 WAService.js 的代码得出的结论。我也没有权限拿到非压缩的代码,也只是对着压缩混淆后的代码阅读的。 如果这样问题上还有更好的想法可以随时跟我沟通 |
也遇到这个问题,畏怯还必须解决,大佬们最后如何优化? |
@ystarlongzi Immutable 数据导致的这部分代码是在wepy里面的吗?我也遇到这个问题,还没有解决 |
@Slngle 升级下这两个库试一下
|
在使用 wepy 开发时,目前感觉性能瓶颈在以下两个点比较突出:
1.
$apply
触发过于频繁关于这点,比如会在
onUnload
、onPageScroll
时触发$apply
,之前有 issue#1022 提到过并已修复wepy/packages/wepy/src/base.js
Line 14 in 934f41f
上面的代码是可能会触发
$apply
的一些生命周期,可以看到,wepy 默认还会对除了onUnload
、onPageScroll
之外这些生命周期后执行$apply
,这样确实方便了开发,但在某些场景下,比如:onHide
onShow
onShareAppMessage
上面的场景中,「列表页」的数据并可能并没有发生变化,但也会触发
$apply
,对性能就会一定的影响,尤其是列表数据比较多时。但如果开发者能知道当前页面数据并没有发生变化,其实是可以通过一些手段,避免 wepy 进入
$digest
,提高页面性能。比如尝试使用以下方法:这利用了 wepy 会根据
this.$$phase
的值决定是否进入$digest
,相关代码如下:wepy/packages/wepy/src/component.js
Lines 497 to 508 in 34d6a12
2.
$digest
数据量大时,「脏检测」比较耗性能============== 2018年03月19日15:47:20 更正 ✏️==============================
⚠️ ⚠️ 实际上,wepy 在数据脏检测上没有性能问题。下面的分析过程有问题,性能原因见评论
==================== ================================================
在
$digest
时,wepy 为了能找出新旧数据的差异,会对数据进行【深比较】,然后在比较完成后,还会对数据进行【深拷贝】,当数据量比较多时,这两个过程都是比较耗性能的点。============== 2018年03月17日12:29:56 更正 ✏️==============
【深拷贝】对性能影响很小,这里描述不对,具体见下面评论
====================== ===============================
但在某些场景下,可以从其它角度优化这个过程,比如:
由于在我们项目里使用了 Immutable,所以,根据方案 1,我在本地对
$digest
代码做了调整,简单的在【深比较】前(代码位置)添加了对 Immutable 数据类型的判断,相关代码如下:这样优化后,当无限滚动列表加载 10 页左右后,列表数据量大致在 (15 * 10 = 150) 条时,对比效果非常明显,即使列表在加载 20页、30页,页面也明显的飞快🚀🚀,如下:
所以,我觉得
wepy
在【深比较】和【深拷贝】时,是否可以加上对 Immutable 数据类型的判断,如果是 Immutable 数据类型,只做浅比较和浅拷贝即可The text was updated successfully, but these errors were encountered: