actix-handler-macro 0.2.0

Helper macros for using Actix. Generates handlers, actors and address traits.
Documentation
use actix::{Actor, Addr, Message, MessageResponse, System, SystemRunner};
use actix_handler_macro::{actix_handler, Actor};
use criterion::{black_box, criterion_group, criterion_main, Criterion};

#[derive(Actor)]
struct Example;

type ExampleContext = actix::Context<Example>;

#[derive(Message, Clone)]
#[rtype(result = "Hello")]
struct Greeting;

#[derive(Message, MessageResponse)]
#[rtype(result = "()")]
struct Hello;

#[actix_handler]
impl Example {
    fn greet(&self, _message: Greeting, _ctx: &ExampleContext) -> Hello {
        Hello {}
    }

    fn say_hello(&self, _message: Hello, _ctx: &ExampleContext) {}
}

fn bench_send_msg_normal(sys: &mut SystemRunner, addr: Addr<Example>, greeting: Greeting) -> Hello {
    sys.block_on(async move {
        for _ in 0..1000u32 {
            addr.send(greeting.clone()).await.ok().unwrap();
        }
        addr.send(greeting).await.ok().unwrap()
    })
}

fn bench_send_msg_trait(sys: &mut SystemRunner, addr: Addr<Example>, greeting: Greeting) -> Hello {
    sys.block_on(async move {
        for _ in 0..1000u32 {
            addr.send(greeting.clone()).await.ok().unwrap();
        }
        addr.greet(greeting).await.ok().unwrap()
    })
}

fn criterion_benchmark(c: &mut Criterion) {
    let mut sys = System::new("actix-test-runtime");
    let addr = Example {}.start();

    c.bench_function("bench send msg trait", |b| {
        b.iter(|| bench_send_msg_trait(&mut sys, addr.clone(), black_box(Greeting {})))
    });
    c.bench_function("bench send msg normal", |b| {
        b.iter(|| bench_send_msg_normal(&mut sys, addr.clone(), black_box(Greeting {})))
    });
}

criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);