Skip to content

Instantly share code, notes, and snippets.

@zooko
Created June 10, 2024 12:56
Show Gist options
  • Save zooko/4ba9e454424a684f7db37d90329a4bd8 to your computer and use it in GitHub Desktop.
Save zooko/4ba9e454424a684f7db37d90329a4bd8 to your computer and use it in GitHub Desktop.
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