scatter_read/
scatter_read.rs1use dma_rs::Dma;
2use std::time::Instant;
3
4fn main() -> Result<(), Box<dyn std::error::Error>> {
5 let dma = Dma::new("fpga://algo=0")?;
6 let process = dma.attach("explorer.exe")?;
7
8 let modules = process.list_modules()?;
9 let kernel32 = modules.iter()
10 .find(|m| m.name.eq_ignore_ascii_case("kernel32.dll"))
11 .ok_or("kernel32.dll not found")?;
12
13 let base = kernel32.base;
14 let num_reads = 1000;
15
16 let start = Instant::now();
17 for i in 0..num_reads {
18 let _: u32 = process.read(base + i * 0x1000)?;
19 }
20 let normal_time = start.elapsed();
21
22 let start = Instant::now();
23 let mut scatter = process.scatter()?;
24
25 for i in 0..num_reads {
26 scatter.prepare_read(base + i * 0x1000, 4);
27 }
28
29 scatter.execute()?;
30
31 for i in 0..num_reads {
32 let _: u32 = scatter.read_as(base + i * 0x1000)?;
33 }
34 let scatter_time = start.elapsed();
35
36 println!("Normal reads ({} iterations): {:?}", num_reads, normal_time);
37 println!("Scatter reads ({} iterations): {:?}", num_reads, scatter_time);
38 println!("Speedup: {:.2}x", normal_time.as_secs_f64() / scatter_time.as_secs_f64());
39
40 Ok(())
41}