#![feature(duration_from_micros)] #![allow(unused)] extern crate logging; use std::time::{Instant, Duration}; use std::thread; use logging::hist::{Entry, HistLog, nanos}; const N_SECS: u64 = 30; //const N_THREADS: usize = 48; macro_rules! n_threads { ($n:expr) => { const N_THREADS: usize = $n; const NAME: &'static str = concat!("sleeptest_", stringify!($n)); } } n_threads!(96); fn main() { ::std::process::exit(test_n()); } fn test_n() -> i32 { let start = Instant::now(); let hist = HistLog::new(NAME, "master", Duration::from_millis(100)); for _ in 0..N_THREADS { let mut a = hist.clone_with_tag("sleep_1ns"); thread::spawn(move || { let mut prev = Instant::now(); let mut loop_time = Instant::now(); loop { prev = loop_time; loop_time = Instant::now(); a.record(nanos(loop_time - prev)); a.check_send(loop_time); if loop_time - start > Duration::from_secs(N_SECS) { break } thread::sleep(Duration::new(0, 1)); //thread::yield_now(); } }); } thread::sleep(Duration::from_secs(N_SECS)); 0 } fn test_3() -> i32 { let start = Instant::now(); let hist = HistLog::new("sleeptest", "master", Duration::from_millis(100)); let mut a = hist.clone_with_tag("yield"); let mut b = hist.clone_with_tag("sleep_0"); let mut c = hist.clone_with_tag("sleep_100ns"); thread::spawn(move || { let mut prev = Instant::now(); let mut loop_time = Instant::now(); let mut i = 0; loop { prev = loop_time; loop_time = Instant::now(); a.record(nanos(loop_time - prev)); a.check_send(loop_time); if loop_time - start > Duration::from_secs(N_SECS) { break } i += 1; //if i % 100 == 0 { thread::sleep(Duration::new(0, 0)); } //thread::sleep(Duration::new(0, 0)); thread::yield_now(); } }); thread::spawn(move || { let mut prev = Instant::now(); let mut loop_time = Instant::now(); let mut i = 0; loop { prev = loop_time; loop_time = Instant::now(); b.record(nanos(loop_time - prev)); b.check_send(loop_time); if loop_time - start > Duration::from_secs(N_SECS) { break } i += 1; //if i % 1_000 == 0 { thread::sleep(Duration::new(0, 0)); } //if i % 100 == 0 { thread::sleep(Duration::new(0, 0)); } thread::sleep(Duration::new(0, 0)); } }); let mut prev = Instant::now(); let mut loop_time = Instant::now(); let mut i = 0; loop { prev = loop_time; loop_time = Instant::now(); c.record(nanos(loop_time - prev)); c.check_send(loop_time); if loop_time - start > Duration::from_secs(N_SECS) { break } i += 1; //if i % 100_000 == 0 { thread::sleep(Duration::from_millis(10)); } //if i % 100 == 0 { thread::sleep(Duration::new(0, 0)); } thread::sleep(Duration::new(0, 100)); } 0 }