Files

353 lines
13 KiB
TypeScript
Raw Permalink Normal View History

2019-06-07 21:39:07 +02:00
/**
* Copyright (c) 2019 The xterm.js authors. All rights reserved.
* @license MIT
*/
2019-06-06 02:31:41 +02:00
import { perfContext, before, beforeEach, ThroughputRuntimeCase } from 'xterm-benchmark';
2019-06-09 17:31:57 +02:00
import { EscapeSequenceParser } from 'common/parser/EscapeSequenceParser';
import { C0, C1 } from 'common/data/EscapeSequences';
2021-01-21 15:58:03 +01:00
import { IDcsHandler, IOscHandler, IParams } from 'common/parser/Types';
2019-08-08 19:41:12 +02:00
import { OscHandler } from 'common/parser/OscParser';
2021-01-21 15:58:03 +01:00
import { DcsHandler } from '../../out/common/parser/DcsParser';
2019-06-06 02:31:41 +02:00
2021-01-21 15:58:03 +01:00
const SIZE = 5000000;
2019-06-06 02:31:41 +02:00
2019-06-06 02:43:22 +02:00
function toUtf32(s: string): Uint32Array {
2019-06-06 02:31:41 +02:00
const result = new Uint32Array(s.length);
for (let i = 0; i < s.length; ++i) {
result[i] = s.charCodeAt(i);
}
return result;
}
2021-01-21 15:58:03 +01:00
class FastDcsHandler implements IDcsHandler {
2020-04-26 08:23:38 -07:00
public hook(params: IParams): void {}
public put(data: Uint32Array, start: number, end: number): void {}
2021-01-21 15:58:03 +01:00
public unhook(success: boolean): boolean { return true; }
}
class FastOscHandler implements IOscHandler {
public start(): void {}
public put(data: Uint32Array, start: number, end: number): void {}
public end(success: boolean): boolean { return true; }
2019-06-19 00:42:20 +02:00
}
2019-06-06 02:31:41 +02:00
2019-06-19 00:42:20 +02:00
perfContext('Parser throughput - 50MB data', () => {
let parsed: Uint32Array;
2019-06-06 02:31:41 +02:00
let parser: EscapeSequenceParser;
2020-03-28 06:51:36 -07:00
2019-06-06 02:31:41 +02:00
beforeEach(() => {
parser = new EscapeSequenceParser();
parser.setPrintHandler((data, start, end) => {});
2021-08-12 12:59:22 -07:00
parser.registerCsiHandler({ final: '@' }, params => true);
parser.registerCsiHandler({ final: 'A' }, params => true);
parser.registerCsiHandler({ final: 'B' }, params => true);
parser.registerCsiHandler({ final: 'C' }, params => true);
parser.registerCsiHandler({ final: 'D' }, params => true);
parser.registerCsiHandler({ final: 'E' }, params => true);
parser.registerCsiHandler({ final: 'F' }, params => true);
parser.registerCsiHandler({ final: 'G' }, params => true);
parser.registerCsiHandler({ final: 'H' }, params => true);
parser.registerCsiHandler({ final: 'I' }, params => true);
parser.registerCsiHandler({ final: 'J' }, params => true);
parser.registerCsiHandler({ final: 'K' }, params => true);
parser.registerCsiHandler({ final: 'L' }, params => true);
parser.registerCsiHandler({ final: 'M' }, params => true);
parser.registerCsiHandler({ final: 'P' }, params => true);
parser.registerCsiHandler({ final: 'S' }, params => true);
parser.registerCsiHandler({ final: 'T' }, params => true);
parser.registerCsiHandler({ final: 'X' }, params => true);
parser.registerCsiHandler({ final: 'Z' }, params => true);
parser.registerCsiHandler({ final: '`' }, params => true);
parser.registerCsiHandler({ final: 'a' }, params => true);
parser.registerCsiHandler({ final: 'b' }, params => true);
parser.registerCsiHandler({ final: 'c' }, params => true);
parser.registerCsiHandler({ final: 'd' }, params => true);
parser.registerCsiHandler({ final: 'e' }, params => true);
parser.registerCsiHandler({ final: 'f' }, params => true);
parser.registerCsiHandler({ final: 'g' }, params => true);
parser.registerCsiHandler({ final: 'h' }, params => true);
parser.registerCsiHandler({ final: 'l' }, params => true);
parser.registerCsiHandler({ final: 'm' }, params => true);
parser.registerCsiHandler({ final: 'n' }, params => true);
parser.registerCsiHandler({ final: 'p' }, params => true);
parser.registerCsiHandler({ final: 'q' }, params => true);
parser.registerCsiHandler({ final: 'r' }, params => true);
parser.registerCsiHandler({ final: 's' }, params => true);
parser.registerCsiHandler({ final: 'u' }, params => true);
2021-01-20 23:03:55 +01:00
parser.setExecuteHandler(C0.BEL, () => true);
parser.setExecuteHandler(C0.LF, () => true);
parser.setExecuteHandler(C0.VT, () => true);
parser.setExecuteHandler(C0.FF, () => true);
parser.setExecuteHandler(C0.CR, () => true);
parser.setExecuteHandler(C0.BS, () => true);
parser.setExecuteHandler(C0.HT, () => true);
parser.setExecuteHandler(C0.SO, () => true);
parser.setExecuteHandler(C0.SI, () => true);
parser.setExecuteHandler(C1.IND, () => true);
parser.setExecuteHandler(C1.NEL, () => true);
parser.setExecuteHandler(C1.HTS, () => true);
parser.registerOscHandler(0, new OscHandler(data => true));
2021-01-21 15:58:03 +01:00
parser.registerOscHandler(1, new FastOscHandler());
2021-08-12 12:59:22 -07:00
parser.registerEscHandler({ final: '7' }, () => true);
parser.registerEscHandler({ final: '8' }, () => true);
parser.registerEscHandler({ final: 'D' }, () => true);
parser.registerEscHandler({ final: 'E' }, () => true);
parser.registerEscHandler({ final: 'H' }, () => true);
parser.registerEscHandler({ final: 'M' }, () => true);
parser.registerEscHandler({ final: '=' }, () => true);
parser.registerEscHandler({ final: '>' }, () => true);
parser.registerEscHandler({ final: 'c' }, () => true);
parser.registerEscHandler({ final: 'n' }, () => true);
parser.registerEscHandler({ final: 'o' }, () => true);
parser.registerEscHandler({ final: '|' }, () => true);
parser.registerEscHandler({ final: '}' }, () => true);
parser.registerEscHandler({ final: '~' }, () => true);
parser.registerEscHandler({ intermediates: '%', final: '@' }, () => true);
parser.registerEscHandler({ intermediates: '%', final: 'G' }, () => true);
parser.registerDcsHandler({ final: 'p' }, new DcsHandler(data => true));
parser.registerDcsHandler({ final: 'q' }, new FastDcsHandler());
2019-06-06 02:31:41 +02:00
});
2019-06-19 00:42:20 +02:00
perfContext('PRINT - a', () => {
2019-06-06 02:31:41 +02:00
before(() => {
2019-06-06 02:43:22 +02:00
const data = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
2019-06-19 00:42:20 +02:00
let content = '';
2021-01-21 15:58:03 +01:00
while (content.length < SIZE) {
2019-06-06 02:31:41 +02:00
content += data;
2019-06-06 02:43:22 +02:00
}
2019-06-19 00:42:20 +02:00
parsed = toUtf32(content);
2019-06-06 02:31:41 +02:00
});
2019-06-19 00:42:20 +02:00
new ThroughputRuntimeCase('', async () => {
parser.parse(parsed, parsed.length);
2021-08-12 12:59:22 -07:00
return { payloadSize: parsed.length };
}, { fork: true }).showAverageThroughput();
2019-06-06 02:31:41 +02:00
});
2019-06-19 00:42:20 +02:00
perfContext('EXECUTE - \\n', () => {
2019-06-06 02:31:41 +02:00
before(() => {
2019-06-06 02:43:22 +02:00
const data = '\n\n\n\n\n\n\n';
2019-06-19 00:42:20 +02:00
let content = '';
2021-01-21 15:58:03 +01:00
while (content.length < SIZE) {
2019-06-06 02:31:41 +02:00
content += data;
2019-06-06 02:43:22 +02:00
}
2019-06-19 00:42:20 +02:00
parsed = toUtf32(content);
2019-06-06 02:31:41 +02:00
});
2019-06-19 00:42:20 +02:00
new ThroughputRuntimeCase('', () => {
parser.parse(parsed, parsed.length);
2021-08-12 12:59:22 -07:00
return { payloadSize: parsed.length };
}, { fork: true }).showAverageThroughput();
2019-06-06 02:31:41 +02:00
});
2019-06-19 00:42:20 +02:00
perfContext('ESCAPE - ESC E', () => {
2019-06-06 02:31:41 +02:00
before(() => {
2019-06-06 02:43:22 +02:00
const data = '\x1bE\x1bE\x1bE\x1bE\x1bE\x1bE\x1bE\x1bE\x1bE\x1bE';
2019-06-19 00:42:20 +02:00
let content = '';
2021-01-21 15:58:03 +01:00
while (content.length < SIZE) {
2019-06-06 02:31:41 +02:00
content += data;
2019-06-06 02:43:22 +02:00
}
2019-06-19 00:42:20 +02:00
parsed = toUtf32(content);
2019-06-06 02:31:41 +02:00
});
2019-06-19 00:42:20 +02:00
new ThroughputRuntimeCase('', () => {
parser.parse(parsed, parsed.length);
2021-08-12 12:59:22 -07:00
return { payloadSize: parsed.length };
}, { fork: true }).showAverageThroughput();
2019-06-06 02:31:41 +02:00
});
2019-06-19 00:42:20 +02:00
perfContext('ESCAPE with collect - ESC % G', () => {
2019-06-06 02:31:41 +02:00
before(() => {
2019-06-06 02:43:22 +02:00
const data = '\x1b%G\x1b%G\x1b%G\x1b%G\x1b%G\x1b%G\x1b%G\x1b%G\x1b%G\x1b%G';
2019-06-19 00:42:20 +02:00
let content = '';
2021-01-21 15:58:03 +01:00
while (content.length < SIZE) {
2019-06-06 02:31:41 +02:00
content += data;
2019-06-06 02:43:22 +02:00
}
2019-06-19 00:42:20 +02:00
parsed = toUtf32(content);
2019-06-06 02:31:41 +02:00
});
2019-06-19 00:42:20 +02:00
new ThroughputRuntimeCase('', () => {
parser.parse(parsed, parsed.length);
2021-08-12 12:59:22 -07:00
return { payloadSize: parsed.length };
}, { fork: true }).showAverageThroughput();
2019-06-06 02:31:41 +02:00
});
2019-06-19 00:42:20 +02:00
perfContext('CSI - CSI A', () => {
2019-06-06 02:31:41 +02:00
before(() => {
2019-06-06 02:43:22 +02:00
const data = '\x1b[A\x1b[A\x1b[A\x1b[A\x1b[A\x1b[A\x1b[A\x1b[A\x1b[A\x1b[A';
2019-06-19 00:42:20 +02:00
let content = '';
2021-01-21 15:58:03 +01:00
while (content.length < SIZE) {
2019-06-06 02:31:41 +02:00
content += data;
2019-06-06 02:43:22 +02:00
}
2019-06-19 00:42:20 +02:00
parsed = toUtf32(content);
2019-06-06 02:31:41 +02:00
});
2019-06-19 00:42:20 +02:00
new ThroughputRuntimeCase('', () => {
parser.parse(parsed, parsed.length);
2021-08-12 12:59:22 -07:00
return { payloadSize: parsed.length };
}, { fork: true }).showAverageThroughput();
2019-06-06 02:31:41 +02:00
});
2019-06-19 00:42:20 +02:00
perfContext('CSI with collect - CSI ? p', () => {
2019-06-06 02:31:41 +02:00
before(() => {
2019-06-06 02:43:22 +02:00
const data = '\x1b[?p\x1b[?p\x1b[?p\x1b[?p\x1b[?p\x1b[?p\x1b[?p\x1b[?p\x1b[?p\x1b[?p';
2019-06-19 00:42:20 +02:00
let content = '';
2021-01-21 15:58:03 +01:00
while (content.length < SIZE) {
2019-06-06 02:31:41 +02:00
content += data;
2019-06-06 02:43:22 +02:00
}
2019-06-19 00:42:20 +02:00
parsed = toUtf32(content);
2019-06-06 02:31:41 +02:00
});
2019-06-19 00:42:20 +02:00
new ThroughputRuntimeCase('', () => {
parser.parse(parsed, parsed.length);
2021-08-12 12:59:22 -07:00
return { payloadSize: parsed.length };
}, { fork: true }).showAverageThroughput();
2019-06-06 02:31:41 +02:00
});
2019-06-19 00:42:20 +02:00
perfContext('CSI with params (short) - CSI 1;2 m', () => {
2019-06-06 02:31:41 +02:00
before(() => {
2019-06-19 00:42:20 +02:00
const data = '\x1b[1;2m\x1b[1;2m\x1b[1;2m\x1b[1;2m\x1b[1;2m\x1b[1;2m\x1b[1;2m\x1b[1;2m\x1b[1;2m\x1b[1;2m';
let content = '';
2021-01-21 15:58:03 +01:00
while (content.length < SIZE) {
2019-06-06 02:31:41 +02:00
content += data;
2019-06-06 02:43:22 +02:00
}
2019-06-19 00:42:20 +02:00
parsed = toUtf32(content);
2019-06-06 02:31:41 +02:00
});
2019-06-19 00:42:20 +02:00
new ThroughputRuntimeCase('', () => {
parser.parse(parsed, parsed.length);
2021-08-12 12:59:22 -07:00
return { payloadSize: parsed.length };
}, { fork: true }).showAverageThroughput();
2019-06-06 02:31:41 +02:00
});
2019-06-19 00:42:20 +02:00
perfContext('CSI with params (long) - CSI 1;2;3;4;5;6;7;8;9;0 m', () => {
before(() => {
const data = '\x1b[1;2;3;4;5;6;7;8;9;0m\x1b[1;2;3;4;5;6;7;8;9;0m\x1b[1;2;3;4;5;6;7;8;9;0m';
let content = '';
2021-01-21 15:58:03 +01:00
while (content.length < SIZE) {
2019-06-19 00:42:20 +02:00
content += data;
}
parsed = toUtf32(content);
});
new ThroughputRuntimeCase('', () => {
parser.parse(parsed, parsed.length);
2021-08-12 12:59:22 -07:00
return { payloadSize: parsed.length };
}, { fork: true }).showAverageThroughput();
2019-06-19 00:42:20 +02:00
});
2021-01-21 15:58:03 +01:00
perfContext('OSC string interface (short seq) - OSC 0;hi ST', () => {
2019-06-06 02:31:41 +02:00
before(() => {
2019-06-06 02:43:22 +02:00
const data = '\x1b]0;hi\x1b\\\x1b]0;hi\x1b\\\x1b]0;hi\x1b\\\x1b]0;hi\x1b\\x1b]0;hi\x1b\\';
2019-06-19 00:42:20 +02:00
let content = '';
2021-01-21 15:58:03 +01:00
while (content.length < SIZE) {
2019-06-06 02:31:41 +02:00
content += data;
2019-06-06 02:43:22 +02:00
}
2019-06-19 00:42:20 +02:00
parsed = toUtf32(content);
2019-06-06 02:31:41 +02:00
});
2019-06-19 00:42:20 +02:00
new ThroughputRuntimeCase('', () => {
parser.parse(parsed, parsed.length);
2021-08-12 12:59:22 -07:00
return { payloadSize: parsed.length };
}, { fork: true }).showAverageThroughput();
2019-06-06 02:31:41 +02:00
});
2021-01-21 15:58:03 +01:00
perfContext('OSC string interface (long seq) - OSC 0;<text> ST', () => {
2019-06-06 02:31:41 +02:00
before(() => {
2019-06-06 02:43:22 +02:00
const data = '\x1b]0;Lorem ipsum dolor sit amet, consetetur sadipscing elitr.\x1b\\';
2019-06-19 00:42:20 +02:00
let content = '';
2021-01-21 15:58:03 +01:00
while (content.length < SIZE) {
2019-06-06 02:31:41 +02:00
content += data;
2019-06-06 02:43:22 +02:00
}
2019-06-19 00:42:20 +02:00
parsed = toUtf32(content);
2019-06-06 02:31:41 +02:00
});
2019-06-19 00:42:20 +02:00
new ThroughputRuntimeCase('', () => {
parser.parse(parsed, parsed.length);
2021-08-12 12:59:22 -07:00
return { payloadSize: parsed.length };
}, { fork: true }).showAverageThroughput();
2019-06-06 02:31:41 +02:00
});
2021-01-21 15:58:03 +01:00
perfContext('OSC class interface (short seq) - OSC 0;hi ST', () => {
2019-06-06 02:31:41 +02:00
before(() => {
2021-01-21 15:58:03 +01:00
const data = '\x1b]1;hi\x1b\\\x1b]1;hi\x1b\\\x1b]1;hi\x1b\\\x1b]1;hi\x1b\\x1b]1;hi\x1b\\';
2019-06-19 00:42:20 +02:00
let content = '';
2021-01-21 15:58:03 +01:00
while (content.length < SIZE) {
content += data;
}
parsed = toUtf32(content);
});
new ThroughputRuntimeCase('', () => {
parser.parse(parsed, parsed.length);
2021-08-12 12:59:22 -07:00
return { payloadSize: parsed.length };
}, { fork: true }).showAverageThroughput();
2021-01-21 15:58:03 +01:00
});
perfContext('OSC class interface (long seq) - OSC 0;<text> ST', () => {
before(() => {
const data = '\x1b]1;Lorem ipsum dolor sit amet, consetetur sadipscing elitr.\x1b\\';
let content = '';
while (content.length < SIZE) {
content += data;
}
parsed = toUtf32(content);
});
new ThroughputRuntimeCase('', () => {
parser.parse(parsed, parsed.length);
2021-08-12 12:59:22 -07:00
return { payloadSize: parsed.length };
}, { fork: true }).showAverageThroughput();
2021-01-21 15:58:03 +01:00
});
perfContext('DCS string interface (short seq)', () => {
before(() => {
const data = '\x1bPphi\x1b\\\x1bPphi\x1b\\\x1bPphi\x1b\\\x1bPphi\x1b\\\x1bPphi\x1b\\';
let content = '';
while (content.length < SIZE) {
2019-06-06 02:31:41 +02:00
content += data;
2019-06-06 02:43:22 +02:00
}
2019-06-19 00:42:20 +02:00
parsed = toUtf32(content);
2019-06-06 02:31:41 +02:00
});
2019-06-19 00:42:20 +02:00
new ThroughputRuntimeCase('', async () => {
parser.parse(parsed, parsed.length);
2021-08-12 12:59:22 -07:00
return { payloadSize: parsed.length };
}, { fork: true }).showAverageThroughput();
2019-06-06 02:31:41 +02:00
});
2021-01-21 15:58:03 +01:00
perfContext('DCS string interface (long seq)', () => {
2019-06-06 02:31:41 +02:00
before(() => {
2021-01-21 15:58:03 +01:00
const data = '\x1bPpLorem ipsum dolor sit amet, consetetur sadipscing elitr.\x1b\\';
2019-06-19 00:42:20 +02:00
let content = '';
2021-01-21 15:58:03 +01:00
while (content.length < SIZE) {
content += data;
}
parsed = toUtf32(content);
});
new ThroughputRuntimeCase('', async () => {
parser.parse(parsed, parsed.length);
2021-08-12 12:59:22 -07:00
return { payloadSize: parsed.length };
}, { fork: true }).showAverageThroughput();
2021-01-21 15:58:03 +01:00
});
perfContext('DCS class interface (short seq)', () => {
before(() => {
const data = '\x1bPqhi\x1b\\\x1bPqhi\x1b\\\x1bPqhi\x1b\\\x1bPqhi\x1b\\\x1bPqhi\x1b\\';
let content = '';
while (content.length < SIZE) {
content += data;
}
parsed = toUtf32(content);
});
new ThroughputRuntimeCase('', async () => {
parser.parse(parsed, parsed.length);
2021-08-12 12:59:22 -07:00
return { payloadSize: parsed.length };
}, { fork: true }).showAverageThroughput();
2021-01-21 15:58:03 +01:00
});
perfContext('DCS class interface (long seq)', () => {
before(() => {
const data = '\x1bPqLorem ipsum dolor sit amet, consetetur sadipscing elitr.\x1b\\';
let content = '';
while (content.length < SIZE) {
2019-06-06 02:31:41 +02:00
content += data;
2019-06-06 02:43:22 +02:00
}
2019-06-19 00:42:20 +02:00
parsed = toUtf32(content);
2019-06-06 02:31:41 +02:00
});
2019-06-19 00:42:20 +02:00
new ThroughputRuntimeCase('', async () => {
parser.parse(parsed, parsed.length);
2021-08-12 12:59:22 -07:00
return { payloadSize: parsed.length };
}, { fork: true }).showAverageThroughput();
2019-06-06 02:31:41 +02:00
});
});