@zzzen/pyright-internal 1.2.0-dev.20260422 → 1.2.0-dev.20260503
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analyzer/sourceFile.js +53 -23
- package/dist/analyzer/sourceFile.js.map +1 -1
- package/dist/parser/characterStream.js +26 -2
- package/dist/parser/characterStream.js.map +1 -1
- package/dist/parser/parser.d.ts +2 -0
- package/dist/parser/parser.js +11 -7
- package/dist/parser/parser.js.map +1 -1
- package/dist/parser/tokenizer.d.ts +6 -2
- package/dist/parser/tokenizer.js +602 -206
- package/dist/parser/tokenizer.js.map +1 -1
- package/dist/parser/tokenizerTypes.js +115 -39
- package/dist/parser/tokenizerTypes.js.map +1 -1
- package/dist/tests/benchmarks/parserBenchmark.test.d.ts +1 -0
- package/dist/tests/benchmarks/parserBenchmark.test.js +220 -0
- package/dist/tests/benchmarks/parserBenchmark.test.js.map +1 -0
- package/dist/tests/benchmarks/tokenizerBenchmark.test.d.ts +1 -0
- package/dist/tests/benchmarks/tokenizerBenchmark.test.js +236 -0
- package/dist/tests/benchmarks/tokenizerBenchmark.test.js.map +1 -0
- package/dist/tests/tokenizer.test.js +17 -2
- package/dist/tests/tokenizer.test.js.map +1 -1
- package/package.json +5 -4
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* parserBenchmark.test.ts
|
|
4
|
+
* Copyright (c) Microsoft Corporation.
|
|
5
|
+
*
|
|
6
|
+
* Microbenchmark for the Python parser.
|
|
7
|
+
* Measures nodes/sec, parse time, AST node count across representative corpora.
|
|
8
|
+
*
|
|
9
|
+
* Run with:
|
|
10
|
+
* cd packages/pyright/packages/pyright-internal
|
|
11
|
+
* node node_modules\jest\bin\jest parserBenchmark.test --runInBand --detectOpenHandles --forceExit --testTimeout=300000
|
|
12
|
+
*
|
|
13
|
+
* Results are written as JSON to:
|
|
14
|
+
* src/tests/benchmarks/.generated/benchmark-results/parser/
|
|
15
|
+
*/
|
|
16
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
19
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
20
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
21
|
+
}
|
|
22
|
+
Object.defineProperty(o, k2, desc);
|
|
23
|
+
}) : (function(o, m, k, k2) {
|
|
24
|
+
if (k2 === undefined) k2 = k;
|
|
25
|
+
o[k2] = m[k];
|
|
26
|
+
}));
|
|
27
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
28
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
29
|
+
}) : function(o, v) {
|
|
30
|
+
o["default"] = v;
|
|
31
|
+
});
|
|
32
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const os = __importStar(require("os"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const diagnosticSink_1 = require("../../common/diagnosticSink");
|
|
44
|
+
const parser_1 = require("../../parser/parser");
|
|
45
|
+
// --- Configuration ---
|
|
46
|
+
const WARMUP_ITERATIONS = 3;
|
|
47
|
+
const BENCHMARK_ITERATIONS = 10;
|
|
48
|
+
const BENCHMARK_OUTPUT_DIR = path.join(__dirname, '.generated', 'benchmark-results', 'parser');
|
|
49
|
+
// --- Helpers ---
|
|
50
|
+
function calculateStats(times) {
|
|
51
|
+
const sorted = [...times].sort((a, b) => a - b);
|
|
52
|
+
const len = sorted.length;
|
|
53
|
+
const median = len % 2 === 0 ? (sorted[len / 2 - 1] + sorted[len / 2]) / 2 : sorted[Math.floor(len / 2)];
|
|
54
|
+
const p95Index = Math.ceil(len * 0.95) - 1;
|
|
55
|
+
const p95 = sorted[Math.min(p95Index, len - 1)];
|
|
56
|
+
const min = sorted[0];
|
|
57
|
+
const max = sorted[len - 1];
|
|
58
|
+
const avg = times.reduce((a, b) => a + b, 0) / len;
|
|
59
|
+
return { median, p95, min, max, avg };
|
|
60
|
+
}
|
|
61
|
+
function loadCorpus(filename) {
|
|
62
|
+
const filePath = path.resolve(__dirname, '..', 'benchmarkData', filename);
|
|
63
|
+
return fs.readFileSync(filePath, 'utf-8');
|
|
64
|
+
}
|
|
65
|
+
function getSystemInfo() {
|
|
66
|
+
const cpus = os.cpus();
|
|
67
|
+
return {
|
|
68
|
+
platform: os.platform(),
|
|
69
|
+
arch: os.arch(),
|
|
70
|
+
cpus: cpus[0]?.model ?? 'unknown',
|
|
71
|
+
cpuCount: cpus.length,
|
|
72
|
+
totalMemoryMB: Math.round(os.totalmem() / (1024 * 1024)),
|
|
73
|
+
nodeVersion: process.version,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function writeReport(report) {
|
|
77
|
+
fs.mkdirSync(BENCHMARK_OUTPUT_DIR, { recursive: true });
|
|
78
|
+
const filename = `parser-benchmark-${new Date().toISOString().replace(/[:.]/g, '-')}.json`;
|
|
79
|
+
const outputPath = path.join(BENCHMARK_OUTPUT_DIR, filename);
|
|
80
|
+
fs.writeFileSync(outputPath, JSON.stringify(report, undefined, 2), 'utf-8');
|
|
81
|
+
console.log(`\nBenchmark results written to: ${outputPath}`);
|
|
82
|
+
}
|
|
83
|
+
function printResultTable(results) {
|
|
84
|
+
console.log('\n=== Parser Benchmark Results ===\n');
|
|
85
|
+
console.log(`${'Corpus'.padEnd(25)} ${'Size'.padStart(8)} ${'Nodes'.padStart(8)} ${'Stmts'.padStart(7)} ${'Errors'.padStart(7)} ${'Median'.padStart(10)} ${'Min'.padStart(10)} ${'Max'.padStart(10)} ${'Avg'.padStart(10)} ${'Nodes/s'.padStart(12)}`);
|
|
86
|
+
console.log('-'.repeat(117));
|
|
87
|
+
for (const r of results) {
|
|
88
|
+
const sizeKB = `${(r.fileSizeBytes / 1024).toFixed(1)}KB`;
|
|
89
|
+
console.log(`${r.corpus.padEnd(25)} ${sizeKB.padStart(8)} ${String(r.nodeCount).padStart(8)} ${String(r.statementCount).padStart(7)} ${String(r.errorCount).padStart(7)} ${r.medianMs.toFixed(2).padStart(10)} ${r.minMs
|
|
90
|
+
.toFixed(2)
|
|
91
|
+
.padStart(10)} ${r.maxMs.toFixed(2).padStart(10)} ${r.avgMs.toFixed(2).padStart(10)} ${Math.round(r.nodesPerSec)
|
|
92
|
+
.toLocaleString()
|
|
93
|
+
.padStart(12)}`);
|
|
94
|
+
}
|
|
95
|
+
console.log('');
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Count all AST nodes by walking the tree recursively.
|
|
99
|
+
* Pyright parse nodes have: { nodeType, d: { ...children }, ... }
|
|
100
|
+
*/
|
|
101
|
+
function countNodes(node) {
|
|
102
|
+
if (!node || typeof node !== 'object' || !('nodeType' in node)) {
|
|
103
|
+
return 0;
|
|
104
|
+
}
|
|
105
|
+
let count = 1;
|
|
106
|
+
// Walk the .d data bag where child nodes live
|
|
107
|
+
const data = node.d;
|
|
108
|
+
if (data && typeof data === 'object') {
|
|
109
|
+
for (const key of Object.keys(data)) {
|
|
110
|
+
const val = data[key];
|
|
111
|
+
if (val && typeof val === 'object') {
|
|
112
|
+
if ('nodeType' in val) {
|
|
113
|
+
count += countNodes(val);
|
|
114
|
+
}
|
|
115
|
+
else if (Array.isArray(val)) {
|
|
116
|
+
for (const item of val) {
|
|
117
|
+
if (item && typeof item === 'object' && 'nodeType' in item) {
|
|
118
|
+
count += countNodes(item);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return count;
|
|
126
|
+
}
|
|
127
|
+
function benchmarkParse(corpusName, code) {
|
|
128
|
+
const times = [];
|
|
129
|
+
let nodeCount = 0;
|
|
130
|
+
let statementCount = 0;
|
|
131
|
+
let errorCount = 0;
|
|
132
|
+
const parseOptions = new parser_1.ParseOptions();
|
|
133
|
+
// Warmup
|
|
134
|
+
for (let i = 0; i < WARMUP_ITERATIONS; i++) {
|
|
135
|
+
const parser = new parser_1.Parser();
|
|
136
|
+
const diagSink = new diagnosticSink_1.DiagnosticSink();
|
|
137
|
+
parser.parseSourceFile(code, parseOptions, diagSink);
|
|
138
|
+
}
|
|
139
|
+
// Benchmark
|
|
140
|
+
for (let i = 0; i < BENCHMARK_ITERATIONS; i++) {
|
|
141
|
+
const parser = new parser_1.Parser();
|
|
142
|
+
const diagSink = new diagnosticSink_1.DiagnosticSink();
|
|
143
|
+
const start = performance.now();
|
|
144
|
+
const result = parser.parseSourceFile(code, parseOptions, diagSink);
|
|
145
|
+
const elapsed = performance.now() - start;
|
|
146
|
+
times.push(elapsed);
|
|
147
|
+
statementCount = result.parserOutput.parseTree.d.statements.length;
|
|
148
|
+
errorCount = diagSink.getErrors().length;
|
|
149
|
+
// Count nodes on the last iteration only (it's expensive)
|
|
150
|
+
if (i === BENCHMARK_ITERATIONS - 1) {
|
|
151
|
+
nodeCount = countNodes(result.parserOutput.parseTree);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const stats = calculateStats(times);
|
|
155
|
+
return {
|
|
156
|
+
corpus: corpusName,
|
|
157
|
+
fileSizeBytes: Buffer.byteLength(code, 'utf-8'),
|
|
158
|
+
iterations: BENCHMARK_ITERATIONS,
|
|
159
|
+
timesMs: times,
|
|
160
|
+
medianMs: stats.median,
|
|
161
|
+
p95Ms: stats.p95,
|
|
162
|
+
minMs: stats.min,
|
|
163
|
+
maxMs: stats.max,
|
|
164
|
+
avgMs: stats.avg,
|
|
165
|
+
nodeCount,
|
|
166
|
+
nodesPerSec: nodeCount / (stats.median / 1000),
|
|
167
|
+
statementCount,
|
|
168
|
+
errorCount,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
// --- Corpus definitions ---
|
|
172
|
+
const corpora = [
|
|
173
|
+
{ name: 'large_stdlib', file: 'large_stdlib.py' },
|
|
174
|
+
{ name: 'fstring_heavy', file: 'fstring_heavy.py' },
|
|
175
|
+
{ name: 'comment_heavy', file: 'comment_heavy.py' },
|
|
176
|
+
{ name: 'large_class', file: 'large_class.py' },
|
|
177
|
+
{ name: 'import_heavy', file: 'import_heavy.py' },
|
|
178
|
+
{ name: 'union_heavy', file: 'union_heavy.py' },
|
|
179
|
+
];
|
|
180
|
+
// --- Tests ---
|
|
181
|
+
describe('Parser Benchmark', () => {
|
|
182
|
+
const allResults = [];
|
|
183
|
+
for (const { name, file } of corpora) {
|
|
184
|
+
test(`parse ${name}`, () => {
|
|
185
|
+
const code = loadCorpus(file);
|
|
186
|
+
const result = benchmarkParse(name, code);
|
|
187
|
+
allResults.push(result);
|
|
188
|
+
console.log(` ${name}: median=${result.medianMs.toFixed(2)}ms, nodes=${result.nodeCount}, stmts=${result.statementCount}, nodes/sec=${Math.round(result.nodesPerSec).toLocaleString()}`);
|
|
189
|
+
// Sanity: parser should produce statements
|
|
190
|
+
expect(result.statementCount).toBeGreaterThan(0);
|
|
191
|
+
// Sanity: should complete in reasonable time (< 10s per file)
|
|
192
|
+
expect(result.medianMs).toBeLessThan(10000);
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
test('scaled corpus (10x large_stdlib)', () => {
|
|
196
|
+
const base = loadCorpus('large_stdlib.py');
|
|
197
|
+
const scaled = Array(10).fill(base).join('\n');
|
|
198
|
+
const result = benchmarkParse('large_stdlib_10x', scaled);
|
|
199
|
+
allResults.push(result);
|
|
200
|
+
console.log(` large_stdlib_10x: median=${result.medianMs.toFixed(2)}ms, nodes=${result.nodeCount}, nodes/sec=${Math.round(result.nodesPerSec).toLocaleString()}`);
|
|
201
|
+
expect(result.statementCount).toBeGreaterThan(0);
|
|
202
|
+
});
|
|
203
|
+
afterAll(() => {
|
|
204
|
+
if (allResults.length === 0) {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
printResultTable(allResults);
|
|
208
|
+
const report = {
|
|
209
|
+
timestamp: new Date().toISOString(),
|
|
210
|
+
system: getSystemInfo(),
|
|
211
|
+
config: {
|
|
212
|
+
warmupIterations: WARMUP_ITERATIONS,
|
|
213
|
+
benchmarkIterations: BENCHMARK_ITERATIONS,
|
|
214
|
+
},
|
|
215
|
+
results: allResults,
|
|
216
|
+
};
|
|
217
|
+
writeReport(report);
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
//# sourceMappingURL=parserBenchmark.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parserBenchmark.test.js","sourceRoot":"","sources":["../../../../../../src/tests/benchmarks/parserBenchmark.test.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,uCAAyB;AACzB,2CAA6B;AAE7B,gEAA6D;AAC7D,gDAA2D;AAE3D,wBAAwB;AAExB,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;AAqC/F,kBAAkB;AAElB,SAAS,cAAc,CAAC,KAA4B;IAOhD,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;IAE1B,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACzG,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;IAEnD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,UAAU,CAAC,QAAgB;IAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;IAC1E,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,aAAa;IAClB,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;IACvB,OAAO;QACH,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;QACvB,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE;QACf,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,SAAS;QACjC,QAAQ,EAAE,IAAI,CAAC,MAAM;QACrB,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QACxD,WAAW,EAAE,OAAO,CAAC,OAAO;KAC/B,CAAC;AACN,CAAC;AAED,SAAS,WAAW,CAAC,MAAuB;IACxC,EAAE,CAAC,SAAS,CAAC,oBAAoB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,oBAAoB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC;IAC3F,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;IAC7D,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,mCAAmC,UAAU,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAuC;IAC7D,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CACP,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAC3G,CAAC,CACJ,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,QAAQ,CACpF,EAAE,CACL,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAChC,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1D,OAAO,CAAC,GAAG,CACP,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CACrF,CAAC,CAAC,cAAc,CACnB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK;aAC7F,OAAO,CAAC,CAAC,CAAC;aACV,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CACjG,CAAC,CAAC,WAAW,CAChB;aACI,cAAc,EAAE;aAChB,QAAQ,CAAC,EAAE,CAAC,EAAE,CACtB,CAAC;IACN,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,IAAS;IACzB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,EAAE,CAAC;QAC7D,OAAO,CAAC,CAAC;IACb,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,8CAA8C;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;IACpB,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACnC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACtB,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACjC,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;oBACpB,KAAK,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;gBAC7B,CAAC;qBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC5B,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;wBACrB,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;4BACzD,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;wBAC9B,CAAC;oBACL,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,cAAc,CAAC,UAAkB,EAAE,IAAY;IACpD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,MAAM,YAAY,GAAG,IAAI,qBAAY,EAAE,CAAC;IAExC,SAAS;IACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,+BAAc,EAAE,CAAC;QACtC,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IACzD,CAAC;IAED,YAAY;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,oBAAoB,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,+BAAc,EAAE,CAAC;QAEtC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;QACpE,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAE1C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,cAAc,GAAG,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;QACnE,UAAU,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC;QAEzC,0DAA0D;QAC1D,IAAI,CAAC,KAAK,oBAAoB,GAAG,CAAC,EAAE,CAAC;YACjC,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1D,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAEpC,OAAO;QACH,MAAM,EAAE,UAAU;QAClB,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC;QAC/C,UAAU,EAAE,oBAAoB;QAChC,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,KAAK,CAAC,MAAM;QACtB,KAAK,EAAE,KAAK,CAAC,GAAG;QAChB,KAAK,EAAE,KAAK,CAAC,GAAG;QAChB,KAAK,EAAE,KAAK,CAAC,GAAG;QAChB,KAAK,EAAE,KAAK,CAAC,GAAG;QAChB,SAAS;QACT,WAAW,EAAE,SAAS,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;QAC9C,cAAc;QACd,UAAU;KACb,CAAC;AACN,CAAC;AAED,6BAA6B;AAE7B,MAAM,OAAO,GAAqC;IAC9C,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,iBAAiB,EAAE;IACjD,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,kBAAkB,EAAE;IACnD,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,kBAAkB,EAAE;IACnD,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,EAAE;IAC/C,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,iBAAiB,EAAE;IACjD,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,EAAE;CAClD,CAAC;AAEF,gBAAgB;AAEhB,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAC9B,MAAM,UAAU,GAAsB,EAAE,CAAC;IAEzC,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;QACnC,IAAI,CAAC,SAAS,IAAI,EAAE,EAAE,GAAG,EAAE;YACvB,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC1C,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAExB,OAAO,CAAC,GAAG,CACP,KAAK,IAAI,YAAY,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,SAAS,WACxE,MAAM,CAAC,cACX,eAAe,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,cAAc,EAAE,EAAE,CACnE,CAAC;YAEF,2CAA2C;YAC3C,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACjD,8DAA8D;YAC9D,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACP,CAAC;IAED,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,IAAI,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE/C,MAAM,MAAM,GAAG,cAAc,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QAC1D,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAExB,OAAO,CAAC,GAAG,CACP,8BAA8B,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,aACpD,MAAM,CAAC,SACX,eAAe,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,cAAc,EAAE,EAAE,CACnE,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,EAAE;QACV,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO;QACX,CAAC;QAED,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAE7B,MAAM,MAAM,GAAoB;YAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,MAAM,EAAE,aAAa,EAAE;YACvB,MAAM,EAAE;gBACJ,gBAAgB,EAAE,iBAAiB;gBACnC,mBAAmB,EAAE,oBAAoB;aAC5C;YACD,OAAO,EAAE,UAAU;SACtB,CAAC;QAEF,WAAW,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* tokenizerBenchmark.test.ts
|
|
4
|
+
* Copyright (c) Microsoft Corporation.
|
|
5
|
+
*
|
|
6
|
+
* Microbenchmark for the Python tokenizer.
|
|
7
|
+
* Measures tokens/sec and time-to-tokenize across representative corpora.
|
|
8
|
+
*
|
|
9
|
+
* Run with:
|
|
10
|
+
* cd packages/pyright-internal
|
|
11
|
+
* node node_modules\jest\bin\jest tokenizerBenchmark.test --runInBand --detectOpenHandles --forceExit --testTimeout=300000
|
|
12
|
+
*
|
|
13
|
+
* Results are written as JSON to:
|
|
14
|
+
* src/tests/benchmarks/.generated/benchmark-results/tokenizer/
|
|
15
|
+
*/
|
|
16
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
19
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
20
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
21
|
+
}
|
|
22
|
+
Object.defineProperty(o, k2, desc);
|
|
23
|
+
}) : (function(o, m, k, k2) {
|
|
24
|
+
if (k2 === undefined) k2 = k;
|
|
25
|
+
o[k2] = m[k];
|
|
26
|
+
}));
|
|
27
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
28
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
29
|
+
}) : function(o, v) {
|
|
30
|
+
o["default"] = v;
|
|
31
|
+
});
|
|
32
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
const child_process_1 = require("child_process");
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const os = __importStar(require("os"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const tokenizer_1 = require("../../parser/tokenizer");
|
|
45
|
+
// --- Configuration ---
|
|
46
|
+
const WARMUP_ITERATIONS = 3;
|
|
47
|
+
const BENCHMARK_ITERATIONS = 10;
|
|
48
|
+
const BENCHMARK_OUTPUT_DIR = path.join(__dirname, '.generated', 'benchmark-results', 'tokenizer');
|
|
49
|
+
const JEST_BIN_PATH = path.resolve(__dirname, '..', '..', '..', 'node_modules', 'jest', 'bin', 'jest.js');
|
|
50
|
+
const CHILD_RESULT_PREFIX = '__TOKENIZER_BENCHMARK_RESULT__';
|
|
51
|
+
const CHILD_MODE_ENV = 'PYRIGHT_TOKENIZER_BENCH_CHILD';
|
|
52
|
+
const RUN_BENCHMARKS_ENV = 'PYRIGHT_RUN_BENCHMARKS';
|
|
53
|
+
// --- Helpers ---
|
|
54
|
+
function calculateStats(times) {
|
|
55
|
+
const sorted = [...times].sort((a, b) => a - b);
|
|
56
|
+
const len = sorted.length;
|
|
57
|
+
const median = len % 2 === 0 ? (sorted[len / 2 - 1] + sorted[len / 2]) / 2 : sorted[Math.floor(len / 2)];
|
|
58
|
+
const p95Index = Math.ceil(len * 0.95) - 1;
|
|
59
|
+
const p95 = sorted[Math.min(p95Index, len - 1)];
|
|
60
|
+
const min = sorted[0];
|
|
61
|
+
const max = sorted[len - 1];
|
|
62
|
+
const avg = times.reduce((a, b) => a + b, 0) / len;
|
|
63
|
+
return { median, p95, min, max, avg };
|
|
64
|
+
}
|
|
65
|
+
function loadCorpus(filename) {
|
|
66
|
+
const filePath = path.resolve(__dirname, '..', 'benchmarkData', filename);
|
|
67
|
+
return fs.readFileSync(filePath, 'utf-8');
|
|
68
|
+
}
|
|
69
|
+
function getSystemInfo() {
|
|
70
|
+
const cpus = os.cpus();
|
|
71
|
+
return {
|
|
72
|
+
platform: os.platform(),
|
|
73
|
+
arch: os.arch(),
|
|
74
|
+
cpus: cpus[0]?.model ?? 'unknown',
|
|
75
|
+
cpuCount: cpus.length,
|
|
76
|
+
totalMemoryMB: Math.round(os.totalmem() / (1024 * 1024)),
|
|
77
|
+
nodeVersion: process.version,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function writeReport(report) {
|
|
81
|
+
fs.mkdirSync(BENCHMARK_OUTPUT_DIR, { recursive: true });
|
|
82
|
+
const filename = `tokenizer-benchmark-${new Date().toISOString().replace(/[:.]/g, '-')}.json`;
|
|
83
|
+
const outputPath = path.join(BENCHMARK_OUTPUT_DIR, filename);
|
|
84
|
+
fs.writeFileSync(outputPath, JSON.stringify(report, undefined, 2), 'utf-8');
|
|
85
|
+
console.log(`\nBenchmark results written to: ${outputPath}`);
|
|
86
|
+
}
|
|
87
|
+
function printResultTable(results) {
|
|
88
|
+
console.log('\n=== Tokenizer Benchmark Results ===\n');
|
|
89
|
+
console.log(`${'Corpus'.padEnd(25)} ${'Size'.padStart(8)} ${'Tokens'.padStart(8)} ${'Median'.padStart(10)} ${'Min'.padStart(10)} ${'Max'.padStart(10)} ${'Avg'.padStart(10)} ${'p95'.padStart(10)} ${'Tok/sec'.padStart(12)}`);
|
|
90
|
+
console.log('-'.repeat(113));
|
|
91
|
+
for (const result of results) {
|
|
92
|
+
const sizeKB = `${(result.fileSizeBytes / 1024).toFixed(1)}KB`;
|
|
93
|
+
console.log(`${result.corpus.padEnd(25)} ${sizeKB.padStart(8)} ${String(result.tokenCount).padStart(8)} ${result.medianMs.toFixed(2).padStart(10)} ${result.minMs.toFixed(2).padStart(10)} ${result.maxMs
|
|
94
|
+
.toFixed(2)
|
|
95
|
+
.padStart(10)} ${result.avgMs.toFixed(2).padStart(10)} ${result.p95Ms
|
|
96
|
+
.toFixed(2)
|
|
97
|
+
.padStart(10)} ${Math.round(result.tokensPerSec).toLocaleString().padStart(12)}`);
|
|
98
|
+
}
|
|
99
|
+
console.log('');
|
|
100
|
+
}
|
|
101
|
+
function emitChildResult(result) {
|
|
102
|
+
process.stdout.write(`${CHILD_RESULT_PREFIX}${JSON.stringify(result)}\n`);
|
|
103
|
+
}
|
|
104
|
+
function getChildOutput(error) {
|
|
105
|
+
if (!(error instanceof Error)) {
|
|
106
|
+
return '';
|
|
107
|
+
}
|
|
108
|
+
const stdout = 'stdout' in error && typeof error.stdout === 'string' ? error.stdout : '';
|
|
109
|
+
const stderr = 'stderr' in error && typeof error.stderr === 'string' ? error.stderr : '';
|
|
110
|
+
return [stdout, stderr].filter((part) => part.length > 0).join('\n');
|
|
111
|
+
}
|
|
112
|
+
function escapeRegExp(text) {
|
|
113
|
+
return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
114
|
+
}
|
|
115
|
+
function runBenchmarkInFreshProcess(testName) {
|
|
116
|
+
try {
|
|
117
|
+
const output = (0, child_process_1.execFileSync)(process.execPath, [
|
|
118
|
+
JEST_BIN_PATH,
|
|
119
|
+
__filename,
|
|
120
|
+
'--runInBand',
|
|
121
|
+
'--forceExit',
|
|
122
|
+
'--testTimeout=300000',
|
|
123
|
+
'--testNamePattern',
|
|
124
|
+
`^Tokenizer Benchmark ${escapeRegExp(testName)}$`,
|
|
125
|
+
], {
|
|
126
|
+
cwd: path.resolve(__dirname, '..', '..', '..'),
|
|
127
|
+
encoding: 'utf-8',
|
|
128
|
+
env: {
|
|
129
|
+
...process.env,
|
|
130
|
+
[CHILD_MODE_ENV]: '1',
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
const resultLine = output.split(/\r?\n/).find((line) => line.startsWith(CHILD_RESULT_PREFIX));
|
|
134
|
+
if (!resultLine) {
|
|
135
|
+
throw new Error(`Child benchmark for "${testName}" did not emit a result.\n${output}`);
|
|
136
|
+
}
|
|
137
|
+
return JSON.parse(resultLine.slice(CHILD_RESULT_PREFIX.length));
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
const output = getChildOutput(error);
|
|
141
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
142
|
+
throw new Error(`Child benchmark for "${testName}" failed.\n${message}${output ? `\n${output}` : ''}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
function benchmarkTokenize(corpusName, code) {
|
|
146
|
+
const times = [];
|
|
147
|
+
let tokenCount = 0;
|
|
148
|
+
for (let i = 0; i < WARMUP_ITERATIONS; i++) {
|
|
149
|
+
const tokenizer = new tokenizer_1.Tokenizer();
|
|
150
|
+
tokenizer.tokenize(code);
|
|
151
|
+
}
|
|
152
|
+
for (let i = 0; i < BENCHMARK_ITERATIONS; i++) {
|
|
153
|
+
const tokenizer = new tokenizer_1.Tokenizer();
|
|
154
|
+
const start = performance.now();
|
|
155
|
+
const results = tokenizer.tokenize(code);
|
|
156
|
+
const elapsed = performance.now() - start;
|
|
157
|
+
times.push(elapsed);
|
|
158
|
+
tokenCount = results.tokens.count;
|
|
159
|
+
}
|
|
160
|
+
const stats = calculateStats(times);
|
|
161
|
+
return {
|
|
162
|
+
corpus: corpusName,
|
|
163
|
+
fileSizeBytes: Buffer.byteLength(code, 'utf-8'),
|
|
164
|
+
iterations: BENCHMARK_ITERATIONS,
|
|
165
|
+
timesMs: times,
|
|
166
|
+
medianMs: stats.median,
|
|
167
|
+
p95Ms: stats.p95,
|
|
168
|
+
minMs: stats.min,
|
|
169
|
+
maxMs: stats.max,
|
|
170
|
+
avgMs: stats.avg,
|
|
171
|
+
tokenCount,
|
|
172
|
+
tokensPerSec: tokenCount / (stats.median / 1000),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
// --- Corpus definitions ---
|
|
176
|
+
const corpora = [
|
|
177
|
+
{ name: 'large_stdlib', file: 'large_stdlib.py' },
|
|
178
|
+
{ name: 'fstring_heavy', file: 'fstring_heavy.py' },
|
|
179
|
+
{ name: 'comment_heavy', file: 'comment_heavy.py' },
|
|
180
|
+
{ name: 'large_class', file: 'large_class.py' },
|
|
181
|
+
{ name: 'import_heavy', file: 'import_heavy.py' },
|
|
182
|
+
{ name: 'union_heavy', file: 'union_heavy.py' },
|
|
183
|
+
{ name: 'repetitive_identifiers', file: 'repetitive_identifiers.py' },
|
|
184
|
+
];
|
|
185
|
+
// --- Tests ---
|
|
186
|
+
const benchmarkSuite = process.env[RUN_BENCHMARKS_ENV] === '1' ? describe : describe.skip;
|
|
187
|
+
benchmarkSuite('Tokenizer Benchmark', () => {
|
|
188
|
+
const allResults = [];
|
|
189
|
+
const isChildProcess = process.env[CHILD_MODE_ENV] === '1';
|
|
190
|
+
for (const { name, file } of corpora) {
|
|
191
|
+
test(`tokenize ${name}`, () => {
|
|
192
|
+
const result = isChildProcess
|
|
193
|
+
? benchmarkTokenize(name, loadCorpus(file))
|
|
194
|
+
: runBenchmarkInFreshProcess(`tokenize ${name}`);
|
|
195
|
+
if (!isChildProcess) {
|
|
196
|
+
allResults.push(result);
|
|
197
|
+
}
|
|
198
|
+
console.log(` ${name}: median=${result.medianMs.toFixed(2)}ms, tokens=${result.tokenCount}, tok/sec=${Math.round(result.tokensPerSec).toLocaleString()}`);
|
|
199
|
+
if (isChildProcess) {
|
|
200
|
+
emitChildResult(result);
|
|
201
|
+
}
|
|
202
|
+
expect(result.tokenCount).toBeGreaterThan(0);
|
|
203
|
+
expect(result.medianMs).toBeLessThan(5000);
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
test('scaled corpus (10x large_stdlib)', () => {
|
|
207
|
+
const result = isChildProcess
|
|
208
|
+
? benchmarkTokenize('large_stdlib_10x', Array(10).fill(loadCorpus('large_stdlib.py')).join('\n'))
|
|
209
|
+
: runBenchmarkInFreshProcess('scaled corpus (10x large_stdlib)');
|
|
210
|
+
if (!isChildProcess) {
|
|
211
|
+
allResults.push(result);
|
|
212
|
+
}
|
|
213
|
+
console.log(` large_stdlib_10x: median=${result.medianMs.toFixed(2)}ms, tokens=${result.tokenCount}, tok/sec=${Math.round(result.tokensPerSec).toLocaleString()}`);
|
|
214
|
+
if (isChildProcess) {
|
|
215
|
+
emitChildResult(result);
|
|
216
|
+
}
|
|
217
|
+
expect(result.tokenCount).toBeGreaterThan(0);
|
|
218
|
+
});
|
|
219
|
+
afterAll(() => {
|
|
220
|
+
if (isChildProcess || allResults.length === 0) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
printResultTable(allResults);
|
|
224
|
+
const report = {
|
|
225
|
+
timestamp: new Date().toISOString(),
|
|
226
|
+
system: getSystemInfo(),
|
|
227
|
+
config: {
|
|
228
|
+
warmupIterations: WARMUP_ITERATIONS,
|
|
229
|
+
benchmarkIterations: BENCHMARK_ITERATIONS,
|
|
230
|
+
},
|
|
231
|
+
results: allResults,
|
|
232
|
+
};
|
|
233
|
+
writeReport(report);
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
//# sourceMappingURL=tokenizerBenchmark.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizerBenchmark.test.js","sourceRoot":"","sources":["../../../../../../src/tests/benchmarks/tokenizerBenchmark.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1410,7 +1410,8 @@ test('Lines1', () => {
|
|
|
1410
1410
|
});
|
|
1411
1411
|
test('Comments1', () => {
|
|
1412
1412
|
const t = new tokenizer_1.Tokenizer();
|
|
1413
|
-
const
|
|
1413
|
+
const text = '# hello\n# good bye\n\n\n""" test """ # another\n\n\npass';
|
|
1414
|
+
const results = t.tokenize(text);
|
|
1414
1415
|
assert_1.default.equal(results.tokens.count, 4 + _implicitTokenCount);
|
|
1415
1416
|
const token0 = results.tokens.getItemAt(0);
|
|
1416
1417
|
assert_1.default.equal(token0.type, 2 /* TokenType.NewLine */);
|
|
@@ -1439,7 +1440,8 @@ test('Comments1', () => {
|
|
|
1439
1440
|
});
|
|
1440
1441
|
test('Comments2', () => {
|
|
1441
1442
|
const t = new tokenizer_1.Tokenizer();
|
|
1442
|
-
const
|
|
1443
|
+
const text = 'class A:\n def func(self):\n pass\n # comment\n ';
|
|
1444
|
+
const results = t.tokenize(text);
|
|
1443
1445
|
assert_1.default.equal(results.tokens.count, 16 + _implicitTokenCount);
|
|
1444
1446
|
const token17 = results.tokens.getItemAt(17);
|
|
1445
1447
|
assert_1.default.equal(token17.type, 1 /* TokenType.EndOfStream */);
|
|
@@ -1524,6 +1526,19 @@ test('TypeIgnoreLine2', () => {
|
|
|
1524
1526
|
assert_1.default.equal(results.tokens.contains(41), true);
|
|
1525
1527
|
assert_1.default.equal(results.tokens.contains(42), false);
|
|
1526
1528
|
});
|
|
1529
|
+
test('TypeIgnoreLineMalformedBracket', () => {
|
|
1530
|
+
const t = new tokenizer_1.Tokenizer();
|
|
1531
|
+
const results = t.tokenize('a = 3 # type: ignore[broken');
|
|
1532
|
+
assert_1.default.equal(results.typeIgnoreLines.size, 0);
|
|
1533
|
+
});
|
|
1534
|
+
// A space-separated unclosed bracket (e.g. `# type: ignore [broken`) is also
|
|
1535
|
+
// rejected entirely. The tokenizer does not fall back to treating the
|
|
1536
|
+
// directive as "ignore all" when the bracket list is present but malformed.
|
|
1537
|
+
test('TypeIgnoreLineMalformedBracketWithSpace', () => {
|
|
1538
|
+
const t = new tokenizer_1.Tokenizer();
|
|
1539
|
+
const results = t.tokenize('a = 3 # type: ignore [broken');
|
|
1540
|
+
assert_1.default.equal(results.typeIgnoreLines.size, 0);
|
|
1541
|
+
});
|
|
1527
1542
|
// Regression test for https://github.com/microsoft/pyright/issues/11345.
|
|
1528
1543
|
// type: ignore comments containing tool-namespaced codes (e.g. "ty:rule-name")
|
|
1529
1544
|
// must be recognised as type: ignore comments.
|