Created
June 10, 2024 12:56
-
-
Save zooko/4ba9e454424a684f7db37d90329a4bd8 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use std::time::Instant; | |
use std::time::Duration; | |
fn meas(n: usize, f: fn(n: usize, iters: usize, inpv: Vec<Vec<u8>>, outpv: &mut Vec<Vec<u8>>, measures: &mut Vec<Duration>)->(), setup_for_f: fn(n: usize, iters: usize, inpv: &mut Vec<Vec<u8>>, outpv: &mut Vec<Vec<u8>>)->()) { | |
let iters : usize = 800; | |
let mut inpv : Vec<Vec<u8>> = Vec::with_capacity(iters); | |
let mut outpv : Vec<Vec<u8>> = Vec::with_capacity(iters); | |
let mut measures : Vec<Duration> = Vec::with_capacity(iters); | |
setup_for_f(n, iters, &mut inpv, &mut outpv); | |
let prev = Instant::now(); | |
f(n, iters, inpv, &mut outpv, &mut measures); | |
let dur = Instant::now() - prev; | |
let mean = dur.checked_div(iters as u32).unwrap(); | |
measures.sort(); | |
let mut sum : u128 = 0; | |
for measure in &measures { | |
sum += measure.as_nanos() | |
}; | |
let len = measures.len(); | |
let min = measures[0]; | |
let max = measures[len-1]; | |
let med = measures[len/2]; | |
println!("n: {:05?}, tot mean: {:?}, sum mean: {:?}, min: {:?}, max: {:?}, median: {:?}", n, mean, Duration::from_nanos((sum/(iters as u128)) as u64), min, max, med); | |
} | |
fn setup_for_nop(_n: usize, _iters: usize, _inpv: &mut Vec<Vec<u8>>, _outpv: &mut Vec<Vec<u8>>) {} | |
fn nop(_n: usize, iters: usize, _inpv: Vec<Vec<u8>>, _outpv: &mut Vec<Vec<u8>>, measures: &mut Vec<Duration>) { | |
let mut x = 0; | |
let mut prev = Instant::now(); | |
for _i in 0..iters { | |
x = x + 3; | |
let now = Instant::now(); | |
measures.push(now-prev); | |
prev = now; | |
} | |
} | |
fn setup_for_alloc(_n: usize, _iters: usize, _inpv: &mut Vec<Vec<u8>>, _outpv: &mut Vec<Vec<u8>>) {} | |
fn alloc(n: usize, iters: usize, _inpv: Vec<Vec<u8>>, outpv: &mut Vec<Vec<u8>>, measures: &mut Vec<Duration>) { | |
let mut prev = Instant::now(); | |
for _i in 0..iters { | |
let v : Vec<u8> = Vec::with_capacity(n); | |
outpv.push(v); | |
let now = Instant::now(); | |
measures.push(now-prev); | |
prev = now; | |
} | |
} | |
fn setup_for_copy(n: usize, iters: usize, inpv: &mut Vec<Vec<u8>>, outpv: &mut Vec<Vec<u8>>) { | |
for _i in 0..iters { | |
let mut iv : Vec<u8> = Vec::with_capacity(n); | |
iv.resize(n, 1); | |
inpv.push(iv); | |
let ov : Vec<u8> = Vec::with_capacity(n); | |
outpv.push(ov); | |
} | |
} | |
fn copy(_n: usize, iters: usize, inpv: Vec<Vec<u8>>, outpv: &mut Vec<Vec<u8>>, measures: &mut Vec<Duration>) { | |
let mut prev = Instant::now(); | |
for i in 0..iters { | |
outpv[i].extend_from_slice(&inpv[i]); | |
let now = Instant::now(); | |
measures.push(now-prev); | |
prev = now; | |
} | |
} | |
fn main() { | |
println!("Hello, world!"); | |
println!("nop..."); | |
let mut i : usize; | |
const MAXN : usize = 300_000; | |
const EXP : f32 = 1.4; | |
i = 24; | |
while i < MAXN { | |
meas(i, nop, setup_for_nop); | |
i = ((i as f32) * EXP) as usize; | |
} | |
println!("alloc..."); | |
i = 24; | |
while i < MAXN { | |
meas(i, alloc, setup_for_alloc); | |
i = ((i as f32) * EXP) as usize; | |
} | |
println!("copy..."); | |
i = 24; | |
while i < MAXN { | |
meas(i, copy, setup_for_copy); | |
i = ((i as f32) * EXP) as usize; | |
} | |
println!("Goodbye, world!") | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment