···11+const now = () => typeof performance !== 'undefined' && performance.now ? performance.now() : Date.now();
22+33+function bench(name, fn, iters = 1) {
44+ fn();
55+ const t0 = now();
66+ for (let i = 0; i < iters; i++) fn();
77+ const dt = now() - t0;
88+ const per = (dt / iters).toFixed(3);
99+ console.log(`${name}: ${dt.toFixed(2)} ms total, ${per} ms/iter (${iters} iters)`);
1010+}
1111+1212+// simple escape sequences
1313+bench('simple escapes (\\n\\t\\r)', () => {
1414+ let s = '';
1515+ for (let i = 0; i < 5000; i++) s = "hello\tworld\nfoo\rbar";
1616+}, 50);
1717+1818+bench('backslash + quote escapes', () => {
1919+ let s = '';
2020+ for (let i = 0; i < 5000; i++) s = "it\'s a \"test\" with \\backslash";
2121+}, 50);
2222+2323+// hex escapes \xNN
2424+bench('hex escapes (\\xNN)', () => {
2525+ let s = '';
2626+ for (let i = 0; i < 5000; i++) s = "\x41\x42\x43\x61\x62\x63\x00\xff";
2727+}, 50);
2828+2929+// unicode escapes \uNNNN
3030+bench('unicode 4-digit (\\uNNNN)', () => {
3131+ let s = '';
3232+ for (let i = 0; i < 5000; i++) s = "\u0041\u00e9\u4e16\u754c\u0048\u0065";
3333+}, 50);
3434+3535+// unicode braced escapes \u{NNNNN}
3636+bench('unicode braced (\\u{N+})', () => {
3737+ let s = '';
3838+ for (let i = 0; i < 5000; i++) s = "\u{41}\u{e9}\u{4e16}\u{1f600}\u{10ffff}";
3939+}, 50);
4040+4141+// null escape
4242+bench('null escape (\\0)', () => {
4343+ let s = '';
4444+ for (let i = 0; i < 5000; i++) s = "abc\0def\0ghi";
4545+}, 50);
4646+4747+// mixed escapes in one string
4848+bench('mixed escapes', () => {
4949+ let s = '';
5050+ for (let i = 0; i < 5000; i++) s = "tab\there\nnewline\r\x41\u0042\u{43}end\\done";
5151+}, 50);
5252+5353+// template literals with escapes
5454+bench('template literal escapes', () => {
5555+ let s = '';
5656+ const x = 42;
5757+ for (let i = 0; i < 5000; i++) s = `\t\n\x41\u0042\u{43} val=${x}`;
5858+}, 50);
5959+6060+// template literal with many interpolations
6161+bench('template interpolation heavy', () => {
6262+ let s = '';
6363+ const a = 1, b = 2, c = 3, d = 4, e = 5;
6464+ for (let i = 0; i < 5000; i++) s = `${a}-${b}-${c}-${d}-${e}`;
6565+}, 50);
6666+6767+// long string with scattered escapes
6868+bench('long string scattered escapes', () => {
6969+ let s = '';
7070+ for (let i = 0; i < 2000; i++) s = "aaaaaaaaaaaaaaaa\nbbbbbbbbbbbbbbbb\tcccccccccccccccc\rdddddddddddddddd\x41eeeeeeeeeeeeeeee\u0042ffffffffffffffff";
7171+}, 50);
7272+7373+// string concatenation with escapes
7474+bench('concat with escapes', () => {
7575+ let s = '';
7676+ for (let i = 0; i < 2000; i++) s += "\n\t\x41\u0042";
7777+}, 20);
7878+7979+// octal escapes (legacy)
8080+bench('octal escapes', () => {
8181+ let s = '';
8282+ for (let i = 0; i < 5000; i++) s = "\101\102\103\141\142\143";
8383+}, 50);
8484+8585+// form feed, vertical tab, backspace
8686+bench('rare escapes (\\v\\f\\b)', () => {
8787+ let s = '';
8888+ for (let i = 0; i < 5000; i++) s = "a\vb\fc\bd";
8989+}, 50);
9090+9191+// no escapes baseline
9292+bench('no escapes (baseline)', () => {
9393+ let s = '';
9494+ for (let i = 0; i < 5000; i++) s = "hello world this is a plain string with no escapes at all";
9595+}, 50);