Skip to content

Commit 4e3e784

Browse files
committed
bench: add benchmark cases for Volatile interfaces
Add benchmark cases for VolatileSlice/VolatileArrarRef interfaces. Signed-off-by: Liu Jiang <[email protected]>
1 parent 788019f commit 4e3e784

File tree

4 files changed

+96
-9
lines changed

4 files changed

+96
-9
lines changed

benches/guest_memory.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Copyright (C) 2020 Alibaba Cloud Computing. All rights reserved.
2+
//
3+
// SPDX-License-Identifier: Apache-2.0 OR BSD-3-Clause
4+
#![cfg(feature = "backend-mmap")]
5+
6+
pub use criterion::{black_box, Criterion};
7+
use vm_memory::{GuestAddress, GuestMemory, GuestMemoryMmap};
8+
9+
const REGION_SIZE: u64 = 0x10_0000;
10+
const REGIONS_COUNT: u64 = 256;
11+
12+
pub fn benchmark_for_guest_memory(c: &mut Criterion) {
13+
benchmark_find_region(c);
14+
}
15+
16+
fn find_region(mem: &GuestMemoryMmap) {
17+
for i in 0..REGIONS_COUNT {
18+
let _ = mem.find_region(GuestAddress(i * REGION_SIZE)).unwrap();
19+
}
20+
}
21+
22+
fn benchmark_find_region(c: &mut Criterion) {
23+
let memory = super::create_guest_memory_mmap(REGION_SIZE, REGIONS_COUNT);
24+
25+
c.bench_function("find_region", |b| {
26+
b.iter(|| black_box(find_region(&memory)))
27+
});
28+
}

benches/main.rs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,39 @@
55
extern crate criterion;
66

77
pub use criterion::{black_box, criterion_group, criterion_main, Criterion};
8+
#[cfg(feature = "backend-mmap")]
9+
use vm_memory::{GuestAddress, GuestMemoryMmap};
810

11+
mod guest_memory;
912
mod mmap;
13+
mod volatile;
14+
15+
use volatile::benchmark_for_volatile;
1016

1117
#[cfg(feature = "backend-mmap")]
12-
use mmap::benchmark_for_mmap;
18+
pub fn create_guest_memory_mmap(size: u64, count: u64) -> GuestMemoryMmap {
19+
let mut regions: Vec<(GuestAddress, usize)> = Vec::new();
20+
for i in 0..count {
21+
regions.push((GuestAddress(i * size), size as usize));
22+
}
23+
24+
GuestMemoryMmap::from_ranges(regions.as_slice()).unwrap()
25+
}
1326

1427
pub fn criterion_benchmark(_c: &mut Criterion) {
1528
#[cfg(feature = "backend-mmap")]
16-
benchmark_for_mmap(_c);
29+
mmap::benchmark_for_mmap(_c);
30+
}
31+
32+
pub fn benchmark_guest_memory(_c: &mut Criterion) {
33+
#[cfg(feature = "backend-mmap")]
34+
guest_memory::benchmark_for_guest_memory(_c)
1735
}
1836

1937
criterion_group! {
2038
name = benches;
2139
config = Criterion::default().sample_size(200).measurement_time(std::time::Duration::from_secs(50));
22-
targets = criterion_benchmark
40+
targets = criterion_benchmark, benchmark_guest_memory, benchmark_for_volatile
2341
}
2442

2543
criterion_main! {

benches/mmap/mod.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use std::path::Path;
1313

1414
use criterion::{black_box, Criterion};
1515

16-
use vm_memory::{ByteValued, Bytes, GuestAddress, GuestMemory, GuestMemoryMmap};
16+
use vm_memory::{ByteValued, Bytes, GuestAddress, GuestMemory};
1717

1818
const REGION_SIZE: u64 = 0x8000_0000;
1919
const REGIONS_COUNT: u64 = 8;
@@ -62,12 +62,8 @@ impl AccessKind {
6262
}
6363

6464
pub fn benchmark_for_mmap(c: &mut Criterion) {
65-
let mut regions: Vec<(GuestAddress, usize)> = Vec::new();
66-
for i in 0..REGIONS_COUNT {
67-
regions.push((GuestAddress(i * REGION_SIZE), REGION_SIZE as usize));
68-
}
65+
let memory = super::create_guest_memory_mmap(REGION_SIZE, REGIONS_COUNT);
6966

70-
let memory = GuestMemoryMmap::from_ranges(regions.as_slice()).unwrap();
7167
// Just a sanity check.
7268
assert_eq!(
7369
memory.last_addr(),

benches/volatile.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// Copyright (C) 2020 Alibaba Cloud. All rights reserved.
2+
//
3+
// SPDX-License-Identifier: Apache-2.0 OR BSD-3-Clause
4+
5+
pub use criterion::{black_box, Criterion};
6+
use vm_memory::volatile_memory::VolatileMemory;
7+
8+
pub fn benchmark_for_volatile(c: &mut Criterion) {
9+
let mut a = [0xa5u8; 1024];
10+
let a_ref = &mut a[..];
11+
let v_ref8 = a_ref.get_slice(0, a_ref.len()).unwrap();
12+
let v_ref16 = a_ref.get_slice(0, a_ref.len() / 2).unwrap();
13+
let mut d8 = [0u8; 1024];
14+
let mut d16 = [0u16; 512];
15+
16+
// Check performance for read operations.
17+
c.bench_function("VolatileSlice::copy_to_u8", |b| {
18+
b.iter(|| black_box(v_ref8.copy_to(&mut d8[..])))
19+
});
20+
c.bench_function("VolatileSlice::copy_to_u16", |b| {
21+
b.iter(|| black_box(v_ref16.copy_to(&mut d16[..])))
22+
});
23+
benchmark_volatile_copy_to_volatile_slice(c);
24+
25+
// Check performance for write operations.
26+
c.bench_function("VolatileSlice::copy_from_u8", |b| {
27+
b.iter(|| black_box(v_ref8.copy_from(&d8[..])))
28+
});
29+
c.bench_function("VolatileSlice::copy_from_u16", |b| {
30+
b.iter(|| black_box(v_ref16.copy_from(&d16[..])))
31+
});
32+
}
33+
34+
fn benchmark_volatile_copy_to_volatile_slice(c: &mut Criterion) {
35+
let mut a = [0xa5u8; 10240];
36+
let a_ref = &mut a[..];
37+
let a_slice = a_ref.get_slice(0, a_ref.len()).unwrap();
38+
let mut d = [0u8; 10240];
39+
let d_ref = &mut d[..];
40+
let d_slice = d_ref.get_slice(0, d_ref.len()).unwrap();
41+
42+
c.bench_function("VolatileSlice::copy_to_volatile_slice", |b| {
43+
b.iter(|| black_box(a_slice.copy_to_volatile_slice(d_slice)))
44+
});
45+
}

0 commit comments

Comments
 (0)