unrollBuffer.bench.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import { bench, describe } from 'vitest'
  2. import { type SSRBuffer, createBuffer } from '../src/render'
  3. import { unrollBuffer as _unrollBuffer } from '../src/renderToString'
  4. // move to local const to avoid import access overhead
  5. // https://github.com/vitest-dev/vitest/issues/6903
  6. const unrollBuffer = _unrollBuffer
  7. function createSyncBuffer(levels: number, itemsPerLevel: number): SSRBuffer {
  8. const buffer = createBuffer()
  9. function addItems(buf: ReturnType<typeof createBuffer>, level: number) {
  10. for (let i = 1; i <= levels * itemsPerLevel; i++) {
  11. buf.push(`sync${level}.${i}`)
  12. }
  13. if (level < levels) {
  14. const subBuffer = createBuffer()
  15. addItems(subBuffer, level + 1)
  16. buf.push(subBuffer.getBuffer())
  17. }
  18. }
  19. addItems(buffer, 1)
  20. return buffer.getBuffer()
  21. }
  22. function createMixedBuffer(levels: number, itemsPerLevel: number): SSRBuffer {
  23. const buffer = createBuffer()
  24. function addItems(buf: ReturnType<typeof createBuffer>, level: number) {
  25. for (let i = 1; i <= levels * itemsPerLevel; i++) {
  26. if (i % 3 === 0) {
  27. // @ts-expect-error testing...
  28. buf.push(Promise.resolve(`async${level}.${i}`))
  29. } else {
  30. buf.push(`sync${level}.${i}`)
  31. }
  32. }
  33. if (level < levels) {
  34. const subBuffer = createBuffer()
  35. addItems(subBuffer, level + 1)
  36. buf.push(subBuffer.getBuffer())
  37. }
  38. }
  39. addItems(buffer, 1)
  40. return buffer.getBuffer()
  41. }
  42. describe('unrollBuffer', () => {
  43. let syncBuffer = createBuffer().getBuffer()
  44. let mixedBuffer = createBuffer().getBuffer()
  45. bench(
  46. 'sync',
  47. () => {
  48. return unrollBuffer(syncBuffer) as any
  49. },
  50. {
  51. setup() {
  52. syncBuffer = createSyncBuffer(5, 3)
  53. },
  54. },
  55. )
  56. bench(
  57. 'mixed',
  58. () => {
  59. return unrollBuffer(mixedBuffer) as any
  60. },
  61. {
  62. setup() {
  63. mixedBuffer = createMixedBuffer(5, 3)
  64. },
  65. },
  66. )
  67. })