From bc2b78ca2c6396a13fe08dafbd0d71bd0d0b27b8 Mon Sep 17 00:00:00 2001 From: Graydon Hoare Date: Mon, 22 Jul 2013 09:48:22 -0700 Subject: [PATCH 1/9] rt: Fix child-iteration bug in crate map. --- src/rt/rust_crate_map.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 } From 786318f61b3d41238937d194970d2aaac34886cd Mon Sep 17 00:00:00 2001 From: Graydon Hoare Date: Mon, 22 Jul 2013 09:49:04 -0700 Subject: [PATCH 2/9] std: add #[cfg(test)] reference to extra so we can benchmark libstd. --- src/libstd/std.rs | 3 +++ 1 file changed, 3 insertions(+) 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; From e5cbede103fca018089b113ec35f0cf863df7106 Mon Sep 17 00:00:00 2001 From: Graydon Hoare Date: Mon, 22 Jul 2013 10:52:38 -0700 Subject: [PATCH 3/9] std: add preliminary str benchmark. --- src/libstd/str.rs | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/libstd/str.rs b/src/libstd/str.rs index 125df156ed0b2..6876bf3da7c12 100644 --- a/src/libstd/str.rs +++ b/src/libstd/str.rs @@ -3532,3 +3532,48 @@ 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); + } + } +} From 3d5fb470fb22dea6473fc1a4d265ce9494dd4120 Mon Sep 17 00:00:00 2001 From: Graydon Hoare Date: Mon, 22 Jul 2013 11:42:47 -0700 Subject: [PATCH 4/9] std: add #[bench] benchmarks for global and local heaps. --- src/libstd/rt/global_heap.rs | 19 +++++++++++++++++++ src/libstd/rt/local_heap.rs | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) 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]; + } + } +} From d9776236c8991af312113741e74c20e2070f252f Mon Sep 17 00:00:00 2001 From: Graydon Hoare Date: Mon, 22 Jul 2013 11:43:12 -0700 Subject: [PATCH 5/9] std: add #[bench] benchmarks for rand. --- src/libstd/rand.rs | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) 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 From 9f7e364d3a0f5d325f3722efb9c7ae4257b04e3d Mon Sep 17 00:00:00 2001 From: Graydon Hoare Date: Mon, 22 Jul 2013 11:43:32 -0700 Subject: [PATCH 6/9] std: add #[bench] benchmarks for num::strconv --- src/libstd/num/strconv.rs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) 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 From ca5ed4cc498ad5da22c6e1c4c0b79df07a07029e Mon Sep 17 00:00:00 2001 From: Graydon Hoare Date: Mon, 22 Jul 2013 16:50:17 -0700 Subject: [PATCH 7/9] std: add benchmark for allocating-and-dropping a struct with a dtor. --- src/libstd/ops.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) 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 From d9c0634536c8ac6cd6309221b1bbd93517686aba Mon Sep 17 00:00:00 2001 From: Graydon Hoare Date: Mon, 22 Jul 2013 16:50:36 -0700 Subject: [PATCH 8/9] std: various additional language benchmarks in util. --- src/libstd/util.rs | 65 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) 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 + }; + } + } +} From 978e5d94bc09a18cdfaa699508848bf8a39b46a9 Mon Sep 17 00:00:00 2001 From: Graydon Hoare Date: Tue, 23 Jul 2013 16:02:14 -0700 Subject: [PATCH 9/9] std: wrap "long" utf8 lines. --- src/libstd/str.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/libstd/str.rs b/src/libstd/str.rs index 6876bf3da7c12..c49a00502665b 100644 --- a/src/libstd/str.rs +++ b/src/libstd/str.rs @@ -3570,8 +3570,10 @@ mod bench { #[bench] fn map_chars_100_multibytes(bh: &mut BenchHarness) { - let s = "πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘\ - πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘"; + let s = "πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘\ + πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘\ + πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘\ + πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘πŒ€πŒ–πŒ‹πŒ„πŒ‘"; do bh.iter { s.map_chars(|c| ((c as uint) + 1) as char); }