Fix benches

This commit is contained in:
Dennis Schwerdel 2021-03-27 00:22:55 +00:00
parent 1101fe65e0
commit 68f4cb7787
2 changed files with 131 additions and 83 deletions

View File

@ -1,27 +1,30 @@
#![allow(dead_code, unused_macros, unused_imports)] #![allow(dead_code, unused_macros, unused_imports)]
#[macro_use] extern crate serde; #[macro_use]
#[macro_use] extern crate log; extern crate serde;
#[macro_use] extern crate tokio; #[macro_use]
extern crate log;
#[macro_use]
extern crate tokio;
use criterion::{criterion_group, criterion_main, Criterion, Throughput}; use criterion::{criterion_group, criterion_main, Criterion, Throughput};
use smallvec::smallvec;
use ring::aead; use ring::aead;
use smallvec::smallvec;
use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4, UdpSocket};
use std::str::FromStr; use std::str::FromStr;
use std::net::{SocketAddr, Ipv4Addr, SocketAddrV4, UdpSocket};
include!(".code.rs"); include!(".code.rs");
pub use error::Error;
use util::{MockTimeSource, MsgBuffer};
use types::{Address, Range};
use table::{ClaimTable};
use device::Type;
use config::Config; use config::Config;
use payload::{Packet, Frame, Protocol};
use crypto::core::{create_dummy_pair, EXTRA_LEN}; use crypto::core::{create_dummy_pair, EXTRA_LEN};
use tests::common::{TunSimulator, TapSimulator}; use device::Type;
pub use error::Error;
use payload::{Frame, Packet, Protocol};
use table::ClaimTable;
use tests::common::{TapSimulator, TunSimulator};
use types::{Address, Range};
use util::{MockTimeSource, MsgBuffer};
fn udp_send(c: &mut Criterion) { fn udp_send(c: &mut Criterion) {
let sock = UdpSocket::bind("127.0.0.1:0").unwrap(); let sock = UdpSocket::bind("127.0.0.1:0").unwrap();
@ -48,7 +51,7 @@ fn decode_ipv4(c: &mut Criterion) {
fn decode_ipv6(c: &mut Criterion) { fn decode_ipv6(c: &mut Criterion) {
let data = [ let data = [
0x60, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 6, 5, 0x60, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 6, 5,
4, 3, 2, 1 4, 3, 2, 1,
]; ];
let mut g = c.benchmark_group("payload"); let mut g = c.benchmark_group("payload");
g.throughput(Throughput::Bytes(1400)); g.throughput(Throughput::Bytes(1400));
@ -108,9 +111,9 @@ fn lookup_cold(c: &mut Criterion) {
fn crypto_bench(c: &mut Criterion, algo: &'static aead::Algorithm) { fn crypto_bench(c: &mut Criterion, algo: &'static aead::Algorithm) {
let mut buffer = MsgBuffer::new(EXTRA_LEN); let mut buffer = MsgBuffer::new(EXTRA_LEN);
buffer.set_length(1400); buffer.set_length(1400);
let (mut sender, mut receiver) = create_dummy_pair(algo); let (sender, receiver) = create_dummy_pair(algo);
let mut g = c.benchmark_group("crypto"); let mut g = c.benchmark_group("crypto");
g.throughput(Throughput::Bytes(2*1400)); g.throughput(Throughput::Bytes(2 * 1400));
g.bench_function(format!("{:?}", algo), |b| { g.bench_function(format!("{:?}", algo), |b| {
b.iter(|| { b.iter(|| {
sender.encrypt(&mut buffer); sender.encrypt(&mut buffer);
@ -133,6 +136,7 @@ fn crypto_aes256(c: &mut Criterion) {
} }
fn full_communication_tun_router(c: &mut Criterion) { fn full_communication_tun_router(c: &mut Criterion) {
let runtime = tokio::runtime::Runtime::new().unwrap();
log::set_max_level(log::LevelFilter::Error); log::set_max_level(log::LevelFilter::Error);
let config1 = Config { let config1 = Config {
device_type: Type::Tun, device_type: Type::Tun,
@ -147,59 +151,78 @@ fn full_communication_tun_router(c: &mut Criterion) {
..Config::default() ..Config::default()
}; };
let mut sim = TunSimulator::new(); let mut sim = TunSimulator::new();
let node1 = sim.add_node(false, &config1);
let node2 = sim.add_node(false, &config2);
sim.connect(node1, node2); let (node1, node2) = runtime.block_on(async {
sim.simulate_all_messages(); log::set_max_level(log::LevelFilter::Error);
assert!(sim.is_connected(node1, node2)); let node1 = sim.add_node(false, &config1).await;
assert!(sim.is_connected(node2, node1)); let node2 = sim.add_node(false, &config2).await;
sim.connect(node1, node2).await;
sim.simulate_all_messages().await;
assert!(sim.is_connected(node1, node2));
assert!(sim.is_connected(node2, node1));
(node1, node2)
});
let mut payload = vec![0x40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2]; let mut payload = vec![0x40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2];
payload.append(&mut vec![0; 1400]); payload.append(&mut vec![0; 1400]);
let mut g = c.benchmark_group("full_communication"); let mut g = c.benchmark_group("full_communication");
g.throughput(Throughput::Bytes(2*1400)); g.throughput(Throughput::Bytes(2 * 1400));
g.bench_function("tun_router", |b| { g.bench_function("tun_router", |b| {
b.iter(|| { b.iter(|| runtime.block_on(async {
sim.put_payload(node1, payload.clone()); sim.put_payload(node1, payload.clone()).await;
sim.simulate_all_messages(); sim.simulate_all_messages().await;
assert_eq!(Some(&payload), sim.pop_payload(node2).as_ref()); assert_eq!(Some(&payload), sim.pop_payload(node2).as_ref());
}); }));
}); });
g.finish() g.finish()
} }
fn full_communication_tap_switch(c: &mut Criterion) { fn full_communication_tap_switch(c: &mut Criterion) {
log::set_max_level(log::LevelFilter::Error); let runtime = tokio::runtime::Runtime::new().unwrap();
log::set_max_level(log::LevelFilter::Error);
let config = Config { device_type: Type::Tap, ..Config::default() }; let config = Config { device_type: Type::Tap, ..Config::default() };
let mut sim = TapSimulator::new(); let mut sim = TapSimulator::new();
let node1 = sim.add_node(false, &config);
let node2 = sim.add_node(false, &config);
sim.connect(node1, node2); let (node1, node2) = runtime.block_on(async {
sim.simulate_all_messages(); log::set_max_level(log::LevelFilter::Error);
assert!(sim.is_connected(node1, node2)); let node1 = sim.add_node(false, &config).await;
assert!(sim.is_connected(node2, node1)); let node2 = sim.add_node(false, &config).await;
sim.connect(node1, node2).await;
sim.simulate_all_messages().await;
assert!(sim.is_connected(node1, node2));
assert!(sim.is_connected(node2, node1));
(node1, node2)
});
let mut payload = vec![2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5]; let mut payload = vec![2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5];
payload.append(&mut vec![0; 1400]); payload.append(&mut vec![0; 1400]);
let mut g = c.benchmark_group("full_communication"); let mut g = c.benchmark_group("full_communication");
g.throughput(Throughput::Bytes(2*1400)); g.throughput(Throughput::Bytes(2 * 1400));
g.bench_function("tap_switch", |b| { g.bench_function("tap_switch", |b| {
b.iter(|| { b.iter(|| runtime.block_on(async {
sim.put_payload(node1, payload.clone()); sim.put_payload(node1, payload.clone()).await;
sim.simulate_all_messages(); sim.simulate_all_messages().await;
assert_eq!(Some(&payload), sim.pop_payload(node2).as_ref()); assert_eq!(Some(&payload), sim.pop_payload(node2).as_ref());
}); }));
}); });
g.finish() g.finish()
} }
criterion_group!(benches, criterion_group!(
udp_send, benches,
decode_ipv4, decode_ipv6, decode_ethernet, decode_ethernet_with_vlan, udp_send,
lookup_cold, lookup_warm, decode_ipv4,
crypto_chacha20, crypto_aes128, crypto_aes256, decode_ipv6,
full_communication_tun_router, full_communication_tap_switch decode_ethernet,
decode_ethernet_with_vlan,
lookup_cold,
lookup_warm,
crypto_chacha20,
crypto_aes128,
crypto_aes256,
full_communication_tun_router,
full_communication_tap_switch
); );
criterion_main!(benches); criterion_main!(benches);

View File

@ -1,27 +1,30 @@
#![allow(dead_code, unused_macros, unused_imports)] #![allow(dead_code, unused_macros, unused_imports)]
#[macro_use] extern crate serde; #[macro_use]
#[macro_use] extern crate log; extern crate serde;
#[macro_use] extern crate tokio; #[macro_use]
extern crate log;
#[macro_use]
extern crate tokio;
use iai::{black_box, main}; use iai::{black_box, main};
use smallvec::smallvec;
use ring::aead; use ring::aead;
use smallvec::smallvec;
use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4, UdpSocket};
use std::str::FromStr; use std::str::FromStr;
use std::net::{SocketAddr, Ipv4Addr, SocketAddrV4, UdpSocket};
include!(".code.rs"); include!(".code.rs");
pub use error::Error;
use util::{MockTimeSource, MsgBuffer};
use config::Config; use config::Config;
use types::{Address, Range};
use device::Type;
use table::{ClaimTable};
use payload::{Packet, Frame, Protocol};
use crypto::core::{create_dummy_pair, EXTRA_LEN}; use crypto::core::{create_dummy_pair, EXTRA_LEN};
use tests::common::{TunSimulator, TapSimulator}; use device::Type;
pub use error::Error;
use payload::{Frame, Packet, Protocol};
use table::ClaimTable;
use tests::common::{TapSimulator, TunSimulator};
use types::{Address, Range};
use util::{MockTimeSource, MsgBuffer};
fn udp_send() { fn udp_send() {
let sock = UdpSocket::bind("127.0.0.1:0").unwrap(); let sock = UdpSocket::bind("127.0.0.1:0").unwrap();
@ -38,7 +41,7 @@ fn decode_ipv4() {
fn decode_ipv6() { fn decode_ipv6() {
let data = [ let data = [
0x60, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 6, 5, 0x60, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 6, 5,
4, 3, 2, 1 4, 3, 2, 1,
]; ];
Packet::parse(&black_box(data)).unwrap(); Packet::parse(&black_box(data)).unwrap();
} }
@ -75,7 +78,7 @@ fn lookup_cold() {
fn crypto_bench(algo: &'static aead::Algorithm) { fn crypto_bench(algo: &'static aead::Algorithm) {
let mut buffer = MsgBuffer::new(EXTRA_LEN); let mut buffer = MsgBuffer::new(EXTRA_LEN);
buffer.set_length(1400); buffer.set_length(1400);
let (mut sender, mut receiver) = create_dummy_pair(algo); let (sender, receiver) = create_dummy_pair(algo);
for _ in 0..1000 { for _ in 0..1000 {
sender.encrypt(black_box(&mut buffer)); sender.encrypt(black_box(&mut buffer));
receiver.decrypt(&mut buffer).unwrap(); receiver.decrypt(&mut buffer).unwrap();
@ -95,6 +98,7 @@ fn crypto_aes256() {
} }
fn full_communication_tun_router() { fn full_communication_tun_router() {
let runtime = tokio::runtime::Runtime::new().unwrap();
log::set_max_level(log::LevelFilter::Error); log::set_max_level(log::LevelFilter::Error);
let config1 = Config { let config1 = Config {
device_type: Type::Tun, device_type: Type::Tun,
@ -109,48 +113,69 @@ fn full_communication_tun_router() {
..Config::default() ..Config::default()
}; };
let mut sim = TunSimulator::new(); let mut sim = TunSimulator::new();
let node1 = sim.add_node(false, &config1); let (node1, node2) = runtime.block_on(async {
let node2 = sim.add_node(false, &config2); log::set_max_level(log::LevelFilter::Error);
let node1 = sim.add_node(false, &config1).await;
let node2 = sim.add_node(false, &config2).await;
sim.connect(node1, node2); sim.connect(node1, node2).await;
sim.simulate_all_messages(); sim.simulate_all_messages().await;
assert!(sim.is_connected(node1, node2)); assert!(sim.is_connected(node1, node2));
assert!(sim.is_connected(node2, node1)); assert!(sim.is_connected(node2, node1));
(node1, node2)
});
let mut payload = vec![0x40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2]; let mut payload = vec![0x40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2];
payload.append(&mut vec![0; 1400]); payload.append(&mut vec![0; 1400]);
for _ in 0..1000 { for _ in 0..1000 {
sim.put_payload(node1, payload.clone()); runtime.block_on(async {
sim.simulate_all_messages(); sim.put_payload(node1, payload.clone()).await;
assert_eq!(Some(&payload), black_box(sim.pop_payload(node2).as_ref())); sim.simulate_all_messages().await;
assert_eq!(Some(&payload), black_box(sim.pop_payload(node2).as_ref()));
});
} }
} }
fn full_communication_tap_switch() { fn full_communication_tap_switch() {
let runtime = tokio::runtime::Runtime::new().unwrap();
log::set_max_level(log::LevelFilter::Error); log::set_max_level(log::LevelFilter::Error);
let config = Config { device_type: Type::Tap, ..Config::default() }; let config = Config { device_type: Type::Tap, ..Config::default() };
let mut sim = TapSimulator::new(); let mut sim = TapSimulator::new();
let node1 = sim.add_node(false, &config);
let node2 = sim.add_node(false, &config);
sim.connect(node1, node2); let (node1, node2) = runtime.block_on(async {
sim.simulate_all_messages(); log::set_max_level(log::LevelFilter::Error);
assert!(sim.is_connected(node1, node2)); let node1 = sim.add_node(false, &config).await;
assert!(sim.is_connected(node2, node1)); let node2 = sim.add_node(false, &config).await;
sim.connect(node1, node2).await;
sim.simulate_all_messages().await;
assert!(sim.is_connected(node1, node2));
assert!(sim.is_connected(node2, node1));
(node1, node2)
});
let mut payload = vec![2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5]; let mut payload = vec![2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5];
payload.append(&mut vec![0; 1400]); payload.append(&mut vec![0; 1400]);
for _ in 0..1000 { for _ in 0..1000 {
sim.put_payload(node1, payload.clone()); runtime.block_on(async {
sim.simulate_all_messages(); sim.put_payload(node1, payload.clone()).await;
assert_eq!(Some(&payload), black_box(sim.pop_payload(node2).as_ref())); sim.simulate_all_messages().await;
assert_eq!(Some(&payload), black_box(sim.pop_payload(node2).as_ref()));
});
} }
} }
iai::main!( iai::main!(
udp_send, udp_send,
decode_ipv4, decode_ipv6, decode_ethernet, decode_ethernet_with_vlan, decode_ipv4,
lookup_cold, lookup_warm, decode_ipv6,
crypto_chacha20, crypto_aes128, crypto_aes256, decode_ethernet,
full_communication_tun_router, full_communication_tap_switch decode_ethernet_with_vlan,
); lookup_cold,
lookup_warm,
crypto_chacha20,
crypto_aes128,
crypto_aes256,
full_communication_tun_router,
full_communication_tap_switch
);