#![allow( clippy::large_enum_variant, clippy::type_complexity, clippy::too_many_arguments )] use criterion::{criterion_group, criterion_main, Criterion}; use std::thread::spawn; use crossbeam_channel::{bounded, Receiver, Sender}; type ReceivingSendingReceiving = Receiver<SendingReceiving>; type SendingReceivingSending = Sender<ReceivingSending>; type SendingReceiving = Sender<Receiving>; type ReceivingSending = Receiver<Sending>; type Receiving = Receiver<()>; type Sending = Sender<()>; fn aux() { let mut threads = Vec::new(); for _ in 0..6 { let main = spawn(move || { for _ in 0..LOOPS { let (sender_0, receiver_0) = bounded::<ReceivingSendingReceiving>(1); let (sender_4, receiver_4) = bounded::<SendingReceivingSending>(1); let (sender_1, receiver_1) = bounded::<SendingReceiving>(1); let (sender_5, receiver_5) = bounded::<ReceivingSending>(1); let (sender_2, receiver_2) = bounded::<Receiving>(1); let (sender_6, receiver_6) = bounded::<Sending>(1); let (sender_3, receiver_3) = bounded::<()>(1); let (sender_7, receiver_7) = bounded::<()>(1); sender_0.send(receiver_1).unwrap(); sender_4.send(sender_5).unwrap(); let receiver_1_bis = receiver_0.recv().unwrap(); let sender_5_bis = receiver_4.recv().unwrap(); sender_1.send(sender_2).unwrap(); sender_5_bis.send(receiver_6).unwrap(); let sender_2_bis = receiver_1_bis.recv().unwrap(); let receiver_6_bis = receiver_5.recv().unwrap(); sender_2_bis.send(receiver_3).unwrap(); sender_6.send(sender_7).unwrap(); let receiver_2_bis = receiver_2.recv().unwrap(); let sender_7_bis = receiver_6_bis.recv().unwrap(); sender_3.send(()).unwrap(); sender_7_bis.send(()).unwrap(); receiver_2_bis.recv().unwrap(); receiver_7.recv().unwrap(); } // "Close" connection let (sender_close_1, receiver_close_1) = bounded::<()>(1); let (sender_close_2, receiver_close_2) = bounded::<()>(1); sender_close_1.send(()).unwrap_or(()); sender_close_2.send(()).unwrap_or(()); receiver_close_1.recv().unwrap_or(()); receiver_close_2.recv().unwrap_or(()); }); threads.push(main); } threads.into_iter().for_each(|elt| elt.join().unwrap()); } ///////////////////////// static LOOPS: i64 = 100; pub fn ring_protocol_crossbeam(c: &mut Criterion) { c.bench_function(&format!("ring seven crossbeam {LOOPS}"), |b| b.iter(aux)); } ///////////////////////// criterion_group! { name = bench; config = Criterion::default().significance_level(0.05).without_plots().sample_size(100000); targets = ring_protocol_crossbeam, } criterion_main! { bench }