Skip to content

Commit 7d435cc

Browse files
committed
updates
1 parent 170c720 commit 7d435cc

File tree

18 files changed

+2309
-40
lines changed

18 files changed

+2309
-40
lines changed

crates/ovsm/ASYNC_AWAIT_GUIDE.md

Lines changed: 426 additions & 0 deletions
Large diffs are not rendered by default.

crates/ovsm/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ solana_rbpf = "0.8.5"
8888
name = "execution_bench"
8989
harness = false
9090

91+
[[bench]]
92+
name = "async_bench"
93+
harness = false
94+
9195
[features]
9296
default = ["stdlib", "agents"]
9397
stdlib = []

crates/ovsm/benches/async_bench.rs

Lines changed: 241 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,241 @@
1+
use criterion::{black_box, criterion_group, criterion_main, Criterion, BenchmarkId};
2+
use ovsm::runtime::LispEvaluator;
3+
4+
/// Benchmark sequential vs concurrent execution
5+
fn bench_sequential_vs_concurrent(c: &mut Criterion) {
6+
let mut group = c.benchmark_group("sequential_vs_concurrent");
7+
8+
for size in [10, 50, 100].iter() {
9+
// Sequential benchmark
10+
group.bench_with_input(BenchmarkId::new("sequential", size), size, |b, &size| {
11+
b.iter(|| {
12+
let mut evaluator = LispEvaluator::new();
13+
let code = format!(
14+
r#"
15+
(do
16+
(defun compute (x) (* x x))
17+
18+
(define results [])
19+
(for (i (range 1 {}))
20+
(set! results (append results [(compute i)])))
21+
22+
(length results))
23+
"#,
24+
size + 1
25+
);
26+
27+
black_box(evaluator.eval_str(&code).unwrap())
28+
});
29+
});
30+
31+
// Concurrent benchmark
32+
group.bench_with_input(BenchmarkId::new("concurrent", size), size, |b, &size| {
33+
b.iter(|| {
34+
let mut evaluator = LispEvaluator::new();
35+
let code = format!(
36+
r#"
37+
(do
38+
(defun compute (x) (* x x))
39+
40+
(define handles [])
41+
(for (i (range 1 {}))
42+
(set! handles (append handles [(async compute i)])))
43+
44+
(define results [])
45+
(for (h handles)
46+
(set! results (append results [(await h)])))
47+
48+
(length results))
49+
"#,
50+
size + 1
51+
);
52+
53+
black_box(evaluator.eval_str(&code).unwrap())
54+
});
55+
});
56+
}
57+
58+
group.finish();
59+
}
60+
61+
/// Benchmark task creation overhead
62+
fn bench_async_overhead(c: &mut Criterion) {
63+
let mut group = c.benchmark_group("async_overhead");
64+
65+
group.bench_function("create_handle", |b| {
66+
b.iter(|| {
67+
let mut evaluator = LispEvaluator::new();
68+
let code = r#"
69+
(do
70+
(defun noop (x) x)
71+
(async noop 42))
72+
"#;
73+
black_box(evaluator.eval_str(code).unwrap())
74+
});
75+
});
76+
77+
group.bench_function("create_and_await", |b| {
78+
b.iter(|| {
79+
let mut evaluator = LispEvaluator::new();
80+
let code = r#"
81+
(do
82+
(defun noop (x) x)
83+
(define h (async noop 42))
84+
(await h))
85+
"#;
86+
black_box(evaluator.eval_str(code).unwrap())
87+
});
88+
});
89+
90+
group.finish();
91+
}
92+
93+
/// Benchmark batch processing
94+
fn bench_batch_processing(c: &mut Criterion) {
95+
let mut group = c.benchmark_group("batch_processing");
96+
97+
for batch_size in [10, 50, 100].iter() {
98+
group.bench_with_input(
99+
BenchmarkId::new("concurrent_batch", batch_size),
100+
batch_size,
101+
|b, &size| {
102+
b.iter(|| {
103+
let mut evaluator = LispEvaluator::new();
104+
let code = format!(
105+
r#"
106+
(do
107+
(defun process (x)
108+
(do
109+
(sleep 5)
110+
(* x 2)))
111+
112+
(define handles [])
113+
(for (i (range 1 {}))
114+
(set! handles (append handles [(async process i)])))
115+
116+
(define results [])
117+
(for (h handles)
118+
(set! results (append results [(await h)])))
119+
120+
(length results))
121+
"#,
122+
size + 1
123+
);
124+
125+
black_box(evaluator.eval_str(&code).unwrap())
126+
});
127+
},
128+
);
129+
}
130+
131+
group.finish();
132+
}
133+
134+
/// Benchmark map-reduce pattern
135+
fn bench_map_reduce(c: &mut Criterion) {
136+
c.bench_function("map_reduce_100_items", |b| {
137+
b.iter(|| {
138+
let mut evaluator = LispEvaluator::new();
139+
let code = r#"
140+
(do
141+
(defun mapper (chunk-id data-chunk)
142+
(do
143+
(define sum 0)
144+
(for (val data-chunk)
145+
(set! sum (+ sum val)))
146+
{:chunk-id chunk-id :sum sum}))
147+
148+
(define data (range 1 101))
149+
(define chunks [
150+
(take 25 data)
151+
(take 25 (drop 25 data))
152+
(take 25 (drop 50 data))
153+
(take 25 (drop 75 data))
154+
])
155+
156+
;; Map phase
157+
(define handles [])
158+
(define chunk-id 0)
159+
(for (chunk chunks)
160+
(do
161+
(set! handles (append handles [(async mapper chunk-id chunk)]))
162+
(set! chunk-id (+ chunk-id 1))))
163+
164+
(define map-results [])
165+
(for (h handles)
166+
(set! map-results (append map-results [(await h)])))
167+
168+
;; Reduce phase
169+
(define total 0)
170+
(for (r map-results)
171+
(set! total (+ total (get r :sum))))
172+
173+
total)
174+
"#;
175+
176+
black_box(evaluator.eval_str(code).unwrap())
177+
});
178+
});
179+
}
180+
181+
/// Benchmark factorial computation (CPU-intensive)
182+
fn bench_factorial_concurrent(c: &mut Criterion) {
183+
c.bench_function("factorial_concurrent_10_tasks", |b| {
184+
b.iter(|| {
185+
let mut evaluator = LispEvaluator::new();
186+
let code = r#"
187+
(do
188+
(defun factorial (n)
189+
(if (<= n 1)
190+
1
191+
(* n (factorial (- n 1)))))
192+
193+
(define handles [])
194+
(for (n (range 10 21))
195+
(set! handles (append handles [(async factorial n)])))
196+
197+
(define results [])
198+
(for (h handles)
199+
(set! results (append results [(await h)])))
200+
201+
(length results))
202+
"#;
203+
204+
black_box(evaluator.eval_str(code).unwrap())
205+
});
206+
});
207+
}
208+
209+
/// Benchmark fire-and-forget pattern
210+
fn bench_fire_and_forget(c: &mut Criterion) {
211+
c.bench_function("fire_and_forget_100_tasks", |b| {
212+
b.iter(|| {
213+
let mut evaluator = LispEvaluator::new();
214+
let code = r#"
215+
(do
216+
(defun background-work (id)
217+
(do
218+
(sleep 1)
219+
(* id 2)))
220+
221+
(for (i (range 1 101))
222+
(async background-work i))
223+
224+
"done")
225+
"#;
226+
227+
black_box(evaluator.eval_str(code).unwrap())
228+
});
229+
});
230+
}
231+
232+
criterion_group!(
233+
benches,
234+
bench_sequential_vs_concurrent,
235+
bench_async_overhead,
236+
bench_batch_processing,
237+
bench_map_reduce,
238+
bench_factorial_concurrent,
239+
bench_fire_and_forget
240+
);
241+
criterion_main!(benches);

0 commit comments

Comments
 (0)