Skip to content

Commit e52f768

Browse files
committed
Switch more tests to val, make further optimizations.
1 parent 2b22100 commit e52f768

File tree

6 files changed

+21
-14
lines changed

6 files changed

+21
-14
lines changed

compiler.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ function buildString (method, buildState = {}) {
205205
}
206206

207207
let coerce = engine.methods[func].optimizeUnary ? '' : 'coerceArray'
208-
if (!coerce && Array.isArray(lower) && lower.length === 1) lower = lower[0]
208+
if (!coerce && Array.isArray(lower) && lower.length === 1 && !Array.isArray(lower[0])) lower = lower[0]
209209
else if (coerce && Array.isArray(lower)) coerce = ''
210210

211211
const argumentsDict = [', context', ', context, above', ', context, above, engine']

defaultMethods.js

+10-3
Original file line numberDiff line numberDiff line change
@@ -341,8 +341,9 @@ const defaultMethods = {
341341
},
342342
val: {
343343
[OriginalImpl]: true,
344+
[Sync]: true,
344345
method: (args, context, above, engine, /** @type {null | Symbol} */ unFound = null) => {
345-
if (Array.isArray(args) && args.length === 1) args = args[0]
346+
if (Array.isArray(args) && args.length === 1 && !Array.isArray(args[0])) args = args[0]
346347
// A unary optimization
347348
if (!Array.isArray(args)) {
348349
if (unFound && !(context && args in context)) return unFound
@@ -406,7 +407,10 @@ const defaultMethods = {
406407
}
407408
if (Array.isArray(data) && data.length === 1) data = data[0]
408409
if (data === null) return wrapNull(buildState.compile`context`)
409-
if (!Array.isArray(data)) return wrapNull(buildState.compile`(context || 0)[${data}]`)
410+
if (!Array.isArray(data)) {
411+
if (chainingSupported) return wrapNull(buildState.compile`context?.[${data}]`)
412+
return wrapNull(buildState.compile`(context || 0)[${data}]`)
413+
}
410414
if (Array.isArray(data)) {
411415
let res = buildState.compile`context`
412416
for (let i = 0; i < data.length; i++) {
@@ -560,7 +564,10 @@ const defaultMethods = {
560564
if (typeof arr === 'string') return arr
561565
if (!Array.isArray(arr)) return arr.toString()
562566
let res = ''
563-
for (let i = 0; i < arr.length; i++) res += arr[i].toString()
567+
for (let i = 0; i < arr.length; i++) {
568+
if (arr[i] === null || arr[i] === undefined) continue
569+
res += arr[i]
570+
}
564571
return res
565572
},
566573
deterministic: true,

perf.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ async function test () {
44
const logic = {
55
if: [
66
{
7-
'>': [{ var: 'x' }, { '+': [11, 5, { '+': [1, { var: 'y' }, 1] }, 2] }]
7+
'>': [{ val: 'x' }, { '+': [11, 5, { '+': [1, { val: 'y' }, 1] }, 2] }]
88
},
99
{
10-
'*': [{ var: 'x' }, { '*': { map: [[2, 5, 5], { var: '' }] } }]
10+
'*': [{ val: 'x' }, { '*': { map: [[2, 5, 5], { val: [] }] } }]
1111
},
1212
{
13-
'/': [{ var: 'x' }, { '-': { map: [[100, 50, 30, 10], { var: '' }] } }]
13+
'/': [{ val: 'x' }, { '-': { map: [[100, 50, 30, 10], { val: [] }] } }]
1414
}
1515
]
1616
}

perf2.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ async function main () {
88
const logic = {
99
if: [
1010
{
11-
'>': [{ var: 'x' }, { '+': [11, 5, { '+': [1, { var: 'y' }, 1] }, 2] }]
11+
'>': [{ val: 'x' }, { '+': [11, 5, { '+': [1, { val: 'y' }, 1] }, 2] }]
1212
},
1313
{
14-
'*': [{ var: 'x' }, { '*': { map: [[2, 5, 5], { var: '' }] } }]
14+
'*': [{ val: 'x' }, { '*': { map: [[2, 5, 5], { val: [] }] } }]
1515
},
1616
{
17-
'/': [{ var: 'x' }, { '-': { map: [[100, 50, 30, 10], { var: '' }] } }]
17+
'/': [{ val: 'x' }, { '-': { map: [[100, 50, 30, 10], { val: [] }] } }]
1818
}
1919
]
2020
}

perf3.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { LogicEngine } from './index.js'
22
const x = new LogicEngine()
3-
const f = x.build({ '<': [{ var: '' }, 10] })
3+
const f = x.build({ '<': [{ val: [] }, 10] })
44
console.time('Logic Built')
55
for (let i = 0; i < 1e6; i++) {
66
f(i % 20)

perf4.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { LogicEngine } from './index.js'
44
const optimized = new LogicEngine()
55
const unoptimized = new LogicEngine(undefined, { disableInterpretedOptimization: true })
66

7-
const dynamicRule = { '+': [1, 2, 3, { var: 'a' }] }
7+
const dynamicRule = { '+': [1, 2, 3, { val: 'a' }] }
88
const staticRule = { '+': [1, 2, 3, 4] }
99

1010
console.time('Optimized, Same Object, Dynamic')
@@ -35,7 +35,7 @@ console.log('----')
3535

3636
console.time('Optimized, Different Object, Dynamic')
3737
for (let i = 0; i < 1e6; i++) {
38-
optimized.run({ '+': [1, 2, 3, { var: 'a' }] }, { a: i })
38+
optimized.run({ '+': [1, 2, 3, { val: 'a' }] }, { a: i })
3939
}
4040
console.timeEnd('Optimized, Different Object, Dynamic')
4141

@@ -49,7 +49,7 @@ console.timeEnd('Optimized, Different Object, Static')
4949

5050
console.time('Unoptimized, Different Object, Dynamic')
5151
for (let i = 0; i < 1e6; i++) {
52-
unoptimized.run({ '+': [1, 2, 3, { var: 'a' }] }, { a: i })
52+
unoptimized.run({ '+': [1, 2, 3, { val: 'a' }] }, { a: i })
5353
}
5454
console.timeEnd('Unoptimized, Different Object, Dynamic')
5555

0 commit comments

Comments
 (0)