// bench_object.ce — object/record and string benchmark
// Tests: property read/write, string concat, string interpolation, method-like dispatch

var time = use('time')

def iterations = 200000

// 1. Record create + property write
function bench_record_create() {
  var i = 0
  var r = null
  for (i = 0; i < iterations; i++) {
    r = {x: i, y: i + 1, z: i + 2}
  }
  return r.z
}

// 2. Property read in loop
function bench_prop_read() {
  var obj = {x: 10, y: 20, z: 30, w: 40}
  var i = 0
  var s = 0
  for (i = 0; i < iterations; i++) {
    s = s + obj.x + obj.y + obj.z + obj.w
  }
  return s
}

// 3. Dynamic property access (computed keys)
function bench_dynamic_prop() {
  var obj = {a: 1, b: 2, c: 3, d: 4, e: 5}
  var keys = ["a", "b", "c", "d", "e"]
  var i = 0
  var j = 0
  var s = 0
  for (i = 0; i < iterations; i++) {
    for (j = 0; j < 5; j++) {
      s = s + obj[keys[j]]
    }
  }
  return s
}

// 4. String concatenation
function bench_string_concat() {
  var i = 0
  var s = ""
  def n = 10000
  for (i = 0; i < n; i++) {
    s = s + "x"
  }
  return length(s)
}

// 5. String interpolation
function bench_interpolation() {
  var i = 0
  var s = ""
  def n = 50000
  for (i = 0; i < n; i++) {
    s = `item_${i}`
  }
  return s
}

// 6. Prototype chain / method-like call
function make_point(x, y) {
  return {
    x: x,
    y: y,
    sum: function(self) {
      return self.x + self.y
    }
  }
}

function bench_method_call() {
  var p = make_point(3, 4)
  var i = 0
  var s = 0
  for (i = 0; i < iterations; i++) {
    s = s + p.sum(p)
  }
  return s
}

// 7. Function call overhead (simple recursion depth)
function fib(n) {
  if (n <= 1) return n
  return fib(n - 1) + fib(n - 2)
}

function bench_fncall() {
  var i = 0
  var s = 0
  for (i = 0; i < 20; i++) {
    s = s + fib(25)
  }
  return s
}

function run(name, fn) {
  var start = time.number()
  var result = fn()
  var elapsed = time.number() - start
  var ms = whole(elapsed * 100000) / 100
  log.console(`  ${name}: ${ms} ms  (result: ${result})`)
}

log.console("=== Object / String / Call Benchmark ===")
log.console(`  iterations: ${iterations}`)
run("record_create ", bench_record_create)
run("prop_read     ", bench_prop_read)
run("dynamic_prop  ", bench_dynamic_prop)
run("string_concat ", bench_string_concat)
run("interpolation ", bench_interpolation)
run("method_call   ", bench_method_call)
run("fncall_fib25  ", bench_fncall)
