-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy path_runner.pony
More file actions
134 lines (112 loc) · 2.92 KB
/
Copy path_runner.pony
File metadata and controls
134 lines (112 loc) · 2.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
use "time"
trait tag _Runner
be apply()
actor _RunSync is _Runner
let _ponybench: PonyBench
embed _aggregator: _Aggregator
let _name: String
let _bench: MicroBenchmark
new create(
ponybench: PonyBench,
benchmark: MicroBenchmark,
overhead: Bool)
=>
_ponybench = ponybench
_aggregator = _Aggregator(_ponybench, this, benchmark.config(), overhead)
_name = benchmark.name()
_bench = consume benchmark
apply()
be apply() =>
_bench.before()
_gc_next_behavior()
_run_iteration()
be _run_iteration(n: U64 = 0, a: U64 = 0) =>
if n == _aggregator.iterations then
_complete(a)
else
try \likely\
Time.perf_begin()
let s = Time.nanos()
_bench()?
let e = Time.nanos()
Time.perf_end()
_run_iteration(n + 1, a + (e - s))
else
_fail()
end
end
be _complete(t: U64) =>
_bench.after()
_aggregator.complete(_name, t)
be _fail() =>
_ponybench._fail(_name)
fun ref _gc_next_behavior() =>
@pony_triggergc[None](@pony_ctx[Pointer[None]]())
actor _RunAsync is _Runner
let _ponybench: PonyBench
embed _aggregator: _Aggregator
let _name: String
let _bench: AsyncMicroBenchmark ref
var _start_time: U64 = 0
var _n: U64 = 0
var _a: U64 = 0
embed _before_cont: AsyncBenchContinue =
AsyncBenchContinue._create(this, recover this~_apply_cont() end)
embed _bench_cont: AsyncBenchContinue =
AsyncBenchContinue._create(this, recover this~_run_iteration() end)
embed _after_cont: AsyncBenchContinue =
AsyncBenchContinue._create(this, recover this~_complete_cont() end)
new create(
ponybench: PonyBench,
benchmark: AsyncMicroBenchmark,
overhead: Bool)
=>
_ponybench = ponybench
_aggregator = _Aggregator(_ponybench, this, benchmark.config(), overhead)
_name = benchmark.name()
_bench = consume benchmark
apply()
be apply() =>
_bench.before(_before_cont)
be _apply_cont(e: U64) =>
_n = 0
_a = 0
_start_time = 0
_gc_next_behavior()
_run_iteration(0)
be _run_iteration(e: U64) =>
if _start_time > 0 then
_a = _a + (e - _start_time)
end
if _n == _aggregator.iterations then
_complete()
else
try \likely\
_n = _n + 1
Time.perf_begin()
_start_time = Time.nanos()
_bench(_bench_cont)?
else
_fail()
end
end
be _complete() =>
_bench.after(_after_cont)
be _complete_cont(e: U64) =>
_aggregator.complete(_name, _a)
be _fail() =>
_ponybench._fail(_name)
fun ref _gc_next_behavior() =>
@pony_triggergc[None](@pony_ctx[Pointer[None]]())
class val AsyncBenchContinue
let _run_async: _RunAsync
let _f: {(U64)} val
new val _create(run_async: _RunAsync, f: {(U64)} val) =>
_run_async = run_async
_f = f
fun complete() =>
let e = Time.nanos()
Time.perf_end()
_f(e)
fun fail() =>
_run_async._fail()