diff --git a/core/src/recvmmsg.rs b/core/src/recvmmsg.rs index 203c364cca..16b9cab7e9 100644 --- a/core/src/recvmmsg.rs +++ b/core/src/recvmmsg.rs @@ -221,34 +221,41 @@ mod tests { let reader = UdpSocket::bind("127.0.0.1:0").expect("bind"); let addr = reader.local_addr().unwrap(); let sender = UdpSocket::bind("127.0.0.1:0").expect("bind"); - let sent = TEST_NUM_MSGS; - for _ in 0..sent { - let data = [0; PACKET_DATA_SIZE]; - sender.send_to(&data[..], &addr).unwrap(); - } - let now = Instant::now(); - let mut packets = vec![Packet::default(); TEST_NUM_MSGS]; - let recv = recv_mmsg(&reader, &mut packets[..]).unwrap().1; - assert_eq!(TEST_NUM_MSGS, recv); - let elapsed_in_max_batch = now.elapsed().as_millis(); + const TEST_BATCH_SIZE: usize = 64; + let sent = TEST_BATCH_SIZE; - for _ in 0..sent { - let data = [0; PACKET_DATA_SIZE]; - sender.send_to(&data[..], &addr).unwrap(); - } - - let now = Instant::now(); - let mut packets = vec![Packet::default(); TEST_NUM_MSGS / 4]; - let mut recv = 0; - while let Ok(num) = recv_mmsg(&reader, &mut packets[..]) { - recv += num.1; - if recv >= TEST_NUM_MSGS { - break; + let mut elapsed_in_max_batch = 0; + (0..1000).for_each(|_| { + for _ in 0..sent { + let data = [0; PACKET_DATA_SIZE]; + sender.send_to(&data[..], &addr).unwrap(); } - } - assert_eq!(TEST_NUM_MSGS, recv); - let elapsed_in_small_batch = now.elapsed().as_millis(); + let mut packets = vec![Packet::default(); TEST_BATCH_SIZE]; + let now = Instant::now(); + let recv = recv_mmsg(&reader, &mut packets[..]).unwrap().1; + elapsed_in_max_batch += now.elapsed().as_nanos(); + assert_eq!(TEST_BATCH_SIZE, recv); + }); + + let mut elapsed_in_small_batch = 0; + (0..1000).for_each(|_| { + for _ in 0..sent { + let data = [0; PACKET_DATA_SIZE]; + sender.send_to(&data[..], &addr).unwrap(); + } + let mut packets = vec![Packet::default(); 4]; + let mut recv = 0; + let now = Instant::now(); + while let Ok(num) = recv_mmsg(&reader, &mut packets[..]) { + recv += num.1; + if recv >= TEST_BATCH_SIZE { + break; + } + } + elapsed_in_small_batch += now.elapsed().as_nanos(); + assert_eq!(TEST_BATCH_SIZE, recv); + }); assert!(elapsed_in_max_batch <= elapsed_in_small_batch); }