MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1const now = () => typeof performance !== 'undefined' && performance.now ? performance.now() : Date.now();
2
3function bench(name, fn, iters = 1) {
4 fn();
5 const t0 = now();
6 for (let i = 0; i < iters; i++) fn();
7 const dt = now() - t0;
8 const per = (dt / iters).toFixed(3);
9 console.log(`${name}: ${dt.toFixed(2)} ms total, ${per} ms/iter (${iters} iters)`);
10}
11
12// simple escape sequences
13bench('simple escapes (\\n\\t\\r)', () => {
14 let s = '';
15 for (let i = 0; i < 5000; i++) s = "hello\tworld\nfoo\rbar";
16}, 50);
17
18bench('backslash + quote escapes', () => {
19 let s = '';
20 for (let i = 0; i < 5000; i++) s = "it\'s a \"test\" with \\backslash";
21}, 50);
22
23// hex escapes \xNN
24bench('hex escapes (\\xNN)', () => {
25 let s = '';
26 for (let i = 0; i < 5000; i++) s = "\x41\x42\x43\x61\x62\x63\x00\xff";
27}, 50);
28
29// unicode escapes \uNNNN
30bench('unicode 4-digit (\\uNNNN)', () => {
31 let s = '';
32 for (let i = 0; i < 5000; i++) s = "\u0041\u00e9\u4e16\u754c\u0048\u0065";
33}, 50);
34
35// unicode braced escapes \u{NNNNN}
36bench('unicode braced (\\u{N+})', () => {
37 let s = '';
38 for (let i = 0; i < 5000; i++) s = "\u{41}\u{e9}\u{4e16}\u{1f600}\u{10ffff}";
39}, 50);
40
41// null escape
42bench('null escape (\\0)', () => {
43 let s = '';
44 for (let i = 0; i < 5000; i++) s = "abc\0def\0ghi";
45}, 50);
46
47// mixed escapes in one string
48bench('mixed escapes', () => {
49 let s = '';
50 for (let i = 0; i < 5000; i++) s = "tab\there\nnewline\r\x41\u0042\u{43}end\\done";
51}, 50);
52
53// template literals with escapes
54bench('template literal escapes', () => {
55 let s = '';
56 const x = 42;
57 for (let i = 0; i < 5000; i++) s = `\t\n\x41\u0042\u{43} val=${x}`;
58}, 50);
59
60// template literal with many interpolations
61bench('template interpolation heavy', () => {
62 let s = '';
63 const a = 1, b = 2, c = 3, d = 4, e = 5;
64 for (let i = 0; i < 5000; i++) s = `${a}-${b}-${c}-${d}-${e}`;
65}, 50);
66
67// long string with scattered escapes
68bench('long string scattered escapes', () => {
69 let s = '';
70 for (let i = 0; i < 2000; i++) s = "aaaaaaaaaaaaaaaa\nbbbbbbbbbbbbbbbb\tcccccccccccccccc\rdddddddddddddddd\x41eeeeeeeeeeeeeeee\u0042ffffffffffffffff";
71}, 50);
72
73// string concatenation with escapes
74bench('concat with escapes', () => {
75 let s = '';
76 for (let i = 0; i < 2000; i++) s += "\n\t\x41\u0042";
77}, 20);
78
79// octal escapes (legacy)
80bench('octal escapes', () => {
81 let s = '';
82 for (let i = 0; i < 5000; i++) s = "\101\102\103\141\142\143";
83}, 50);
84
85// form feed, vertical tab, backspace
86bench('rare escapes (\\v\\f\\b)', () => {
87 let s = '';
88 for (let i = 0; i < 5000; i++) s = "a\vb\fc\bd";
89}, 50);
90
91// no escapes baseline
92bench('no escapes (baseline)', () => {
93 let s = '';
94 for (let i = 0; i < 5000; i++) s = "hello world this is a plain string with no escapes at all";
95}, 50);