computed.bench.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. import { bench, describe } from 'vitest'
  2. import type { ComputedRef, Ref } from '../src'
  3. import { computed, effect, ref } from '../dist/reactivity.esm-browser.prod'
  4. declare module '../dist/reactivity.esm-browser.prod' {
  5. function computed(...args: any[]): any
  6. }
  7. describe('computed', () => {
  8. bench('create computed', () => {
  9. computed(() => 100)
  10. })
  11. {
  12. const v = ref(100)
  13. computed(() => v.value * 2)
  14. let i = 0
  15. bench("write ref, don't read computed (without effect)", () => {
  16. v.value = i++
  17. })
  18. }
  19. {
  20. const v = ref(100)
  21. const c = computed(() => {
  22. return v.value * 2
  23. })
  24. effect(() => c.value)
  25. let i = 0
  26. bench("write ref, don't read computed (with effect)", () => {
  27. v.value = i++
  28. })
  29. }
  30. {
  31. const v = ref(100)
  32. const c = computed(() => {
  33. return v.value * 2
  34. })
  35. let i = 0
  36. bench('write ref, read computed (without effect)', () => {
  37. v.value = i++
  38. c.value
  39. })
  40. }
  41. {
  42. const v = ref(100)
  43. const c = computed(() => {
  44. return v.value * 2
  45. })
  46. effect(() => c.value)
  47. let i = 0
  48. bench('write ref, read computed (with effect)', () => {
  49. v.value = i++
  50. c.value
  51. })
  52. }
  53. {
  54. const v = ref(100)
  55. const computeds: ComputedRef<number>[] = []
  56. for (let i = 0, n = 1000; i < n; i++) {
  57. const c = computed(() => {
  58. return v.value * 2
  59. })
  60. computeds.push(c)
  61. }
  62. let i = 0
  63. bench("write ref, don't read 1000 computeds (without effect)", () => {
  64. v.value = i++
  65. })
  66. }
  67. {
  68. const v = ref(100)
  69. const computeds: ComputedRef<number>[] = []
  70. for (let i = 0, n = 1000; i < n; i++) {
  71. const c = computed(() => {
  72. return v.value * 2
  73. })
  74. effect(() => c.value)
  75. computeds.push(c)
  76. }
  77. let i = 0
  78. bench(
  79. "write ref, don't read 1000 computeds (with multiple effects)",
  80. () => {
  81. v.value = i++
  82. },
  83. )
  84. }
  85. {
  86. const v = ref(100)
  87. const computeds: ComputedRef<number>[] = []
  88. for (let i = 0, n = 1000; i < n; i++) {
  89. const c = computed(() => {
  90. return v.value * 2
  91. })
  92. computeds.push(c)
  93. }
  94. effect(() => {
  95. for (let i = 0; i < 1000; i++) {
  96. computeds[i].value
  97. }
  98. })
  99. let i = 0
  100. bench("write ref, don't read 1000 computeds (with single effect)", () => {
  101. v.value = i++
  102. })
  103. }
  104. {
  105. const v = ref(100)
  106. const computeds: ComputedRef<number>[] = []
  107. for (let i = 0, n = 1000; i < n; i++) {
  108. const c = computed(() => {
  109. return v.value * 2
  110. })
  111. computeds.push(c)
  112. }
  113. let i = 0
  114. bench('write ref, read 1000 computeds (no effect)', () => {
  115. v.value = i++
  116. computeds.forEach(c => c.value)
  117. })
  118. }
  119. {
  120. const v = ref(100)
  121. const computeds: ComputedRef<number>[] = []
  122. for (let i = 0, n = 1000; i < n; i++) {
  123. const c = computed(() => {
  124. return v.value * 2
  125. })
  126. effect(() => c.value)
  127. computeds.push(c)
  128. }
  129. let i = 0
  130. bench('write ref, read 1000 computeds (with multiple effects)', () => {
  131. v.value = i++
  132. computeds.forEach(c => c.value)
  133. })
  134. }
  135. {
  136. const v = ref(100)
  137. const computeds: ComputedRef<number>[] = []
  138. for (let i = 0, n = 1000; i < n; i++) {
  139. const c = computed(() => {
  140. return v.value * 2
  141. })
  142. effect(() => c.value)
  143. computeds.push(c)
  144. }
  145. effect(() => {
  146. for (let i = 0; i < 1000; i++) {
  147. computeds[i].value
  148. }
  149. })
  150. let i = 0
  151. bench('write ref, read 1000 computeds (with single effect)', () => {
  152. v.value = i++
  153. computeds.forEach(c => c.value)
  154. })
  155. }
  156. {
  157. const refs: Ref<number>[] = []
  158. for (let i = 0, n = 1000; i < n; i++) {
  159. refs.push(ref(i))
  160. }
  161. const c = computed(() => {
  162. let total = 0
  163. refs.forEach(ref => (total += ref.value))
  164. return total
  165. })
  166. let i = 0
  167. const n = refs.length
  168. bench('1000 refs, read 1 computed (without effect)', () => {
  169. refs[i++ % n].value++
  170. c.value
  171. })
  172. }
  173. {
  174. const refs: Ref<number>[] = []
  175. for (let i = 0, n = 1000; i < n; i++) {
  176. refs.push(ref(i))
  177. }
  178. const c = computed(() => {
  179. let total = 0
  180. refs.forEach(ref => (total += ref.value))
  181. return total
  182. })
  183. effect(() => c.value)
  184. let i = 0
  185. const n = refs.length
  186. bench('1000 refs, read 1 computed (with effect)', () => {
  187. refs[i++ % n].value++
  188. c.value
  189. })
  190. }
  191. })