enso/app/gui2/ydoc-server/__tests__/edits.bench.ts
Adam Obuchowicz 874e9efe74
Add workaround for huge idmap diffs (#9207)
Fixes probably #9198 See [this comment](https://github.com/enso-org/enso/issues/9198#issuecomment-1968484269) for justification. TLDR: the diff algorithm is too slow for our huge idmap.

The proper fix would be to reduce idmap size. Expect tasks for that soon.
2024-02-29 14:42:59 +00:00

61 lines
1.5 KiB
TypeScript

import diff from 'fast-diff'
import { uuidv4 } from 'lib0/random.js'
import { bench, describe } from 'vitest'
import { stupidFastDiff } from '../edits'
describe('Diff algorithm benchmarks', () => {
let oldString = ''
let newString = ''
function initializeStrings(length: number) {
// simulating metadata list:
oldString = ''
let i = 0
while (oldString.length < length / 2) {
oldString += `[{"index":{"value":${i}},"size":{"value":4}},"${uuidv4()}"]`
i += 1
}
i = 1
newString = ''
while (newString.length < length / 2) {
newString += `[{"index":{"value":${i}},"size":{"value":5}},"${uuidv4()}"]`
}
}
function diffBenchmark(length: number) {
bench(
`Diffing ${length}`,
() => {
diff(oldString, newString)
},
{ setup: () => initializeStrings(length), warmupIterations: 1, iterations: 1 },
)
}
function stupidFastDiffBenchmark(length: number) {
bench(
`Fast Diffing ${length}`,
() => {
stupidFastDiff(oldString, newString)
},
{ setup: () => initializeStrings(length), warmupIterations: 1, iterations: 1 },
)
}
diffBenchmark(10000)
diffBenchmark(20000)
diffBenchmark(30000)
diffBenchmark(40000)
diffBenchmark(50000)
// These are too slow for every-day benchmark run
// diffBenchmark(60000)
// diffBenchmark(70000)
// diffBenchmark(80000)
// diffBenchmark(90000)
// diffBenchmark(100000)
// diffBenchmark(250000)
stupidFastDiffBenchmark(250000)
stupidFastDiffBenchmark(2500000)
})