我把我的应用升级 Vue3 后,变慢了 50% - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Cbdy

我把我的应用升级 Vue3 后,变慢了 50%

  •  
  •   Cbdy Jan 21, 2022 5644 views
    This topic created in 1558 days ago, the information mentioned may be changed or developed.

    源码: https://github.com/alchemy-works/game-of-life


    说明 Proxy 确实比 Object.defineProperty 慢不少啊

    Supplement 1    Jan 22, 2022

    原始版本

    https://github.com/alchemy-works/game-of-life/tree/4819a1ba73b13c5763b4dbaa56139d234bae3b74


    昨天看到说Vue3要转正了,而且兼容Vue2的写法,所以替换了一下Runtime发现了这个问题

    Supplement 2    Jan 22, 2022
    我写了个 React 的版本(几乎一样的代码逻辑),弄了个 Index ,然后把 Vue3 的性能问题用 shallowReactive 修了一下

    https://alchemy-works.github.io/game-of-life/
    11 replies    2022-01-25 14:49:18 +08:00
    7anshuai
        1
    7anshuai  
       Jan 21, 2022
    页面渲染肉眼可见的慢了啊
    noe132
        2
    noe132  
       Jan 22, 2022   4
    你应该使用 shallowReactive 。从图上可以看出 getNextGridData 中间接调用了 vue3 reactivity 的 get 方法,导致这个单独方法调用占用了每帧大约 75%的时间。

    https://github.com/alchemy-works/game-of-life/blob/4819a1ba73b13c5763b4dbaa56139d234bae3b74/www/src_vue3/App.js#L17

    这一行把 reactive 换成 shallowReactive ,我这里 chrome 6x slowdown ,1 秒时间,vue2 渲染了大概 10 帧,vue3 大概渲染了 12 帧,可以看出 vue3 有略微的性能提升
    Cbdy
        3
    Cbdy  
    OP
       Jan 22, 2022 via Android
    @noe132 谢谢,我不知道这个 API ,我等等去看看

    另外,vue3 legcy 中,我单纯替换了 runtime 为 vue3 ,结果性能下降了,是不是说明如果要在 vue3 中取得性能改善,必须使用 vue3 的 composition api 并选择正确的 api ?
    Cbdy
        4
    Cbdy  
    OP
       Jan 22, 2022 via Android
    我查了一下,原来 vue3 的 reactive 会拦截深层对象的 get 和 set ,而 vue2 的 data 不会,那确实要做一些改造才能避免性能问题
    4196
        5
    4196  
       Jan 22, 2022
    受 2L 启发,你这种写法在 React hooks 里面性能更加‘爆炸’
    illuz
        6
    illuz  
       Jan 22, 2022   4
    @Cbdy 试试在将参数传给 getNextGridData 时,用 toRaw 方法把 Proxy 层拨掉:
    state.gridData = getNextGridData(toRaw(state.gridData))

    也就是如果是 someReactive = handle(someReactive) 这种调用时,最好都用 toRaw 来提升性能
    Cbdy
        7
    Cbdy  
    OP
       Jan 22, 2022
    @4196 2L 说时间花在 get 上,那 React 应该不会有这个问题,我等等写个看看
    longxi
        8
    longxi  
       Jan 22, 2022
    @Cbdy vue2 的 data 也会拦截深层对象的 get 和 set ,这个应该是 Proxy 的性能问题,shallowReactive 只代理了一层,避免了性能下降,参见:
    https://www.zhihu.com/question/460330154https://www.cnblogs.com/zmj97/p/10954968.html
    Cbdy
        9
    Cbdy  
    OP
       Jan 22, 2022
    @longxi 看了迷渡的回答,“只是优化了对象的访问,性能提升了 27% 到 438%,但是没有优化数组。”,那倒确实有可能

    我 Vue 用得少,而且每次都是替换顶层属性,所以没有注意这个问题
    jones2000
        10
    jones2000  
       Jan 22, 2022
    直接 DOM 修改, 不用 data 不就行了。
    KouShuiYu
        11
    KouShuiYu  
       Jan 25, 2022
    react 不清楚,但是直接用 template 发挥不了 vue 的性能优势啊,还要在浏览器中编译后才能运行
    About     Help     Advertise     Blog     API     FAQ     Solana     3360 Online   Highest 6679       Select Language
    创工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 43ms UTC 12:53 PVG 20:53 LAX 05:53 JFK 08:53
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86