114 lines
2.1 KiB
Plaintext
114 lines
2.1 KiB
Plaintext
// bench_array.ce — array operation benchmark
|
|
// Tests: sequential access, push/build, index write, sum reduction, sort
|
|
|
|
var time = use('time')
|
|
|
|
def size = 100000
|
|
|
|
// 1. Build array with push
|
|
function bench_push() {
|
|
var a = []
|
|
var i = 0
|
|
for (i = 0; i < size; i++) {
|
|
a[] = i
|
|
}
|
|
return length(a)
|
|
}
|
|
|
|
// 2. Index write into preallocated array
|
|
function bench_index_write() {
|
|
var a = array(size, 0)
|
|
var i = 0
|
|
for (i = 0; i < size; i++) {
|
|
a[i] = i
|
|
}
|
|
return a[size - 1]
|
|
}
|
|
|
|
// 3. Sequential read and sum
|
|
function bench_seq_read() {
|
|
var a = array(size, 0)
|
|
var i = 0
|
|
for (i = 0; i < size; i++) {
|
|
a[i] = i
|
|
}
|
|
var s = 0
|
|
for (i = 0; i < size; i++) {
|
|
s = s + a[i]
|
|
}
|
|
return s
|
|
}
|
|
|
|
// 4. Reverse array in-place
|
|
function bench_reverse() {
|
|
var a = array(size, 0)
|
|
var i = 0
|
|
for (i = 0; i < size; i++) {
|
|
a[i] = i
|
|
}
|
|
var lo = 0
|
|
var hi = size - 1
|
|
var tmp = 0
|
|
while (lo < hi) {
|
|
tmp = a[lo]
|
|
a[lo] = a[hi]
|
|
a[hi] = tmp
|
|
lo = lo + 1
|
|
hi = hi - 1
|
|
}
|
|
return a[0]
|
|
}
|
|
|
|
// 5. Nested array access (matrix-like, 300x300)
|
|
function bench_matrix() {
|
|
def n = 300
|
|
var mat = array(n, null)
|
|
var i = 0
|
|
var j = 0
|
|
for (i = 0; i < n; i++) {
|
|
mat[i] = array(n, 0)
|
|
for (j = 0; j < n; j++) {
|
|
mat[i][j] = i * n + j
|
|
}
|
|
}
|
|
// sum diagonal
|
|
var s = 0
|
|
for (i = 0; i < n; i++) {
|
|
s = s + mat[i][i]
|
|
}
|
|
return s
|
|
}
|
|
|
|
// 6. filter-like: count evens
|
|
function bench_filter_count() {
|
|
var a = array(size, 0)
|
|
var i = 0
|
|
for (i = 0; i < size; i++) {
|
|
a[i] = i
|
|
}
|
|
var count = 0
|
|
for (i = 0; i < size; i++) {
|
|
if (a[i] % 2 == 0) {
|
|
count = count + 1
|
|
}
|
|
}
|
|
return count
|
|
}
|
|
|
|
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("=== Array Benchmark ===")
|
|
log.console(` size: ${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)
|