数据指标和性能测试

import * as Y from 'yjs';

const ydoc = new Y.Doc()
const ytext = ydoc.getText('benchmark')
// Insert one million 'y' characters from right to left 100w item
for (let i = 0; i < 10000; i++) {
    ytext.insert(0, 'y')
}
// transform ydoc to its binary representation
const encodedDocument = Y.encodeStateAsUpdateV2(ydoc)
const updateListJSON = Y.decodeUpdateV2(encodedDocument)
console.log('updateListJSON', updateListJSON['structs'].length) // item numbers
const docSize = encodedDocument.byteLength
console.log(`docSize: ${docSize} bytes`) // => ??? bytes

const start = Date.now()
const ydoc2 = new Y.Doc()
Y.applyUpdateV2(ydoc2, encodedDocument)
const parseTime = Date.now() - start
console.log(`parseTime: ${parseTime} ms`) // => 31 ms
ydoc.destroy()

1w个单字符y的item的apply:

numbers of item 10000

docSize: 10046 bytes

parseTime: 30 ms

1w个双字符he的item的apply:

numbers of item 10000

docSize: 20048 bytes

parseTime: 34 ms

10w个双字符he的item的apply:

numbers of item 100000

docSize: 200052 bytes

parseTime: 72 ms

内存占用情况

文档字符数:7000

update存储占用字节:69K

占用内存字节数: 102669

存储所占字节大概10字=1K,yDoc占用字节与实际字符数相比体积大30%

hocuspocus分析