diff --git a/packages/server-renderer/__tests__/createBuffer.bench.ts b/packages/server-renderer/__tests__/createBuffer.bench.ts new file mode 100644 index 00000000000..fff20f927fb --- /dev/null +++ b/packages/server-renderer/__tests__/createBuffer.bench.ts @@ -0,0 +1,65 @@ +import { bench, describe } from 'vitest' + +import { createBuffer } from '../src/render' + +describe('createBuffer', () => { + let stringBuffer = createBuffer() + + bench( + 'string only', + () => { + for (let i = 0; i < 10; i += 1) { + stringBuffer.push('hello') + } + }, + { + setup() { + stringBuffer = createBuffer() + }, + }, + ) + + let stringNestedBuffer = createBuffer() + + bench( + 'string with nested', + () => { + for (let i = 0; i < 10; i += 1) { + if (i % 3 === 0) { + stringNestedBuffer.push('hello') + } else { + const buffer = createBuffer() + buffer.push('hello') + stringNestedBuffer.push(buffer.getBuffer()) + } + } + }, + { + setup() { + stringNestedBuffer = createBuffer() + }, + }, + ) + + bench( + 'string with nested async', + () => { + for (let i = 0; i < 10; i += 1) { + if (i % 3 === 0) { + const buffer = createBuffer() + buffer.push('hello') + stringNestedBuffer.push(Promise.resolve(buffer.getBuffer())) + } else { + const buffer = createBuffer() + buffer.push('hello') + stringNestedBuffer.push(buffer.getBuffer()) + } + } + }, + { + setup() { + stringNestedBuffer = createBuffer() + }, + }, + ) +}) diff --git a/packages/server-renderer/src/render.ts b/packages/server-renderer/src/render.ts index 7e274c3b981..ab84dd212f0 100644 --- a/packages/server-renderer/src/render.ts +++ b/packages/server-renderer/src/render.ts @@ -73,9 +73,9 @@ export function createBuffer() { const isStringItem = isString(item) if (appendable && isStringItem) { buffer[buffer.length - 1] += item as string - } else { - buffer.push(item) + return } + buffer.push(item) appendable = isStringItem if (isPromise(item) || (isArray(item) && item.hasAsync)) { // promise, or child buffer with async, mark as async.