1use std::time::Instant;
9
10use phi_ext::pxb;
11
12fn bench(name: &str, iters: usize, mut f: impl FnMut()) {
13 for _ in 0..iters / 10 {
15 f();
16 }
17 let t0 = Instant::now();
18 for _ in 0..iters {
19 f();
20 }
21 let ns_op = t0.elapsed().as_nanos() as f64 / iters as f64;
22 println!("{name:<34} {ns_op:8.1} ns/op {:>9.1} Mops/s", 1e3 / ns_op);
23}
24
25fn main() {
26 let iters = 2_000_000usize;
27
28 bench("encode+decode Hello (small)", iters, || {
29 let b = pxb::encode_hello(&pxb::Hello {
30 name: "greet".into(),
31 version: "1.0.0".into(),
32 caps: 3,
33 protocol: 1,
34 });
35 std::hint::black_box(pxb::decode_hello(&b).unwrap());
36 });
37
38 let req = pxb::InterceptReq {
39 event: pxb::Event::ToolCall.code(),
40 tool_name: "bash".into(),
41 tool_call_id: "call_01JX9K2M".into(),
42 input: br#"{"command":"ls -la /tmp","cwd":"/workspace"}"#.to_vec(),
43 turn_index: 3,
44 ..Default::default()
45 };
46 let frame = pxb::encode_intercept_req(&req);
47 println!("\nInterceptReq payload: {} bytes", frame.len());
48 bench("encode+decode InterceptReq (tool_call)", iters, || {
49 let b = pxb::encode_intercept_req(&req);
50 let d = pxb::decode_intercept_req(&b).unwrap();
51 std::hint::black_box(d.tool_call_id);
52 });
53
54 let ev = pxb::EventNotify {
55 event: pxb::Event::ToolResult.code(),
56 tool_name: "bash".into(),
57 tool_call_id: "call_01JX9K2M".into(),
58 input: req.input.clone(),
59 turn_index: 3,
60 session_id: "sess_01JX".into(),
61 ..Default::default()
62 };
63 let frame = pxb::encode_event_notify(&ev);
64 println!("EventNotify payload: {} bytes", frame.len());
65 bench("encode+decode EventNotify (tool_result)", iters, || {
66 let b = pxb::encode_event_notify(&ev);
67 let d = pxb::decode_event_notify(&b).unwrap();
68 std::hint::black_box(d.session_id);
69 });
70
71 bench("write_frame+read_frame (in-memory)", iters / 4, || {
73 let mut buf = Vec::new();
74 pxb::write_frame(&mut buf, pxb::TYPE_INTERCEPT, pxb::FLAG_HAS_ID, 42, &frame).unwrap();
75 let mut cur = std::io::Cursor::new(buf);
76 let f = pxb::read_frame(&mut cur).unwrap();
77 std::hint::black_box(f.body.len());
78 });
79}