ソースを参照

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

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

GitOrigin-RevId: 079f9b565f17b44d7062f6b93c26f694e486c6b9
Mathias Jakobsen 2 年 前
コミット
94694a6385

+ 19 - 0
services/web/scripts/lezer-latex/random.mjs

@@ -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
+}

+ 8 - 2
services/web/scripts/lezer-latex/test-incremental-parser.mjs

@@ -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)
   )
   )
 }
 }