effect.bench.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import { bench, describe } from 'vitest'
  2. import type { Ref } from '../src'
  3. import { effect, ref } from '../dist/reactivity.esm-browser.prod'
  4. describe('effect', () => {
  5. {
  6. let i = 0
  7. const n = ref(0)
  8. effect(() => n.value)
  9. bench('single ref invoke', () => {
  10. n.value = i++
  11. })
  12. }
  13. function benchEffectCreate(size: number) {
  14. bench(`create an effect that tracks ${size} refs`, () => {
  15. const refs: Ref[] = []
  16. for (let i = 0; i < size; i++) {
  17. refs.push(ref(i))
  18. }
  19. effect(() => {
  20. for (let i = 0; i < size; i++) {
  21. refs[i].value
  22. }
  23. })
  24. })
  25. }
  26. benchEffectCreate(1)
  27. benchEffectCreate(10)
  28. benchEffectCreate(100)
  29. benchEffectCreate(1000)
  30. function benchEffectCreateAndStop(size: number) {
  31. bench(`create and stop an effect that tracks ${size} refs`, () => {
  32. const refs: Ref[] = []
  33. for (let i = 0; i < size; i++) {
  34. refs.push(ref(i))
  35. }
  36. const e = effect(() => {
  37. for (let i = 0; i < size; i++) {
  38. refs[i].value
  39. }
  40. })
  41. e.effect.stop()
  42. })
  43. }
  44. benchEffectCreateAndStop(1)
  45. benchEffectCreateAndStop(10)
  46. benchEffectCreateAndStop(100)
  47. benchEffectCreateAndStop(1000)
  48. function benchWithRefs(size: number) {
  49. let j = 0
  50. const refs: Ref[] = []
  51. for (let i = 0; i < size; i++) {
  52. refs.push(ref(i))
  53. }
  54. effect(() => {
  55. for (let i = 0; i < size; i++) {
  56. refs[i].value
  57. }
  58. })
  59. bench(`1 effect, mutate ${size} refs`, () => {
  60. for (let i = 0; i < size; i++) {
  61. refs[i].value = i + j++
  62. }
  63. })
  64. }
  65. benchWithRefs(10)
  66. benchWithRefs(100)
  67. benchWithRefs(1000)
  68. function benchWithBranches(size: number) {
  69. const toggle = ref(true)
  70. const refs: Ref[] = []
  71. for (let i = 0; i < size; i++) {
  72. refs.push(ref(i))
  73. }
  74. effect(() => {
  75. if (toggle.value) {
  76. for (let i = 0; i < size; i++) {
  77. refs[i].value
  78. }
  79. }
  80. })
  81. bench(`${size} refs branch toggle`, () => {
  82. toggle.value = !toggle.value
  83. })
  84. }
  85. benchWithBranches(10)
  86. benchWithBranches(100)
  87. benchWithBranches(1000)
  88. function benchMultipleEffects(size: number) {
  89. let i = 0
  90. const n = ref(0)
  91. for (let i = 0; i < size; i++) {
  92. effect(() => n.value)
  93. }
  94. bench(`1 ref invoking ${size} effects`, () => {
  95. n.value = i++
  96. })
  97. }
  98. benchMultipleEffects(10)
  99. benchMultipleEffects(100)
  100. benchMultipleEffects(1000)
  101. })