#![feature(test)]
#[macro_use]
extern crate fps;
extern crate test;
use fps::n::packet::*;
use fps::n::*;
use test::Bencher;
const TEST_N: usize = 10000;
fn prepare_packet1<'a>(input: &'a mut Buffer) -> Field<'a> {
let mut buffer = &mut input[0..54];
move_field(&[0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0xBC, 0x08,
0x00, 0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06, 0x6F, 0x1D,
0xC0, 0xA8, 0x00, 0x07, 0x0A, 0x00, 0x01, 0x04, 0x56, 0xCE, 0x30, 0x39, 0xFF,
0xFF, 0xF2, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x50, 0x02, 0xC8, 0x00, 0xA2, 0xB8,
0x00, 0x00],
buffer);
buffer
}
extern "C" {
fn c_extern_bench(test_no: i32, repeat: usize) -> i32;
}
fn rust_c_extern_bench(test_no: i32, repeat: usize) -> bool {
unsafe { c_extern_bench(test_no, repeat) == 0 }
}
#[bench]
fn bench_ethernet_swap_rust(bench: &mut Bencher) {
bench.iter(|| {
let mut temp_buffer = ZERO_BUFFER;
let buffer = prepare_packet1(&mut temp_buffer);
let mut packet = Packet::new(buffer);
packet = phy::extract(packet);
packet = ethernet::extract(packet);
for _ in 0..TEST_N {
packet = ethernet::swap_address(packet);
}
})
}
#[bench]
fn bench_dummy_move(bench: &mut Bencher) {
bench.iter(|| {
let mut temp_buffer = ZERO_BUFFER;
let buffer = prepare_packet1(&mut temp_buffer);
let mut packet = Packet::new(buffer);
packet = phy::extract(packet);
packet = ethernet::extract(packet);
for _ in 0..TEST_N {
packet = packet::dummy_move(packet);
}
})
}
#[bench]
fn bench_dummy_right_strip(bench: &mut Bencher) {
bench.iter(|| {
let mut temp_buffer = ZERO_BUFFER;
let buffer = prepare_packet1(&mut temp_buffer);
let mut packet = Packet::new(buffer);
packet = phy::extract(packet);
packet = ethernet::extract(packet);
for _ in 0..TEST_N {
packet = packet.right_strip(0);
}
})
}
#[bench]
fn bench_dummy_next(bench: &mut Bencher) {
bench.iter(|| {
let mut temp_buffer = ZERO_BUFFER;
let buffer = prepare_packet1(&mut temp_buffer);
let mut packet = Packet::new(buffer);
packet = phy::extract(packet);
packet = ethernet::extract(packet);
for _ in 0..TEST_N {
let (in_packet, _) = packet.right_packet(0);
packet = in_packet;
}
})
}
#[bench]
fn c_with_rust_swap(bench: &mut Bencher) {
bench.iter(|| rust_c_extern_bench(1, TEST_N))
}
#[bench]
fn c_native_swap(bench: &mut Bencher) {
bench.iter(|| rust_c_extern_bench(2, TEST_N))
}
#[bench]
fn bench_dummy_move_ffi_mapping(bench: &mut Bencher) {
let mapper = millefeuille_ffi_map!();
if let (Some(phy),Some(eth),Some(dummy))
= (mapper("phy::extract"),mapper("ethernet::extract"),mapper("packet::dummy_move")) {
bench.iter(|| {
let mut temp_buffer = ZERO_BUFFER;
let buffer = prepare_packet1(&mut temp_buffer);
let mut packet = Packet::new(buffer);
packet = phy(packet);
packet = eth(packet);
for _ in 0..TEST_N {
packet = dummy(packet);
}
})
} else {
panic!("Cannot reach here");
}
}