Skip to content

Commit 1c7b780

Browse files
committed
auto merge of #15068 : erickt/rust/mem-inline, r=pcwalton
This is a couple micro-optimizations I've been sitting on for a while. This inlines a couple functions that are important to the `std::io::mem`. Ultimately, this results in about a 15% performance increase in some micro-benchmarks for my [libserialize](https://github.com/erickt/rust-serde) rewrite.
2 parents ca3e557 + b9aeda4 commit 1c7b780

File tree

4 files changed

+246
-1
lines changed

4 files changed

+246
-1
lines changed

src/libcollections/vec.rs

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ impl<T> Vec<T> {
8585
/// # use std::vec::Vec;
8686
/// let vec: Vec<int> = Vec::with_capacity(10);
8787
/// ```
88+
#[inline]
8889
pub fn with_capacity(capacity: uint) -> Vec<T> {
8990
if mem::size_of::<T>() == 0 {
9091
Vec { len: 0, cap: uint::MAX, ptr: 0 as *mut T }
@@ -110,6 +111,7 @@ impl<T> Vec<T> {
110111
/// let vec = Vec::from_fn(3, |idx| idx * 2);
111112
/// assert_eq!(vec, vec!(0, 2, 4));
112113
/// ```
114+
#[inline]
113115
pub fn from_fn(length: uint, op: |uint| -> T) -> Vec<T> {
114116
unsafe {
115117
let mut xs = Vec::with_capacity(length);
@@ -193,6 +195,7 @@ impl<T: Clone> Vec<T> {
193195
/// let slice = [1, 2, 3];
194196
/// let vec = Vec::from_slice(slice);
195197
/// ```
198+
#[inline]
196199
pub fn from_slice(values: &[T]) -> Vec<T> {
197200
values.iter().map(|x| x.clone()).collect()
198201
}
@@ -207,6 +210,7 @@ impl<T: Clone> Vec<T> {
207210
/// let vec = Vec::from_elem(3, "hi");
208211
/// println!("{}", vec); // prints [hi, hi, hi]
209212
/// ```
213+
#[inline]
210214
pub fn from_elem(length: uint, value: T) -> Vec<T> {
211215
unsafe {
212216
let mut xs = Vec::with_capacity(length);
@@ -353,6 +357,7 @@ impl<T:Clone> Clone for Vec<T> {
353357
}
354358

355359
impl<T> FromIterator<T> for Vec<T> {
360+
#[inline]
356361
fn from_iter<I:Iterator<T>>(mut iterator: I) -> Vec<T> {
357362
let (lower, _) = iterator.size_hint();
358363
let mut vector = Vec::with_capacity(lower);
@@ -364,6 +369,7 @@ impl<T> FromIterator<T> for Vec<T> {
364369
}
365370

366371
impl<T> Extendable<T> for Vec<T> {
372+
#[inline]
367373
fn extend<I: Iterator<T>>(&mut self, mut iterator: I) {
368374
let (lower, _) = iterator.size_hint();
369375
self.reserve_additional(lower);
@@ -1029,6 +1035,7 @@ impl<T> Vec<T> {
10291035
/// vec.push_all_move(vec!(box 2, box 3, box 4));
10301036
/// assert_eq!(vec, vec!(box 1, box 2, box 3, box 4));
10311037
/// ```
1038+
#[inline]
10321039
pub fn push_all_move(&mut self, other: Vec<T>) {
10331040
self.extend(other.move_iter());
10341041
}
@@ -1306,6 +1313,7 @@ impl<T:PartialEq> Vec<T> {
13061313
/// let vec = vec!(1, 2, 3);
13071314
/// assert!(vec.contains(&1));
13081315
/// ```
1316+
#[inline]
13091317
pub fn contains(&self, x: &T) -> bool {
13101318
self.as_slice().contains(x)
13111319
}
@@ -1544,8 +1552,11 @@ pub mod raw {
15441552

15451553
#[cfg(test)]
15461554
mod tests {
1555+
extern crate test;
1556+
15471557
use std::prelude::*;
15481558
use std::mem::size_of;
1559+
use test::Bencher;
15491560
use super::{unzip, raw, Vec};
15501561

15511562
#[test]
@@ -1836,4 +1847,111 @@ mod tests {
18361847
let mut v = vec![BadElem(1), BadElem(2), BadElem(0xbadbeef), BadElem(4)];
18371848
v.truncate(0);
18381849
}
1850+
1851+
#[bench]
1852+
fn bench_new(b: &mut Bencher) {
1853+
b.iter(|| {
1854+
let v: Vec<int> = Vec::new();
1855+
assert_eq!(v.capacity(), 0);
1856+
assert!(v.as_slice() == []);
1857+
})
1858+
}
1859+
1860+
#[bench]
1861+
fn bench_with_capacity_0(b: &mut Bencher) {
1862+
b.iter(|| {
1863+
let v: Vec<int> = Vec::with_capacity(0);
1864+
assert_eq!(v.capacity(), 0);
1865+
assert!(v.as_slice() == []);
1866+
})
1867+
}
1868+
1869+
1870+
#[bench]
1871+
fn bench_with_capacity_5(b: &mut Bencher) {
1872+
b.iter(|| {
1873+
let v: Vec<int> = Vec::with_capacity(5);
1874+
assert_eq!(v.capacity(), 5);
1875+
assert!(v.as_slice() == []);
1876+
})
1877+
}
1878+
1879+
#[bench]
1880+
fn bench_with_capacity_100(b: &mut Bencher) {
1881+
b.iter(|| {
1882+
let v: Vec<int> = Vec::with_capacity(100);
1883+
assert_eq!(v.capacity(), 100);
1884+
assert!(v.as_slice() == []);
1885+
})
1886+
}
1887+
1888+
#[bench]
1889+
fn bench_from_fn_0(b: &mut Bencher) {
1890+
b.iter(|| {
1891+
let v: Vec<int> = Vec::from_fn(0, |_| 5);
1892+
assert!(v.as_slice() == []);
1893+
})
1894+
}
1895+
1896+
#[bench]
1897+
fn bench_from_fn_5(b: &mut Bencher) {
1898+
b.iter(|| {
1899+
let v: Vec<int> = Vec::from_fn(5, |_| 5);
1900+
assert!(v.as_slice() == [5, 5, 5, 5, 5]);
1901+
})
1902+
}
1903+
1904+
#[bench]
1905+
fn bench_from_slice_0(b: &mut Bencher) {
1906+
b.iter(|| {
1907+
let v: Vec<int> = Vec::from_slice([]);
1908+
assert!(v.as_slice() == []);
1909+
})
1910+
}
1911+
1912+
#[bench]
1913+
fn bench_from_slice_5(b: &mut Bencher) {
1914+
b.iter(|| {
1915+
let v: Vec<int> = Vec::from_slice([1, 2, 3, 4, 5]);
1916+
assert!(v.as_slice() == [1, 2, 3, 4, 5]);
1917+
})
1918+
}
1919+
1920+
#[bench]
1921+
fn bench_from_iter_0(b: &mut Bencher) {
1922+
b.iter(|| {
1923+
let v0: Vec<int> = vec!();
1924+
let v1: Vec<int> = FromIterator::from_iter(v0.move_iter());
1925+
assert!(v1.as_slice() == []);
1926+
})
1927+
}
1928+
1929+
#[bench]
1930+
fn bench_from_iter_5(b: &mut Bencher) {
1931+
b.iter(|| {
1932+
let v0: Vec<int> = vec!(1, 2, 3, 4, 5);
1933+
let v1: Vec<int> = FromIterator::from_iter(v0.move_iter());
1934+
assert!(v1.as_slice() == [1, 2, 3, 4, 5]);
1935+
})
1936+
}
1937+
1938+
#[bench]
1939+
fn bench_extend_0(b: &mut Bencher) {
1940+
b.iter(|| {
1941+
let v0: Vec<int> = vec!();
1942+
let mut v1: Vec<int> = vec!(1, 2, 3, 4, 5);
1943+
v1.extend(v0.move_iter());
1944+
assert!(v1.as_slice() == [1, 2, 3, 4, 5]);
1945+
})
1946+
}
1947+
1948+
#[bench]
1949+
fn bench_extend_5(b: &mut Bencher) {
1950+
b.iter(|| {
1951+
let v0: Vec<int> = vec!(1, 2, 3, 4, 5);
1952+
let mut v1: Vec<int> = vec!(1, 2, 3, 4, 5);
1953+
v1.extend(v0.move_iter());
1954+
assert!(v1.as_slice() == [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]);
1955+
})
1956+
}
18391957
}

src/libserialize/json.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ fn main() {
7171
let to_encode_object = TestStruct{data_str:"example of string to encode".to_string()};
7272
let mut m = io::MemWriter::new();
7373
{
74-
let mut encoder = json::Encoder::new(&mut m as &mut std::io::Writer);
74+
let mut encoder = json::Encoder::new(&mut m as &mut Writer);
7575
match to_encode_object.encode(&mut encoder) {
7676
Ok(()) => (),
7777
Err(e) => fail!("json encoding error: {}", e)

0 commit comments

Comments
 (0)