Skip to content

Commit d8ca15a

Browse files
authored
refact: cleanup function table in runtime (#70)
<!-- ps-id: ba34354a-2143-44a0-b2d7-4c5e0bcd4468 -->
1 parent 36aae73 commit d8ca15a

File tree

2 files changed

+260
-540
lines changed

2 files changed

+260
-540
lines changed

scripts/memory-perf.js

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,123 +11,125 @@ function analyzeMemoryUsage() {
1111

1212
// Test data
1313
const simpleData = { foo: { bar: 'baz' } };
14-
const arrayData = { items: Array.from({ length: 1000 }, (_, i) => ({
15-
id: i,
16-
name: `item${i}`,
17-
price: i * 10,
18-
tags: [`tag${i}`, `category${i % 10}`]
19-
})) };
20-
const nestedData = { level1: { level2: { level3: { level4: { value: 42 } } } } };
14+
const arrayData = {
15+
items: Array.from({ length: 1000 }, (_, i) => ({
16+
id: i,
17+
name: `item${i}`,
18+
price: i * 10,
19+
tags: [`tag${i}`, `category${i % 10}`],
20+
})),
21+
};
22+
const _nestedData = { level1: { level2: { level3: { level4: { value: 42 } } } } };
2123

2224
function measureMemory(name, fn, iterations = 10000) {
2325
// Force GC before measurement
2426
global.gc();
2527
const startMemory = process.memoryUsage();
26-
28+
2729
const startTime = process.hrtime.bigint();
2830
for (let i = 0; i < iterations; i++) {
2931
fn();
3032
}
3133
const endTime = process.hrtime.bigint();
32-
34+
3335
// Force GC after operations
3436
global.gc();
3537
const endMemory = process.memoryUsage();
36-
38+
3739
const memoryDelta = {
3840
heapUsed: endMemory.heapUsed - startMemory.heapUsed,
3941
heapTotal: endMemory.heapTotal - startMemory.heapTotal,
4042
external: endMemory.external - startMemory.external,
41-
rss: endMemory.rss - startMemory.rss
43+
rss: endMemory.rss - startMemory.rss,
4244
};
43-
45+
4446
const timeMs = Number(endTime - startTime) / 1000000;
4547
const avgTimePerOp = timeMs / iterations;
4648
const memoryPerOp = memoryDelta.heapUsed / iterations;
47-
49+
4850
console.log(`${name}:`);
4951
console.log(` Time: ${timeMs.toFixed(2)}ms (${avgTimePerOp.toFixed(4)}ms/op)`);
5052
console.log(` Memory per operation: ${memoryPerOp.toFixed(2)} bytes`);
5153
console.log(` Total heap delta: ${(memoryDelta.heapUsed / 1024 / 1024).toFixed(2)} MB`);
5254
console.log(` Operations/sec: ${(iterations / (timeMs / 1000)).toFixed(0)}`);
5355
console.log('');
54-
56+
5557
return { memoryPerOp, avgTimePerOp, opsPerSec: iterations / (timeMs / 1000) };
5658
}
5759

5860
// Parsing memory analysis
5961
console.log('=== PARSING MEMORY ANALYSIS ===');
60-
62+
6163
measureMemory('Simple Expression Parse', () => {
6264
jmespath.compile('foo.bar');
6365
});
64-
66+
6567
measureMemory('Complex Expression Parse', () => {
6668
jmespath.compile('items[?price > `500`].name');
6769
});
68-
70+
6971
measureMemory('Deep Nesting Parse', () => {
7072
jmespath.compile('level1.level2.level3.level4.value');
7173
});
72-
74+
7375
measureMemory('Function Call Parse', () => {
7476
jmespath.compile('sort_by(items, &price)');
7577
});
7678

7779
// Evaluation memory analysis
7880
console.log('=== EVALUATION MEMORY ANALYSIS ===');
79-
81+
8082
measureMemory('Simple Field Access', () => {
8183
jmespath.search(simpleData, 'foo.bar');
8284
});
83-
85+
8486
measureMemory('Array Projection', () => {
8587
jmespath.search(arrayData, 'items[*].name');
8688
});
87-
89+
8890
measureMemory('Filter Projection', () => {
8991
jmespath.search(arrayData, 'items[?price > `500`].name');
9092
});
91-
93+
9294
measureMemory('Function Call', () => {
9395
jmespath.search(arrayData, 'length(items)');
9496
});
95-
97+
9698
measureMemory('Complex Function', () => {
9799
jmespath.search(arrayData, 'sort_by(items, &price)');
98100
});
99101

100102
// Token allocation analysis
101103
console.log('=== TOKEN ALLOCATION ANALYSIS ===');
102-
104+
103105
measureMemory('Simple Tokenization', () => {
104106
jmespath.tokenize('foo.bar');
105107
});
106-
108+
107109
measureMemory('Complex Tokenization', () => {
108110
jmespath.tokenize('items[?price > `500` && contains(tags, `"category1"`)].name');
109111
});
110112

111113
// Combined parse + eval analysis
112114
console.log('=== COMBINED PARSE + EVAL ANALYSIS ===');
113-
115+
114116
measureMemory('Full Pipeline Simple', () => {
115117
jmespath.search(simpleData, 'foo.bar');
116118
});
117-
119+
118120
measureMemory('Full Pipeline Complex', () => {
119121
jmespath.search(arrayData, 'items[?price > `500`].name');
120122
});
121123

122124
// Pre-compiled vs fresh parse comparison
123125
console.log('=== PRE-COMPILED VS FRESH PARSE ===');
124-
126+
125127
const compiledExpr = jmespath.compile('items[?price > `500`].name');
126-
128+
127129
measureMemory('Fresh Parse + Eval', () => {
128130
jmespath.search(arrayData, 'items[?price > `500`].name');
129131
});
130-
132+
131133
measureMemory('Pre-compiled Eval', () => {
132134
jmespath.TreeInterpreter.search(compiledExpr, arrayData);
133135
});

0 commit comments

Comments
 (0)