diff --git a/src/libstd/num/strconv.rs b/src/libstd/num/strconv.rs index 8e7f49464ffc2..722af828d5c11 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 020131ab119e5..756b4a10d3c90 100644 --- a/src/libstd/ops.rs +++ b/src/libstd/ops.rs @@ -81,3 +81,28 @@ pub trait Shr { pub trait Index { 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 9af2d8be2970f..06c743edd2bed 100644 --- a/src/libstd/rand.rs +++ b/src/libstd/rand.rs @@ -890,7 +890,7 @@ pub fn random() -> 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::(); + } + bh.bytes = size_of::() as u64; + } + + #[bench] + fn rand_isaac(bh: &mut BenchHarness) { + let mut rng = IsaacRng::new(); + do bh.iter { + rng.gen::(); + } + bh.bytes = size_of::() 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 580390c19530e..54e9cb263dbe7 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 c909bdb62850a..85917ae3edf12 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 cbf00f43c61b9..bbbc1702c6261 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 125df156ed0b2..c49a00502665b 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 5ae45b74dd8ca..8fcfa083cb65c 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 + }; + } + } +} diff --git a/src/rt/rust_crate_map.h b/src/rt/rust_crate_map.h index a57840ffe0955..64d17ebc3ad26 100644 --- a/src/rt/rust_crate_map.h +++ b/src/rt/rust_crate_map.h @@ -68,7 +68,7 @@ class cratemap { return &reinterpret_cast(this)-> m_children[0]; case 1: - return &m_children[1]; + return &m_children[0]; default: assert(false && "Unknown crate map version!"); return NULL; // Appease -Werror=return-type }