diff options
author | Yi Kong <yikong@google.com> | 2020-09-01 04:34:37 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-09-01 04:34:37 +0000 |
commit | 5c42f53e5ef267a0e5cbeeb7d8a41fa82fddfdd3 (patch) | |
tree | 91d0f8235ee35264b5f7296c6fb4fd79ac934c43 /examples/upstream_benchmark.rs | |
parent | 3fe076ea96b51ea6270f832a295577aa0096ac6c (diff) | |
parent | 250e55c7da5b10ad755c878ba5dd570f43373a36 (diff) | |
download | ryu-5c42f53e5ef267a0e5cbeeb7d8a41fa82fddfdd3.tar.gz |
Import 'ryu' crate version 1.0.5 am: ce81bb62a2 am: 261516ff4c am: 803bba2af0 am: 1f6fa1f83c am: 250e55c7da
Original change: https://android-review.googlesource.com/c/platform/external/rust/crates/ryu/+/1414669
Change-Id: I239c4aa2b744007f7aaebadb1fa8617dafed6b84
Diffstat (limited to 'examples/upstream_benchmark.rs')
-rw-r--r-- | examples/upstream_benchmark.rs | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/examples/upstream_benchmark.rs b/examples/upstream_benchmark.rs new file mode 100644 index 0000000..437855b --- /dev/null +++ b/examples/upstream_benchmark.rs @@ -0,0 +1,85 @@ +// cargo run --example upstream_benchmark --release + +use rand::{Rng, SeedableRng}; + +const SAMPLES: usize = 10000; +const ITERATIONS: usize = 1000; + +struct MeanAndVariance { + n: i64, + mean: f64, + m2: f64, +} + +impl MeanAndVariance { + fn new() -> Self { + MeanAndVariance { + n: 0, + mean: 0.0, + m2: 0.0, + } + } + + fn update(&mut self, x: f64) { + self.n += 1; + let d = x - self.mean; + self.mean += d / self.n as f64; + let d2 = x - self.mean; + self.m2 += d * d2; + } + + fn variance(&self) -> f64 { + self.m2 / (self.n - 1) as f64 + } + + fn stddev(&self) -> f64 { + self.variance().sqrt() + } +} + +macro_rules! benchmark { + ($name:ident, $ty:ident) => { + fn $name() -> usize { + let mut rng = rand_xorshift::XorShiftRng::from_seed([123u8; 16]); + let mut mv = MeanAndVariance::new(); + let mut throwaway = 0; + for _ in 0..SAMPLES { + let f = loop { + let f = $ty::from_bits(rng.gen()); + if f.is_finite() { + break f; + } + }; + + let t1 = std::time::SystemTime::now(); + for _ in 0..ITERATIONS { + throwaway += ryu::Buffer::new().format_finite(f).len(); + } + let duration = t1.elapsed().unwrap(); + let nanos = duration.as_secs() * 1_000_000_000 + duration.subsec_nanos() as u64; + mv.update(nanos as f64 / ITERATIONS as f64); + } + println!( + "{:12} {:8.3} {:8.3}", + concat!(stringify!($name), ":"), + mv.mean, + mv.stddev(), + ); + throwaway + } + }; +} + +benchmark!(pretty32, f32); +benchmark!(pretty64, f64); + +fn main() { + println!("{:>20}{:>9}", "Average", "Stddev"); + let mut throwaway = 0; + throwaway += pretty32(); + throwaway += pretty64(); + if std::env::var_os("ryu-benchmark").is_some() { + // Prevent the compiler from optimizing the code away. + println!("{}", throwaway); + } +} |