// bench_object.js — object/string/call benchmark (QuickJS)

const iterations = 200000;

function bench_record_create() {
  let r;
  for (let i = 0; i < iterations; i++) {
    r = {x: i, y: i + 1, z: i + 2};
  }
  return r.z;
}

function bench_prop_read() {
  const obj = {x: 10, y: 20, z: 30, w: 40};
  let s = 0;
  for (let i = 0; i < iterations; i++) {
    s = s + obj.x + obj.y + obj.z + obj.w;
  }
  return s;
}

function bench_dynamic_prop() {
  const obj = {a: 1, b: 2, c: 3, d: 4, e: 5};
  const keys = ["a", "b", "c", "d", "e"];
  let s = 0;
  for (let i = 0; i < iterations; i++) {
    for (let j = 0; j < 5; j++) {
      s = s + obj[keys[j]];
    }
  }
  return s;
}

function bench_string_concat() {
  let s = "";
  const n = 10000;
  for (let i = 0; i < n; i++) {
    s = s + "x";
  }
  return s.length;
}

function bench_interpolation() {
  let s = "";
  const n = 50000;
  for (let i = 0; i < n; i++) {
    s = `item_${i}`;
  }
  return s;
}

function make_point(x, y) {
  return {
    x: x,
    y: y,
    sum: function(self) {
      return self.x + self.y;
    }
  };
}

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

function fib(n) {
  if (n <= 1) return n;
  return fib(n - 1) + fib(n - 2);
}

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

function run(name, fn) {
  const start = performance.now();
  const result = fn();
  const elapsed = performance.now() - start;
  console.log(`  ${name}: ${elapsed.toFixed(2)} ms  (result: ${result})`);
}

console.log("=== Object / String / Call Benchmark ===");
console.log(`  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);
