Skip to content

Commit 1d33e47

Browse files
authored
New Workload: validatorjs regexp heavy workload (#147)
This runs the validatorjs [1] test suite and stress-tests various regexp and some dynamic property lookups. The sources are transpiled using UnicodeEscapePlugin to avoid 2-byte source strings, since the tests use 2-byte character input strings. [1] https://github.com/validatorjs/validator.js
1 parent b400dd3 commit 1d33e47

13 files changed

+36969
-0
lines changed

JetStreamDriver.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1814,6 +1814,16 @@ let BENCHMARKS = [
18141814
exposeBrowserTest: true,
18151815
tags: ["Default", "RexBench"],
18161816
}),
1817+
new DefaultBenchmark({
1818+
name: "validatorjs",
1819+
files: [
1820+
// Use the unminified version for easier local profiling.
1821+
// "./validatorjs/dist/bundle.es6.js",
1822+
"./validatorjs/dist/bundle.es6.min.js",
1823+
"./validatorjs/benchmark.js",
1824+
],
1825+
tags: ["Default", "regexp"],
1826+
}),
18171827
// Simple
18181828
new DefaultBenchmark({
18191829
name: "hash-map",

validatorjs/README.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# validator.js test for JetStream
2+
3+
Measures the performance of the validator.js library by running the core test suite.
4+
5+
## Build Instructions
6+
7+
```bash
8+
# install required node packages.
9+
npm ci
10+
# build the workload, output is ./dist
11+
npm run build
12+
```
13+
14+
## Workloads
15+
16+
The workload is a modified copy of the validator.js [test suite](https://github.com/validatorjs/validator.js/tree/master/test).
17+
Several files are combined together and contents copied to the `runTest` method.
18+
19+
Modifications to the original:
20+
- Any tests that depend on node internal values have been removed.
21+
- Date constructions with an arg-array differs between browser and thus they
22+
are replaced by direct arguments.
23+
- Direct calls to validater.xzy() are replaced with validatorjs.xzy() to not
24+
conflict with the default argument to the mock test() method.

validatorjs/benchmark-node.mjs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { runTest } from "./src/test.mjs";
2+
3+
const then = performance.now();
4+
runTest();
5+
const duration = performance.now() - then;
6+
console.log(`Duration: ${duration.toFixed(2)}ms`);

validatorjs/benchmark.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright (C) 2025 Apple Inc. All rights reserved.
3+
*
4+
* Redistribution and use in source and binary forms, with or without
5+
* modification, are permitted provided that the following conditions
6+
* are met:
7+
* 1. Redistributions of source code must retain the above copyright
8+
* notice, this list of conditions and the following disclaimer.
9+
* 2. Redistributions in binary form must reproduce the above copyright
10+
* notice, this list of conditions and the following disclaimer in the
11+
* documentation and/or other materials provided with the distribution.
12+
*
13+
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14+
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16+
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17+
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18+
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19+
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20+
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21+
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24+
*/
25+
26+
const EXPECTED_ASSERTION_COUNT = 10114;
27+
28+
class Benchmark {
29+
assertionCount = 0;
30+
31+
runIteration() {
32+
this.assertionCount = ValidatorJSBenchmark.runTest();
33+
}
34+
35+
validate() {
36+
console.assert(
37+
this.assertionCount === EXPECTED_ASSERTION_COUNT,
38+
`Expected ${EXPECTED_ASSERTION_COUNT} assertions, but got ${this.assertionCount}`
39+
);
40+
}
41+
}

0 commit comments

Comments
 (0)