aboutsummaryrefslogtreecommitdiff
path: root/examples/upstream_benchmark.rs
diff options
context:
space:
mode:
authorYi Kong <yikong@google.com>2020-09-01 04:34:37 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2020-09-01 04:34:37 +0000
commit5c42f53e5ef267a0e5cbeeb7d8a41fa82fddfdd3 (patch)
tree91d0f8235ee35264b5f7296c6fb4fd79ac934c43 /examples/upstream_benchmark.rs
parent3fe076ea96b51ea6270f832a295577aa0096ac6c (diff)
parent250e55c7da5b10ad755c878ba5dd570f43373a36 (diff)
downloadryu-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.rs85
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);
+ }
+}