about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-07-23 22:46:39 -0700
committerbors <bors@rust-lang.org>2013-07-23 22:46:39 -0700
commit7f96eb58d2a4eed4651570ce719363008a8f269f (patch)
treef674603e356b5ac6d4faa76fdaf5387ecd8cdace /src/libstd
parentaf78e23006d9795bca32267a31e6f3cb9e73a6e1 (diff)
parent978e5d94bc09a18cdfaa699508848bf8a39b46a9 (diff)
downloadrust-7f96eb58d2a4eed4651570ce719363008a8f269f.tar.gz
rust-7f96eb58d2a4eed4651570ce719363008a8f269f.zip
auto merge of #7980 : graydon/rust/misc-benchmarks, r=catamorphism
Some machinery for enabling #[bench] benchmarks in std and some examples showing how to write them.
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/num/strconv.rs24
-rw-r--r--src/libstd/ops.rs25
-rw-r--r--src/libstd/rand.rs36
-rw-r--r--src/libstd/rt/global_heap.rs19
-rw-r--r--src/libstd/rt/local_heap.rs19
-rw-r--r--src/libstd/std.rs3
-rw-r--r--src/libstd/str.rs47
-rw-r--r--src/libstd/util.rs65
8 files changed, 237 insertions, 1 deletions
diff --git a/src/libstd/num/strconv.rs b/src/libstd/num/strconv.rs
index 8e7f49464ff..722af828d5c 100644
--- a/src/libstd/num/strconv.rs
+++ b/src/libstd/num/strconv.rs
@@ -703,3 +703,27 @@ mod test {
         assert_eq!(n, None);
     }
 }
+
+#[cfg(test)]
+mod bench {
+    use extra::test::BenchHarness;
+    use rand::{XorShiftRng,RngUtil};
+    use uint;
+    use float;
+
+    #[bench]
+    fn uint_to_str_rand(bh: &mut BenchHarness) {
+        let mut rng = XorShiftRng::new();
+        do bh.iter {
+            uint::to_str(rng.gen());
+        }
+    }
+
+    #[bench]
+    fn float_to_str_rand(bh: &mut BenchHarness) {
+        let mut rng = XorShiftRng::new();
+        do bh.iter {
+            float::to_str(rng.gen());
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/libstd/ops.rs b/src/libstd/ops.rs
index 020131ab119..756b4a10d3c 100644
--- a/src/libstd/ops.rs
+++ b/src/libstd/ops.rs
@@ -81,3 +81,28 @@ pub trait Shr<RHS,Result> {
 pub trait Index<Index,Result> {
     fn index(&self, index: &Index) -> Result;
 }
+
+#[cfg(test)]
+mod bench {
+
+    use extra::test::BenchHarness;
+    use ops::Drop;
+
+    // Overhead of dtors
+
+    struct HasDtor {
+        x: int
+    }
+
+    impl Drop for HasDtor {
+        fn drop(&self) {
+        }
+    }
+
+    #[bench]
+    fn alloc_obj_with_dtor(bh: &mut BenchHarness) {
+        do bh.iter {
+            HasDtor { x : 10 };
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/libstd/rand.rs b/src/libstd/rand.rs
index 9af2d8be297..06c743edd2b 100644
--- a/src/libstd/rand.rs
+++ b/src/libstd/rand.rs
@@ -890,7 +890,7 @@ pub fn random<T: Rand>() -> T {
 }
 
 #[cfg(test)]
-mod tests {
+mod test {
     use option::{Option, Some};
     use super::*;
 
@@ -1109,3 +1109,37 @@ mod tests {
         }
     }
 }
+
+#[cfg(test)]
+mod bench {
+    use extra::test::BenchHarness;
+    use rand::*;
+    use sys::size_of;
+
+    #[bench]
+    fn rand_xorshift(bh: &mut BenchHarness) {
+        let mut rng = XorShiftRng::new();
+        do bh.iter {
+            rng.gen::<uint>();
+        }
+        bh.bytes = size_of::<uint>() as u64;
+    }
+
+    #[bench]
+    fn rand_isaac(bh: &mut BenchHarness) {
+        let mut rng = IsaacRng::new();
+        do bh.iter {
+            rng.gen::<uint>();
+        }
+        bh.bytes = size_of::<uint>() as u64;
+    }
+
+    #[bench]
+    fn rand_shuffle_100(bh: &mut BenchHarness) {
+        let mut rng = XorShiftRng::new();
+        let x : &mut[uint] = [1,..100];
+        do bh.iter {
+            rng.shuffle_mut(x);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/libstd/rt/global_heap.rs b/src/libstd/rt/global_heap.rs
index 580390c1953..54e9cb263db 100644
--- a/src/libstd/rt/global_heap.rs
+++ b/src/libstd/rt/global_heap.rs
@@ -101,3 +101,22 @@ pub unsafe fn exchange_free_(ptr: *c_char) {
 pub unsafe fn exchange_free(ptr: *c_char) {
     free(ptr as *c_void);
 }
+
+#[cfg(test)]
+mod bench {
+    use extra::test::BenchHarness;
+
+    #[bench]
+    fn alloc_owned_small(bh: &mut BenchHarness) {
+        do bh.iter {
+            ~10;
+        }
+    }
+
+    #[bench]
+    fn alloc_owned_big(bh: &mut BenchHarness) {
+        do bh.iter {
+            ~[10, ..1000];
+        }
+    }
+}
diff --git a/src/libstd/rt/local_heap.rs b/src/libstd/rt/local_heap.rs
index c909bdb6285..85917ae3edf 100644
--- a/src/libstd/rt/local_heap.rs
+++ b/src/libstd/rt/local_heap.rs
@@ -135,3 +135,22 @@ extern {
     fn rust_boxed_region_free(region: *BoxedRegion, box: *OpaqueBox);
     fn rust_current_boxed_region() -> *BoxedRegion;
 }
+
+#[cfg(test)]
+mod bench {
+    use extra::test::BenchHarness;
+
+    #[bench]
+    fn alloc_managed_small(bh: &mut BenchHarness) {
+        do bh.iter {
+            @10;
+        }
+    }
+
+    #[bench]
+    fn alloc_managed_big(bh: &mut BenchHarness) {
+        do bh.iter {
+            @[10, ..1000];
+        }
+    }
+}
diff --git a/src/libstd/std.rs b/src/libstd/std.rs
index cbf00f43c61..bbbc1702c62 100644
--- a/src/libstd/std.rs
+++ b/src/libstd/std.rs
@@ -63,6 +63,9 @@ they contained the following prologue:
 #[deny(non_camel_case_types)];
 #[deny(missing_doc)];
 
+// Make extra accessible for benchmarking
+#[cfg(test)] extern mod extra(vers="0.8-pre");
+
 // Make std testable by not duplicating lang items. See #2912
 #[cfg(test)] extern mod realstd(name = "std");
 #[cfg(test)] pub use kinds = realstd::kinds;
diff --git a/src/libstd/str.rs b/src/libstd/str.rs
index 125df156ed0..c49a0050266 100644
--- a/src/libstd/str.rs
+++ b/src/libstd/str.rs
@@ -3532,3 +3532,50 @@ mod tests {
         assert_eq!(5, sum_len([s.as_slice()]));
     }
 }
+
+#[cfg(test)]
+mod bench {
+    use extra::test::BenchHarness;
+    use str;
+
+    #[bench]
+    fn is_utf8_100_ascii(bh: &mut BenchHarness) {
+
+        let s = bytes!("Hello there, the quick brown fox jumped over the lazy dog! \
+                        Lorem ipsum dolor sit amet, consectetur. ");
+
+        assert_eq!(100, s.len());
+        do bh.iter {
+            str::is_utf8(s);
+        }
+    }
+
+    #[bench]
+    fn is_utf8_100_multibyte(bh: &mut BenchHarness) {
+        let s = bytes!("πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ‰ΰΈ›ΰΈ£Ψ―ΩˆΩ„Ψ© Ψ§Ω„ΩƒΩˆΩŠΨͺΰΈ—ΰΈ¨ΰΉ„ΰΈ—ΰΈ’δΈ­εŽπ…πŒΏπŒ»π†πŒΉπŒ»πŒ°");
+        assert_eq!(100, s.len());
+        do bh.iter {
+            str::is_utf8(s);
+        }
+    }
+
+    #[bench]
+    fn map_chars_100_ascii(bh: &mut BenchHarness) {
+        let s = "HelloHelloHelloHelloHelloHelloHelloHelloHelloHello\
+                 HelloHelloHelloHelloHelloHelloHelloHelloHelloHello";
+        do bh.iter {
+            s.map_chars(|c| ((c as uint) + 1) as char);
+        }
+    }
+
+    #[bench]
+    fn map_chars_100_multibytes(bh: &mut BenchHarness) {
+        let s = "πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘\
+                 πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘\
+                 πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘\
+                 πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘";
+        do bh.iter {
+            s.map_chars(|c| ((c as uint) + 1) as char);
+        }
+    }
+}
diff --git a/src/libstd/util.rs b/src/libstd/util.rs
index 5ae45b74dd8..8fcfa083cb6 100644
--- a/src/libstd/util.rs
+++ b/src/libstd/util.rs
@@ -195,3 +195,68 @@ mod tests {
         unsafe { assert_eq!(did_run, true); }
     }
 }
+
+/// Completely miscellaneous language-construct benchmarks.
+#[cfg(test)]
+mod bench {
+
+    use extra::test::BenchHarness;
+    use option::{Some,None};
+
+    // Static/dynamic method dispatch
+
+    struct Struct {
+        field: int
+    }
+
+    trait Trait {
+        fn method(&self) -> int;
+    }
+
+    impl Trait for Struct {
+        fn method(&self) -> int {
+            self.field
+        }
+    }
+
+    #[bench]
+    fn trait_vtable_method_call(bh: &mut BenchHarness) {
+        let s = Struct { field: 10 };
+        let t = &s as &Trait;
+        do bh.iter {
+            t.method();
+        }
+    }
+
+    #[bench]
+    fn trait_static_method_call(bh: &mut BenchHarness) {
+        let s = Struct { field: 10 };
+        do bh.iter {
+            s.method();
+        }
+    }
+
+    // Overhead of various match forms
+
+    #[bench]
+    fn match_option_some(bh: &mut BenchHarness) {
+        let x = Some(10);
+        do bh.iter {
+            let _q = match x {
+                Some(y) => y,
+                None => 11
+            };
+        }
+    }
+
+    #[bench]
+    fn match_vec_pattern(bh: &mut BenchHarness) {
+        let x = [1,2,3,4,5,6];
+        do bh.iter {
+            let _q = match x {
+                [1,2,3,.._] => 10,
+                _ => 11
+            };
+        }
+    }
+}