-
Notifications
You must be signed in to change notification settings - Fork 346
Description
When running cue cmd, CUE evaluates the entire package including all imported modules, even when a command only references a small subset of data. This causes unnecessary performance overhead.
I have two commands:
show-static- prints a simple static struct{one: 1, two: 2}(does NOT use any heavy computation)show-heavy- prints keys from a heavily computed result (generated by AI here)
The heavy module generates 1000 items with deeply nested closed structs and unification operations.
Reproducer (txtar):
exec cue cmd show-static
exec cue cmd show-heavy
-- cue.mod/module.cue --
module: "github.com/selfuryon/test@v0"
language: {
version: "v0.15.3"
}
-- ext_tool.cue --
package main
import (
"encoding/json"
"tool/cli"
"github.com/selfuryon/test/module"
)
static: {
one: 1
two: 2
}
keys: [for name, _ in module.heavyResult {name}]
command: "show-static": print: cli.Print & {
text: json.Marshal(static)
}
command: "show-heavy": print: cli.Print & {
text: json.Marshal(keys)
}
-- module/heavy_computation.cue --
package module
import "list"
#Field: {
name: string
value: string | int | bool
enabled: bool
meta?: #Meta
}
#Meta: {
tag: string
priority: int
labels?: #Labels
}
#Labels: {
env: "dev" | "staging" | "prod"
region: "us" | "eu" | "asia"
tier: "free" | "pro" | "enterprise"
extra?: #ExtraLabels
}
#ExtraLabels: {
owner: string
team: string
project: string
version?: string
}
#Level5: {
id: string
field1: #Field
field2: #Field
field3: #Field
}
#Level4: {
name: string
nested: #Level5
items: [...#Level5]
}
#Level3: {
config: #Level4
backup: #Level4
meta: #Meta
}
#Level2: {
primary: #Level3
secondary: #Level3
labels: #Labels
}
#Level1: {
main: #Level2
fallback: #Level2
extra: #ExtraLabels
}
#Root: {
data: #Level1
schema: #Level1
}
// Generate items with deep unification against closed schemas
_items: [
for i in list.Range(0, 1000, 1) {
#Root & {
data: #Level1 & {
main: #Level2 & {
primary: #Level3 & {
config: #Level4 & {
name: "cfg_\(i)"
nested: #Level5 & {
id: "n_\(i)"
field1: #Field & {name: "f1", value: "v\(i)", enabled: true, meta: #Meta & {ta
"us", tier: "pro", extra: #ExtraLabels & {owner: "o", team: "t", project: "p"}}}}
field2: #Field & {name: "f2", value: i, enabled: true, meta: #Meta & {tag: "t2
tier: "pro", extra: #ExtraLabels & {owner: "o", team: "t", project: "p"}}}}
field3: #Field & {name: "f3", value: true, enabled: true, meta: #Meta & {tag:
"us", tier: "pro", extra: #ExtraLabels & {owner: "o", team: "t", project: "p"}}}}
}
items: [
#Level5 & {id: "i1_\(i)", field1: #Field & {name: "a", value: "x", enabled: tr
field3: #Field & {name: "c", value: true, enabled: true}},
#Level5 & {id: "i2_\(i)", field1: #Field & {name: "a", value: "y", enabled: tr
field3: #Field & {name: "c", value: false, enabled: true}},
]
}
backup: #Level4 & {
name: "bak_\(i)"
nested: #Level5 & {
id: "bn_\(i)"
field1: #Field & {name: "bf1", value: "bv", enabled: true}
field2: #Field & {name: "bf2", value: i * 2, enabled: true}
field3: #Field & {name: "bf3", value: false, enabled: true}
}
items: [#Level5 & {id: "bi_\(i)", field1: #Field & {name: "ba", value: "bx", enabled:
enabled: true}, field3: #Field & {name: "bc", value: true, enabled: true}}]
}
meta: #Meta & {tag: "m_\(i)", priority: i, labels: #Labels & {env: "prod", region: "eu", tier:
"o\(i)", team: "t\(i)", project: "p\(i)"}}}
}
secondary: #Level3 & {
config: #Level4 & {
name: "scfg_\(i)"
nested: #Level5 & {id: "sn_\(i)", field1: #Field & {name: "sf1", value: "sv", enabled:
enabled: true}, field3: #Field & {name: "sf3", value: true, enabled: true}}
items: []
}
backup: #Level4 & {
name: "sbak_\(i)"
nested: #Level5 & {id: "sbn_\(i)", field1: #Field & {name: "sbf1", value: "sbv", enabl
enabled: true}, field3: #Field & {name: "sbf3", value: false, enabled: true}}
items: []
}
meta: #Meta & {tag: "sm_\(i)", priority: i}
}
labels: #Labels & {env: "staging", region: "asia", tier: "free", extra: #ExtraLabels & {owner: "lo\(i)
}
fallback: #Level2 & {
primary: #Level3 & {
config: #Level4 & {name: "fcfg_\(i)", nested: #Level5 & {id: "fn_\(i)", field1: #Field & {name
#Field & {name: "ff2", value: i, enabled: true}, field3: #Field & {name: "ff3", value: true, enabled: true}}, items: []}
backup: #Level4 & {name: "fbak_\(i)", nested: #Level5 & {id: "fbn_\(i)", field1: #Field & {nam
field2: #Field & {name: "fbf2", value: i, enabled: true}, field3: #Field & {name: "fbf3", value: false, enabled: true}}, items: []}
meta: #Meta & {tag: "fm_\(i)", priority: i}
}
secondary: #Level3 & {
config: #Level4 & {name: "fscfg_\(i)", nested: #Level5 & {id: "fsn_\(i)", field1: #Field & {na
field2: #Field & {name: "fsf2", value: i, enabled: true}, field3: #Field & {name: "fsf3", value: true, enabled: true}}, items: []}
backup: #Level4 & {name: "fsbak_\(i)", nested: #Level5 & {id: "fsbn_\(i)", field1: #Field & {n
field2: #Field & {name: "fsbf2", value: i, enabled: true}, field3: #Field & {name: "fsbf3", value: false, enabled: true}}, items: []}
meta: #Meta & {tag: "fsm_\(i)", priority: i}
}
labels: #Labels & {env: "dev", region: "us", tier: "pro"}
}
extra: #ExtraLabels & {owner: "own_\(i)", team: "team_\(i)", project: "proj_\(i)"}
}
schema: #Level1 & {
main: #Level2 & {
primary: #Level3 & {
config: #Level4 & {name: "xcfg_\(i)", nested: #Level5 & {id: "xn_\(i)", field1: #Field & {name
#Field & {name: "xf2", value: i, enabled: true}, field3: #Field & {name: "xf3", value: true, enabled: true}}, items: []}
backup: #Level4 & {name: "xbak_\(i)", nested: #Level5 & {id: "xbn_\(i)", field1: #Field & {nam
field2: #Field & {name: "xbf2", value: i, enabled: true}, field3: #Field & {name: "xbf3", value: false, enabled: true}}, items: []}
meta: #Meta & {tag: "xm_\(i)", priority: i}
}
secondary: #Level3 & {
config: #Level4 & {name: "xscfg_\(i)", nested: #Level5 & {id: "xsn_\(i)", field1: #Field & {na
field2: #Field & {name: "xsf2", value: i, enabled: true}, field3: #Field & {name: "xsf3", value: true, enabled: true}}, items: []}
backup: #Level4 & {name: "xsbak_\(i)", nested: #Level5 & {id: "xsbn_\(i)", field1: #Field & {n
field2: #Field & {name: "xsbf2", value: i, enabled: true}, field3: #Field & {name: "xsbf3", value: false, enabled: true}}, items: []}
meta: #Meta & {tag: "xsm_\(i)", priority: i}
}
labels: #Labels & {env: "prod", region: "eu", tier: "enterprise"}
}
fallback: #Level2 & {
primary: #Level3 & {
config: #Level4 & {name: "ycfg_\(i)", nested: #Level5 & {id: "yn_\(i)", field1: #Field & {name
#Field & {name: "yf2", value: i, enabled: true}, field3: #Field & {name: "yf3", value: true, enabled: true}}, items: []}
backup: #Level4 & {name: "ybak_\(i)", nested: #Level5 & {id: "ybn_\(i)", field1: #Field & {nam
field2: #Field & {name: "ybf2", value: i, enabled: true}, field3: #Field & {name: "ybf3", value: false, enabled: true}}, items: []}
meta: #Meta & {tag: "ym_\(i)", priority: i}
}
secondary: #Level3 & {
config: #Level4 & {name: "yscfg_\(i)", nested: #Level5 & {id: "ysn_\(i)", field1: #Field & {na
field2: #Field & {name: "ysf2", value: i, enabled: true}, field3: #Field & {name: "ysf3", value: true, enabled: true}}, items: []}
backup: #Level4 & {name: "ysbak_\(i)", nested: #Level5 & {id: "ysbn_\(i)", field1: #Field & {n
field2: #Field & {name: "ysbf2", value: i, enabled: true}, field3: #Field & {name: "ysbf3", value: false, enabled: true}}, items: []}
meta: #Meta & {tag: "ysm_\(i)", priority: i}
}
labels: #Labels & {env: "staging", region: "asia", tier: "free"}
}
extra: #ExtraLabels & {owner: "xown_\(i)", team: "xteam_\(i)", project: "xproj_\(i)"}
}
}
},
]
heavyResult: {
one: {for i in list.Range(0, 100, 1) {"item_\(i)": _items[i]}}
two: {for i in list.Range(100, 200, 1) {"item_\(i)": _items[i]}}
three: {for i in list.Range(200, 300, 1) {"item_\(i)": _items[i]}}
four: {for i in list.Range(300, 400, 1) {"item_\(i)": _items[i]}}
five: {for i in list.Range(400, 500, 1) {"item_\(i)": _items[i]}}
six: {for i in list.Range(500, 600, 1) {"item_\(i)": _items[i]}}
seven: {for i in list.Range(600, 700, 1) {"item_\(i)": _items[i]}}
eight: {for i in list.Range(700, 800, 1) {"item_\(i)": _items[i]}}
nine: {for i in list.Range(800, 900, 1) {"item_\(i)": _items[i]}}
ten: {for i in list.Range(900, 1000, 1) {"item_\(i)": _items[i]}}
}
What did you expect to see?
cue cmd show-static should execute almost instantly since it only outputs a simple static struct {"one":1,"two":2} and does not reference module.heavyResult at all.
Expected timing:
- show-static: ~0.1s (no heavy computation needed)
- show-heavy: ~2s (heavy computation required)
What did you see instead?
Both commands take approximately the same time (~2s), because CUE evaluates the entire package including all imported modules regardless of what the command actually uses:
$ time cue cmd show-static
{"one":1,"two":2}
real 0m1.880s
user 0m2.862s
sys 0m0.178s
$ time cue cmd show-heavy
["one","two","three","four","five","six","seven","eight","nine","ten"]
real 0m2.242s
user 0m3.209s
sys 0m0.216sBut if I comment everything related to heavyResult in ext_tools.cue like this
package main
import (
"encoding/json"
"tool/cli"
// "github.com/selfuryon/test/module"
)
static: {
one: 1
two: 2
}
// keys: [for name, _ in module.heavyResult {name}]
command: "show-static": print: cli.Print & {
text: json.Marshal(static)
}
// command: "show-heavy": print: cli.Print & {
// text: json.Marshal(keys)
// }I get this results:
$ time cue cmd show-static
{"one":1,"two":2}
real 0m0.010s
user 0m0.002s
sys 0m0.008s