File tree 1 file changed +50
-0
lines changed
packages/reactivity/__tests__
1 file changed +50
-0
lines changed Original file line number Diff line number Diff line change @@ -1057,4 +1057,54 @@ describe('reactivity/computed', () => {
1057
1057
obj . flag = 1
1058
1058
expect ( foo ) . toBe ( 2 )
1059
1059
} )
1060
+
1061
+ // #11928
1062
+ test ( 'should not lead to exponential perf cost with deeply chained computed' , ( ) => {
1063
+ const start = {
1064
+ prop1 : shallowRef ( 1 ) ,
1065
+ prop2 : shallowRef ( 2 ) ,
1066
+ prop3 : shallowRef ( 3 ) ,
1067
+ prop4 : shallowRef ( 4 ) ,
1068
+ }
1069
+
1070
+ let layer = start
1071
+
1072
+ const LAYERS = 1000
1073
+
1074
+ for ( let i = LAYERS ; i > 0 ; i -- ) {
1075
+ const m = layer
1076
+ const s = {
1077
+ prop1 : computed ( ( ) => m . prop2 . value ) ,
1078
+ prop2 : computed ( ( ) => m . prop1 . value - m . prop3 . value ) ,
1079
+ prop3 : computed ( ( ) => m . prop2 . value + m . prop4 . value ) ,
1080
+ prop4 : computed ( ( ) => m . prop3 . value ) ,
1081
+ }
1082
+ effect ( ( ) => s . prop1 . value )
1083
+ effect ( ( ) => s . prop2 . value )
1084
+ effect ( ( ) => s . prop3 . value )
1085
+ effect ( ( ) => s . prop4 . value )
1086
+
1087
+ s . prop1 . value
1088
+ s . prop2 . value
1089
+ s . prop3 . value
1090
+ s . prop4 . value
1091
+
1092
+ layer = s
1093
+ }
1094
+
1095
+ const t = performance . now ( )
1096
+ start . prop1 . value = 4
1097
+ start . prop2 . value = 3
1098
+ start . prop3 . value = 2
1099
+ start . prop4 . value = 1
1100
+ expect ( performance . now ( ) - t ) . toBeLessThan ( process . env . CI ? 100 : 30 )
1101
+
1102
+ const end = layer
1103
+ expect ( [
1104
+ end . prop1 . value ,
1105
+ end . prop2 . value ,
1106
+ end . prop3 . value ,
1107
+ end . prop4 . value ,
1108
+ ] ) . toMatchObject ( [ - 2 , - 4 , 2 , 3 ] )
1109
+ } )
1060
1110
} )
You can’t perform that action at this time.
0 commit comments