Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save spytheman/89bd6cb6a1d53299d154dbcb3584aae3 to your computer and use it in GitHub Desktop.
Save spytheman/89bd6cb6a1d53299d154dbcb3584aae3 to your computer and use it in GitHub Desktop.
import time
type Task = fn (data voidptr)
pub fn (t Task) str() string {
return 'Task{ ${ptr_str(t)} }'
}
fn task_default(data voidptr) {
// println('task_default: $data')
}
fn task_zero(data voidptr) {
mut i := &int(data)
unsafe {
*i = 0
}
}
fn task_multiply_int(data voidptr) {
mut i := &int(data)
unsafe {
*i = *i * 100
}
}
struct Job {
mut:
task Task = task_default
data voidptr
}
fn (j Job) execute() {
t := j.task
if isnil(t) {
return
}
t(j.data)
}
fn (jobs []Job) execute() {
for j in jobs {
j.execute()
}
}
fn main() {
n := 1000 * 1000
mut data := [0].repeat(n)
mut jobs := [Job{
data: voidptr(0)
}].repeat(n)
for i := 0; i < jobs.len; i++ {
data[i] = i
jobs[i].data = unsafe { &data[i] }
match i % 3 {
0 { jobs[i].task = task_zero }
1 { jobs[i].task = task_multiply_int }
else {}
}
}
println('Before: data[at start]:' + data[0..10].str())
println('Before: data[at end]:' + data[data.len - 10..data.len].str())
sticks := time.ticks()
jobs.execute()
eticks := time.ticks()
println('After : data[at start]:' + data[0..10].str())
println('After : data[at end]:' + data[data.len - 10..data.len].str())
println('Execution took: ${eticks - sticks}ms')
}
@spytheman
Copy link
Author

#0 08:22:14 * master /v/cleanv $ ./v -cc clang-7 -prod run /v/misc/jobs_execution_1__updated_to_v_f321422.v
Note: building an optimized binary takes much longer. It shouldn't be used with `v run`.
Use `v run` without optimization, or build an optimized binary with -prod first, then run it separately.
Before:  data[at start]:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Before:  data[at   end]:[999990, 999991, 999992, 999993, 999994, 999995, 999996, 999997, 999998, 999999]
After :  data[at start]:[0, 100, 2, 0, 400, 5, 0, 700, 8, 0]
After :  data[at   end]:[0, 99999100, 999992, 0, 99999400, 999995, 0, 99999700, 999998, 0]
Execution took: 8ms
#0 08:22:23 * master /v/cleanv $ ./v -cc gcc-9 -prod run /v/misc/jobs_execution_1__updated_to_v_f321422.v
Note: building an optimized binary takes much longer. It shouldn't be used with `v run`.
Use `v run` without optimization, or build an optimized binary with -prod first, then run it separately.
Before:  data[at start]:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Before:  data[at   end]:[999990, 999991, 999992, 999993, 999994, 999995, 999996, 999997, 999998, 999999]
After :  data[at start]:[0, 100, 2, 0, 400, 5, 0, 700, 8, 0]
After :  data[at   end]:[0, 99999100, 999992, 0, 99999400, 999995, 0, 99999700, 999998, 0]
Execution took: 2ms
#0 08:22:32 * master /v/cleanv $ 
#0 08:22:37 * master /v/cleanv $ 
#0 08:22:38 * master /v/cleanv $ ./v -cc clang-7 run /v/misc/jobs_execution_1__updated_to_v_f321422.v
Before:  data[at start]:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Before:  data[at   end]:[999990, 999991, 999992, 999993, 999994, 999995, 999996, 999997, 999998, 999999]
After :  data[at start]:[0, 100, 2, 0, 400, 5, 0, 700, 8, 0]
After :  data[at   end]:[0, 99999100, 999992, 0, 99999400, 999995, 0, 99999700, 999998, 0]
Execution took: 17ms
#0 08:22:40 * master /v/cleanv $ ./v -cc gcc-9 run /v/misc/jobs_execution_1__updated_to_v_f321422.v
Before:  data[at start]:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Before:  data[at   end]:[999990, 999991, 999992, 999993, 999994, 999995, 999996, 999997, 999998, 999999]
After :  data[at start]:[0, 100, 2, 0, 400, 5, 0, 700, 8, 0]
After :  data[at   end]:[0, 99999100, 999992, 0, 99999400, 999995, 0, 99999700, 999998, 0]
Execution took: 18ms
#0 08:22:47 * master /v/cleanv $ 

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment