// bench_arith.ce — arithmetic and number crunching benchmark
// Tests: integer add/mul, float ops, loop counter overhead, conditionals

var time = use('time')

def iterations = 2000000

// 1. Integer sum in tight loop
function bench_int_sum() {
  var i = 0
  var s = 0
  for (i = 0; i < iterations; i++) {
    s = s + i
  }
  return s
}

// 2. Integer multiply + mod (sieve-like)
function bench_int_mul_mod() {
  var i = 0
  var s = 0
  for (i = 1; i < iterations; i++) {
    s = s + (i * 7 % 1000)
  }
  return s
}

// 3. Float math — accumulate with division
function bench_float_arith() {
  var i = 0
  var s = 0.5
  for (i = 1; i < iterations; i++) {
    s = s + 1.0 / i
  }
  return s
}

// 4. Nested loop with branch (fizzbuzz-like counter)
function bench_branch() {
  var i = 0
  var fizz = 0
  var buzz = 0
  var fizzbuzz = 0
  for (i = 1; i <= iterations; i++) {
    if (i % 15 == 0) {
      fizzbuzz = fizzbuzz + 1
    } else if (i % 3 == 0) {
      fizz = fizz + 1
    } else if (i % 5 == 0) {
      buzz = buzz + 1
    }
  }
  return fizz + buzz + fizzbuzz
}

// 5. Nested loop (small inner)
function bench_nested() {
  var i = 0
  var j = 0
  var s = 0
  def outer = 5000
  def inner = 5000
  for (i = 0; i < outer; i++) {
    for (j = 0; j < inner; j++) {
      s = s + 1
    }
  }
  return s
}

// Run each and print timing
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("=== Arithmetic Benchmark ===")
log.console(`  iterations: ${iterations}`)
run("int_sum      ", bench_int_sum)
run("int_mul_mod  ", bench_int_mul_mod)
run("float_arith  ", bench_float_arith)
run("branch       ", bench_branch)
run("nested_loop  ", bench_nested)
