-- bench_array.lua — array operation benchmark (Lua)

local size = 100000
local clock = os.clock

local function bench_push()
  local a = {}
  for i = 0, size - 1 do
    a[#a + 1] = i
  end
  return #a
end

local function bench_index_write()
  local a = {}
  for i = 1, size do a[i] = 0 end
  for i = 1, size do
    a[i] = i - 1
  end
  return a[size]
end

local function bench_seq_read()
  local a = {}
  for i = 1, size do
    a[i] = i - 1
  end
  local s = 0
  for i = 1, size do
    s = s + a[i]
  end
  return s
end

local function bench_reverse()
  local a = {}
  for i = 1, size do
    a[i] = i - 1
  end
  local lo, hi = 1, size
  while lo < hi do
    a[lo], a[hi] = a[hi], a[lo]
    lo = lo + 1
    hi = hi - 1
  end
  return a[1]
end

local function bench_matrix()
  local n = 300
  local mat = {}
  for i = 1, n do
    mat[i] = {}
    for j = 1, n do
      mat[i][j] = (i - 1) * n + (j - 1)
    end
  end
  local s = 0
  for i = 1, n do
    s = s + mat[i][i]
  end
  return s
end

local function bench_filter_count()
  local a = {}
  for i = 1, size do
    a[i] = i - 1
  end
  local count = 0
  for i = 1, size do
    if a[i] % 2 == 0 then
      count = count + 1
    end
  end
  return count
end

local function run(name, fn)
  local start = clock()
  local result = fn()
  local elapsed = (clock() - start) * 1000
  print(string.format("  %s: %.2f ms  (result: %s)", name, elapsed, tostring(result)))
end

print("=== Array Benchmark ===")
print(string.format("  size: %d", size))
run("push         ", bench_push)
run("index_write  ", bench_index_write)
run("seq_read_sum ", bench_seq_read)
run("reverse      ", bench_reverse)
run("matrix_300   ", bench_matrix)
run("filter_count ", bench_filter_count)
