effect.bench.ts 2.4 KB

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