Merge pull request #19057 from overleaf/mj-benchmark-seed-random

[web] Add quick and dirty PRNG for seeding benchmark runs

GitOrigin-RevId: 079f9b565f17b44d7062f6b93c26f694e486c6b9
This commit is contained in:
Mathias Jakobsen 2024-06-21 11:47:27 +01:00 committed by Copybot
parent a8cb423078
commit 94694a6385
2 changed files with 27 additions and 2 deletions

View file

@ -0,0 +1,19 @@
// Super quick and dirty LCG PRNG
const m = 0xffffffff
let X = Math.floor(Math.random() * (m - 1))
const a = 16807
const c = 0
// Should probably be a large-ish number
export function seed(i) {
if (i < 0) {
throw new Error('Seed must be a positive integer')
}
X = i & m
}
export function random() {
X = (a * X + c) % m
return X / m
}

View file

@ -5,10 +5,16 @@ import * as path from 'path'
import { fileURLToPath } from 'url' import { fileURLToPath } from 'url'
import { TreeFragment } from '@lezer/common' import { TreeFragment } from '@lezer/common'
import minimist from 'minimist' import minimist from 'minimist'
import { seed, random } from './random.mjs'
const argv = minimist(process.argv.slice(2)) const argv = minimist(process.argv.slice(2))
const NUMBER_OF_OPS = argv.ops || 1000 const NUMBER_OF_OPS = argv.ops || 1000
const CSV_OUTPUT = argv.csv || false const CSV_OUTPUT = argv.csv || false
const SEED = argv.seed
if (SEED) {
seed(SEED)
}
const __dirname = path.dirname(fileURLToPath(import.meta.url)) const __dirname = path.dirname(fileURLToPath(import.meta.url))
@ -108,13 +114,13 @@ function writeTextAt(document, position, text) {
function randomInsertions(document, num) { function randomInsertions(document, num) {
return timedChanges(document, num, currentDoc => return timedChanges(document, num, currentDoc =>
insertAt(currentDoc, Math.floor(Math.random() * currentDoc.length), 'a') insertAt(currentDoc, Math.floor(random() * currentDoc.length), 'a')
) )
} }
function randomDeletions(document, num) { function randomDeletions(document, num) {
return timedChanges(document, num, currentDoc => return timedChanges(document, num, currentDoc =>
deleteAt(currentDoc, Math.floor(Math.random() * currentDoc.length), 1) deleteAt(currentDoc, Math.floor(random() * currentDoc.length), 1)
) )
} }