1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
pub fn change(pct: f64, signed: bool) -> String { if signed { format!("{:>+6}%", signed_short(pct * 1e2)) } else { format!("{:>6}%", short(pct * 1e2)) } } pub fn time(ns: f64) -> String { if ns < 1.0 { format!("{:>6} ps", short(ns * 1e3)) } else if ns < 10f64.powi(3) { format!("{:>6} ns", short(ns)) } else if ns < 10f64.powi(6) { format!("{:>6} us", short(ns / 1e3)) } else if ns < 10f64.powi(9) { format!("{:>6} ms", short(ns / 1e6)) } else { format!("{:>6} s", short(ns / 1e9)) } } pub fn short(n: f64) -> String { if n < 10.0 { format!("{:.4}", n) } else if n < 100.0 { format!("{:.3}", n) } else if n < 1000.0 { format!("{:.2}", n) } else if n < 10000.0 { format!("{:.1}", n) } else { format!("{:.0}", n) } } fn signed_short(n: f64) -> String { let n_abs = n.abs(); if n_abs < 10.0 { format!("{:+.4}", n) } else if n_abs < 100.0 { format!("{:+.3}", n) } else if n_abs < 1000.0 { format!("{:+.2}", n) } else if n_abs < 10000.0 { format!("{:+.1}", n) } else { format!("{:+.0}", n) } } pub fn iter_count(iterations: u64) -> String { if iterations < 10_000 { format!("{} iterations", iterations) } else if iterations < 1_000_000 { format!("{:.0}k iterations", (iterations as f64) / 1000.0) } else if iterations < 10_000_000 { format!("{:.1}M iterations", (iterations as f64) / (1000.0 * 1000.0)) } else if iterations < 1_000_000_000 { format!("{:.0}M iterations", (iterations as f64) / (1000.0 * 1000.0)) } else if iterations < 10_000_000_000 { format!( "{:.1}B iterations", (iterations as f64) / (1000.0 * 1000.0 * 1000.0) ) } else { format!( "{:.0}B iterations", (iterations as f64) / (1000.0 * 1000.0 * 1000.0) ) } } pub fn integer(n: f64) -> String { format!("{}", n as u64) } #[cfg(test)] mod test { use super::*; #[test] fn short_max_len() { let mut float = 1.0; while float < 999_999.9 { let string = short(float); println!("{}", string); assert!(string.len() <= 6); float *= 2.0; } } #[test] fn signed_short_max_len() { let mut float = -1.0; while float > -999_999.9 { let string = signed_short(float); println!("{}", string); assert!(string.len() <= 7); float *= 2.0; } } }