mirror of
https://github.com/vlang/v.git
synced 2025-09-13 14:32:26 +03:00
169 lines
2.7 KiB
V
169 lines
2.7 KiB
V
module benchmark
|
|
|
|
import time
|
|
|
|
// if n == 0, n predict == 1
|
|
fn test_predict_n_zero() {
|
|
mut b := Benchmark{
|
|
n: 0
|
|
duration: 0
|
|
bench_time: time.second
|
|
bench_func: fn () ! {}
|
|
}
|
|
expected := 1
|
|
println(b.predict_n())
|
|
assert b.predict_n() == expected
|
|
}
|
|
|
|
// n can't be more 1000000000
|
|
fn test_predict_n_limit() {
|
|
mut b := Benchmark{
|
|
n: 10000000000
|
|
duration: 0
|
|
bench_time: time.second
|
|
bench_func: fn () ! {}
|
|
}
|
|
expected := 1000000000
|
|
assert b.predict_n() == expected
|
|
}
|
|
|
|
// test prediction for slow bench function
|
|
fn test_slow_fn() {
|
|
mut b := Benchmark{
|
|
duration: time.second
|
|
bench_func: fn () ! {}
|
|
}
|
|
assert b.predict_n() == 1
|
|
}
|
|
|
|
// if bench_func cause error set failed true, n = 1
|
|
fn test_fn_with_error() {
|
|
f := fn () ! {
|
|
return error('error')
|
|
}
|
|
mut bench := setup(f) or {
|
|
eprintln('Error creating benchmark: ${err}')
|
|
return
|
|
}
|
|
|
|
bench.run()
|
|
|
|
assert bench.failed == true
|
|
assert bench.benchmark_result.n == 1
|
|
}
|
|
|
|
fn test_n_must_be_over_1() {
|
|
f := fn () ! {
|
|
mut i := 0
|
|
i++
|
|
}
|
|
mut bench := setup(f) or {
|
|
eprintln('Error creating benchmark: ${err}')
|
|
return
|
|
}
|
|
|
|
bench.run()
|
|
|
|
assert bench.benchmark_result.n > 1
|
|
}
|
|
|
|
fn test_n() {
|
|
f := fn () ! {
|
|
mut i := 0
|
|
i++
|
|
}
|
|
mut bench := setup(f, BenchmarkDefaults{
|
|
n: 1000
|
|
}) or {
|
|
eprintln('Error creating benchmark: ${err}')
|
|
return
|
|
}
|
|
|
|
bench.run()
|
|
|
|
assert bench.benchmark_result.n == 1000
|
|
}
|
|
|
|
fn test_max_bench_time() {
|
|
f := fn () ! {
|
|
time.sleep(500 * time.millisecond)
|
|
}
|
|
mut bench := setup(f) or {
|
|
eprintln('Error creating benchmark: ${err}')
|
|
return
|
|
}
|
|
|
|
bench.run()
|
|
|
|
assert bench.benchmark_result.n == 3
|
|
assert bench.benchmark_result.t >= time.second
|
|
}
|
|
|
|
fn test_performance() {
|
|
scheduler := [func_1, func_2, func_3]
|
|
expected := [false, false, false]
|
|
mut actual := []bool{}
|
|
|
|
for i in scheduler {
|
|
mut bench := setup(i) or {
|
|
eprintln('Error creating benchmark: ${err}')
|
|
return
|
|
}
|
|
|
|
bench.run()
|
|
actual << bench.failed
|
|
}
|
|
|
|
assert expected.len == actual.len
|
|
for i := 0; i < expected.len; i++ {
|
|
assert expected[i] == actual[i]
|
|
}
|
|
}
|
|
|
|
fn func_1() ! {
|
|
mut arr := []int{}
|
|
appender(mut arr)
|
|
assert arr.len == 10
|
|
}
|
|
|
|
fn appender(mut arr []int) {
|
|
if arr.len == 10 {
|
|
return
|
|
}
|
|
arr << 1
|
|
appender(mut arr)
|
|
}
|
|
|
|
fn func_2() ! {
|
|
target := 2
|
|
arr := [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
|
|
|
mut left := 0
|
|
mut right := arr.len - 1
|
|
|
|
for left <= right {
|
|
mid := left + (right - left) / 2
|
|
if arr[mid] == target {
|
|
return
|
|
}
|
|
if arr[mid] < target {
|
|
left = mid + 1
|
|
}
|
|
if arr[mid] > target {
|
|
right = mid - 1
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
fn func_3() ! {
|
|
mut arr := [10, 2, 13, 4, 5, 16, 7, 1, 9, 20]
|
|
|
|
for i := 0; i < arr.len - 1; i++ {
|
|
for j := 0; j < arr.len - i - 1; j++ {
|
|
if arr[j] > arr[j + 1] {
|
|
arr[j], arr[j + 1] = arr[j + 1], arr[j]
|
|
}
|
|
}
|
|
}
|
|
}
|