2
0

reactiveMap.bench.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import { bench } from 'vitest'
  2. import type { ComputedRef } from '../src'
  3. import { computed, reactive } from '../dist/reactivity.esm-browser.prod'
  4. function createMap(obj: Record<string, any>) {
  5. const map = new Map()
  6. for (const key in obj) {
  7. if (obj.hasOwnProperty(key)) {
  8. map.set(key, obj[key])
  9. }
  10. }
  11. return map
  12. }
  13. bench('create reactive map', () => {
  14. reactive(createMap({ a: 1 }))
  15. })
  16. {
  17. let i = 0
  18. const r = reactive(createMap({ a: 1 }))
  19. bench('write reactive map property', () => {
  20. r.set('a', i++)
  21. })
  22. }
  23. {
  24. const r = reactive(createMap({ a: 1 }))
  25. computed(() => {
  26. return r.get('a') * 2
  27. })
  28. let i = 0
  29. bench("write reactive map, don't read computed (never invoked)", () => {
  30. r.set('a', i++)
  31. })
  32. }
  33. {
  34. const r = reactive(createMap({ a: 1 }))
  35. const c = computed(() => {
  36. return r.get('a') * 2
  37. })
  38. c.value
  39. let i = 0
  40. bench("write reactive map, don't read computed (invoked)", () => {
  41. r.set('a', i++)
  42. })
  43. }
  44. {
  45. const r = reactive(createMap({ a: 1 }))
  46. const c = computed(() => {
  47. return r.get('a') * 2
  48. })
  49. let i = 0
  50. bench('write reactive map, read computed', () => {
  51. r.set('a', i++)
  52. c.value
  53. })
  54. }
  55. {
  56. const _m = new Map()
  57. for (let i = 0; i < 10000; i++) {
  58. _m.set(i, i)
  59. }
  60. const r = reactive(_m)
  61. const c = computed(() => {
  62. let total = 0
  63. r.forEach((value, key) => {
  64. total += value
  65. })
  66. return total
  67. })
  68. bench("write reactive map (10'000 items), read computed", () => {
  69. r.set(5000, r.get(5000) + 1)
  70. c.value
  71. })
  72. }
  73. {
  74. const r = reactive(createMap({ a: 1 }))
  75. const computeds: any[] = []
  76. for (let i = 0, n = 1000; i < n; i++) {
  77. const c = computed(() => {
  78. return r.get('a') * 2
  79. })
  80. computeds.push(c)
  81. }
  82. let i = 0
  83. bench("write reactive map, don't read 1000 computeds (never invoked)", () => {
  84. r.set('a', i++)
  85. })
  86. }
  87. {
  88. const r = reactive(createMap({ a: 1 }))
  89. const computeds: any[] = []
  90. for (let i = 0, n = 1000; i < n; i++) {
  91. const c = computed(() => {
  92. return r.get('a') * 2
  93. })
  94. c.value
  95. computeds.push(c)
  96. }
  97. let i = 0
  98. bench("write reactive map, don't read 1000 computeds (invoked)", () => {
  99. r.set('a', i++)
  100. })
  101. }
  102. {
  103. const r = reactive(createMap({ a: 1 }))
  104. const computeds: ComputedRef<number>[] = []
  105. for (let i = 0, n = 1000; i < n; i++) {
  106. const c = computed(() => {
  107. return r.get('a') * 2
  108. })
  109. computeds.push(c)
  110. }
  111. let i = 0
  112. bench('write reactive map, read 1000 computeds', () => {
  113. r.set('a', i++)
  114. computeds.forEach(c => c.value)
  115. })
  116. }
  117. {
  118. const reactives: Map<any, any>[] = []
  119. for (let i = 0, n = 1000; i < n; i++) {
  120. reactives.push(reactive(createMap({ a: i })))
  121. }
  122. const c = computed(() => {
  123. let total = 0
  124. reactives.forEach(r => (total += r.get('a')))
  125. return total
  126. })
  127. let i = 0
  128. const n = reactives.length
  129. bench('1000 reactive maps, 1 computed', () => {
  130. reactives[i++ % n].set('a', reactives[i++ % n].get('a') + 1)
  131. c.value
  132. })
  133. }