Skip to content

Commit 14e1208

Browse files
committed
testing out automerges performance branch
1 parent 4c34e0d commit 14e1208

File tree

6 files changed

+33
-28
lines changed

6 files changed

+33
-28
lines changed

benchmarks/b1.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
import * as Y from 'yjs'
3-
import { setBenchmarkResult, gen, N, benchmarkTime, disableAutomergeBenchmarks } from './utils.js'
3+
import { setBenchmarkResult, gen, N, benchmarkTime, disableAutomergeBenchmarks, computeAutomergeUpdateSize } from './utils.js'
44
import * as prng from 'lib0/prng.js'
55
import * as math from 'lib0/math.js'
66
import * as t from 'lib0/testing.js'
@@ -37,23 +37,23 @@ const benchmarkAutomerge = (id, init, inputData, changeFunction, check) => {
3737
}
3838
const emptyDoc = Automerge.init()
3939
let doc1 = Automerge.change(emptyDoc, init)
40-
let doc2 = Automerge.applyChanges(Automerge.init(), Automerge.getChanges(emptyDoc, doc1))
40+
let doc2 = Automerge.applyChanges(Automerge.init(), Automerge.getAllChanges(doc1))
4141
let updateSize = 0
4242
benchmarkTime('automerge', `${id} (time)`, () => {
4343
for (let i = 0; i < inputData.length; i++) {
4444
const updatedDoc = Automerge.change(doc1, doc => {
4545
changeFunction(doc, inputData[i], i)
4646
})
47-
const update = JSON.stringify(Automerge.getChanges(doc1, updatedDoc))
48-
updateSize += update.length
49-
doc2 = Automerge.applyChanges(doc2, JSON.parse(update))
47+
const update = Automerge.getChanges(doc1, updatedDoc)
48+
updateSize += computeAutomergeUpdateSize(update)
49+
doc2 = Automerge.applyChanges(doc2, update)
5050
doc1 = updatedDoc
5151
}
5252
})
5353
check(doc1, doc2)
5454
setBenchmarkResult('automerge', `${id} (avgUpdateSize)`, `${math.round(updateSize / inputData.length)} bytes`)
5555
const encodedState = Automerge.save(doc1)
56-
const documentSize = encodedState.length
56+
const documentSize = encodedState.byteLength
5757
setBenchmarkResult('automerge', `${id} (docSize)`, `${documentSize} bytes`)
5858
benchmarkTime('automerge', `${id} (parseTime)`, () => {
5959
Automerge.load(encodedState)

benchmarks/b2.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
import * as Y from 'yjs'
3-
import { setBenchmarkResult, gen, N, benchmarkTime, cpy, disableAutomergeBenchmarks } from './utils.js'
3+
import { setBenchmarkResult, gen, N, benchmarkTime, disableAutomergeBenchmarks, computeAutomergeUpdateSize } from './utils.js'
44
import * as prng from 'lib0/prng.js'
55
import * as math from 'lib0/math.js'
66
import * as t from 'lib0/testing.js'
@@ -62,16 +62,16 @@ const benchmarkAutomerge = (id, changeDoc1, changeDoc2, check) => {
6262
doc.text = new Automerge.Text()
6363
doc.text.insertAt(0, ...initText)
6464
})
65-
let doc2 = Automerge.applyChanges(Automerge.init(), cpy(Automerge.getChanges(emptyDoc, doc1)))
65+
let doc2 = Automerge.applyChanges(Automerge.init(), Automerge.getAllChanges(doc1))
6666
let updateSize = 0
6767
benchmarkTime('automerge', `${id} (time)`, () => {
6868
const updatedDoc1 = Automerge.change(doc1, changeDoc1)
6969
const updatedDoc2 = Automerge.change(doc2, changeDoc2)
70-
const update2 = JSON.stringify(Automerge.getChanges(doc1, updatedDoc1))
71-
const update1 = JSON.stringify(Automerge.getChanges(doc2, updatedDoc2))
72-
updateSize += update1.length + update2.length
73-
doc2 = Automerge.applyChanges(updatedDoc2, JSON.parse(update2))
74-
doc1 = Automerge.applyChanges(updatedDoc1, JSON.parse(update1))
70+
const update2 = Automerge.getChanges(doc1, updatedDoc1)
71+
const update1 = Automerge.getChanges(doc2, updatedDoc2)
72+
updateSize += computeAutomergeUpdateSize(update1) + computeAutomergeUpdateSize(update2)
73+
doc2 = Automerge.applyChanges(updatedDoc2, update2)
74+
doc1 = Automerge.applyChanges(updatedDoc1, update1)
7575
})
7676
check(doc1, doc2)
7777
setBenchmarkResult('automerge', `${id} (updateSize)`, `${math.round(updateSize)} bytes`)

benchmarks/b3.js

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
import * as Y from 'yjs'
3-
import { setBenchmarkResult, benchmarkTime, N, disableAutomergeBenchmarks } from './utils.js'
3+
import { setBenchmarkResult, benchmarkTime, N, disableAutomergeBenchmarks, computeAutomergeUpdateSize } from './utils.js'
44
import * as t from 'lib0/testing.js'
55
import * as math from 'lib0/math.js'
66
import Automerge from 'automerge'
@@ -52,31 +52,31 @@ const benchmarkAutomerge = (id, init, changeDoc, check) => {
5252
for (let i = 0; i < sqrtN; i++) {
5353
docs.push(Automerge.init())
5454
}
55-
const initDoc = Automerge.change(docs[0], init)
56-
const initUpdate = JSON.stringify(Automerge.getChanges(docs[0], initDoc))
57-
for (let i = 0; i < docs.length; i++) {
58-
docs[i] = Automerge.applyChanges(docs[i], JSON.parse(initUpdate))
55+
docs[0] = Automerge.change(docs[0], init)
56+
const initUpdate = Automerge.getAllChanges(docs[0])
57+
for (let i = 1; i < docs.length; i++) {
58+
docs[i] = Automerge.applyChanges(docs[i], initUpdate)
5959
}
6060
const updates = []
6161
for (let i = 0; i < docs.length; i++) {
6262
const doc = docs[i]
6363
const updatedDoc = Automerge.change(doc, d => { changeDoc(d, i) })
64-
const update = JSON.stringify(Automerge.getChanges(doc, updatedDoc))
64+
const update = Automerge.getChanges(doc, updatedDoc)
6565
updates.push(update)
6666
docs[i] = updatedDoc
6767
}
6868
for (let i = 0; i < updates.length; i++) {
69-
docs[0] = Automerge.applyChanges(docs[0], JSON.parse(updates[i]))
69+
docs[0] = Automerge.applyChanges(docs[0], updates[i])
7070
}
7171
benchmarkTime('automerge', `${id} (time)`, () => {
7272
for (let i = 0; i < updates.length; i++) {
73-
docs[1] = Automerge.applyChanges(docs[1], JSON.parse(updates[i]))
73+
docs[1] = Automerge.applyChanges(docs[1], updates[i])
7474
}
7575
})
7676
check(docs.slice(0, 2))
77-
setBenchmarkResult('automerge', `${id} (updateSize)`, `${updates.reduce((len, update) => len + update.length, 0)} bytes`)
77+
setBenchmarkResult('automerge', `${id} (updateSize)`, `${updates.reduce((len, update) => len + computeAutomergeUpdateSize(update), 0)} bytes`)
7878
const encodedState = Automerge.save(docs[0])
79-
const documentSize = encodedState.length
79+
const documentSize = encodedState.byteLength
8080
setBenchmarkResult('automerge', `${id} (docSize)`, `${documentSize} bytes`)
8181
benchmarkTime('automerge', `${id} (parseTime)`, () => {
8282
Automerge.load(encodedState)

benchmarks/utils.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@ export const benchmarkTime = (libname, id, f) => {
2323

2424
export const gen = prng.create(42)
2525

26-
export const cpy = o => JSON.parse(JSON.stringify(o))
26+
export const computeAutomergeUpdateSize = updates => updates.reduce((len, update) => update.byteLength, 0)

package-lock.json

Lines changed: 8 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
},
2626
"homepage": "https://github.com/dmonad/crdt-benchmarks#readme",
2727
"dependencies": {
28-
"automerge": "^0.14.1",
28+
"automerge": "github:automerge/automerge#performance",
2929
"lib0": "^0.2.27",
3030
"rollup": "^1.32.1",
3131
"rollup-plugin-commonjs": "^8.3.4",

0 commit comments

Comments
 (0)