142 lines
3.0 KiB
Plaintext
142 lines
3.0 KiB
Plaintext
// cli_tool.cm — CLI tool simulation (macro benchmark)
|
|
// Parse args + process data + transform + format output.
|
|
// Simulates a realistic small utility program.
|
|
|
|
var json = use('json')
|
|
|
|
// Generate fake records
|
|
function generate_records(n) {
|
|
var records = []
|
|
var x = 42
|
|
var i = 0
|
|
var status_vals = ["active", "inactive", "pending", "archived"]
|
|
var dept_vals = ["eng", "sales", "ops", "hr", "marketing"]
|
|
for (i = 0; i < n; i++) {
|
|
x = ((x * 1103515245 + 12345) & 0x7FFFFFFF) | 0
|
|
push(records, {
|
|
id: i + 1,
|
|
name: `user_${i}`,
|
|
score: (x % 1000) / 10,
|
|
status: status_vals[i % 4],
|
|
department: dept_vals[i % 5]
|
|
})
|
|
}
|
|
return records
|
|
}
|
|
|
|
// Filter records by field value
|
|
function filter_records(records, field, value) {
|
|
var result = []
|
|
var i = 0
|
|
for (i = 0; i < length(records); i++) {
|
|
if (records[i][field] == value) {
|
|
push(result, records[i])
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
|
|
// Group by a field
|
|
function group_by(records, field) {
|
|
var groups = {}
|
|
var i = 0
|
|
var key = null
|
|
for (i = 0; i < length(records); i++) {
|
|
key = records[i][field]
|
|
if (!key) key = "unknown"
|
|
if (!groups[key]) groups[key] = []
|
|
push(groups[key], records[i])
|
|
}
|
|
return groups
|
|
}
|
|
|
|
// Aggregate: compute stats per group
|
|
function aggregate(groups) {
|
|
var keys = array(groups)
|
|
var result = []
|
|
var i = 0
|
|
var j = 0
|
|
var grp = null
|
|
var total = 0
|
|
var mn = 0
|
|
var mx = 0
|
|
for (i = 0; i < length(keys); i++) {
|
|
grp = groups[keys[i]]
|
|
total = 0
|
|
mn = 999999
|
|
mx = 0
|
|
for (j = 0; j < length(grp); j++) {
|
|
total += grp[j].score
|
|
if (grp[j].score < mn) mn = grp[j].score
|
|
if (grp[j].score > mx) mx = grp[j].score
|
|
}
|
|
push(result, {
|
|
group: keys[i],
|
|
count: length(grp),
|
|
average: total / length(grp),
|
|
low: mn,
|
|
high: mx
|
|
})
|
|
}
|
|
return result
|
|
}
|
|
|
|
// Full pipeline: load → filter → sort → group → aggregate → encode
|
|
function run_pipeline(n_records) {
|
|
// Generate data
|
|
var records = generate_records(n_records)
|
|
|
|
// Filter to active records
|
|
var filtered = filter_records(records, "status", "active")
|
|
|
|
// Sort by score
|
|
filtered = sort(filtered, "score")
|
|
|
|
// Limit to first 50
|
|
if (length(filtered) > 50) {
|
|
filtered = array(filtered, 0, 50)
|
|
}
|
|
|
|
// Group and aggregate
|
|
var groups = group_by(filtered, "department")
|
|
var stats = aggregate(groups)
|
|
stats = sort(stats, "average")
|
|
|
|
// Encode as JSON
|
|
var output = json.encode(stats)
|
|
|
|
return length(output)
|
|
}
|
|
|
|
return {
|
|
// Small dataset (100 records)
|
|
cli_pipeline_100: function(n) {
|
|
var i = 0
|
|
var x = 0
|
|
for (i = 0; i < n; i++) {
|
|
x += run_pipeline(100)
|
|
}
|
|
return x
|
|
},
|
|
|
|
// Medium dataset (1000 records)
|
|
cli_pipeline_1k: function(n) {
|
|
var i = 0
|
|
var x = 0
|
|
for (i = 0; i < n; i++) {
|
|
x += run_pipeline(1000)
|
|
}
|
|
return x
|
|
},
|
|
|
|
// Large dataset (10K records)
|
|
cli_pipeline_10k: function(n) {
|
|
var i = 0
|
|
var x = 0
|
|
for (i = 0; i < n; i++) {
|
|
x += run_pipeline(10000)
|
|
}
|
|
return x
|
|
}
|
|
}
|