diff options
| author | bors <bors@rust-lang.org> | 2013-05-31 22:04:38 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-05-31 22:04:38 -0700 |
| commit | c23843c4471dcacb203d4439ef7c19bb2c3238b0 (patch) | |
| tree | 632c494801829eba5c4c63a1fadbf620c02424d4 /src | |
| parent | b570536b38d3172deabb471f407993a1aa2d4a0d (diff) | |
| parent | c299230f3d7a43a4307ce317aa41b7e8f361a2e6 (diff) | |
| download | rust-c23843c4471dcacb203d4439ef7c19bb2c3238b0.tar.gz rust-c23843c4471dcacb203d4439ef7c19bb2c3238b0.zip | |
auto merge of #6876 : cmr/rust/from_elem_opts, r=Aatch
borrowck 1.85x speedup on libstd
Diffstat (limited to 'src')
| -rw-r--r-- | src/libstd/vec.rs | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs index 795c3cdb405..8eedb70b3a6 100644 --- a/src/libstd/vec.rs +++ b/src/libstd/vec.rs @@ -149,8 +149,7 @@ pub fn from_fn<T>(n_elts: uint, op: old_iter::InitOp<T>) -> ~[T] { do as_mut_buf(v) |p, _len| { let mut i: uint = 0u; while i < n_elts { - intrinsics::move_val_init(&mut(*ptr::mut_offset(p, i)), - op(i)); + intrinsics::move_val_init(&mut(*ptr::mut_offset(p, i)), op(i)); i += 1u; } } @@ -166,7 +165,20 @@ pub fn from_fn<T>(n_elts: uint, op: old_iter::InitOp<T>) -> ~[T] { * to the value `t`. */ pub fn from_elem<T:Copy>(n_elts: uint, t: T) -> ~[T] { - from_fn(n_elts, |_i| copy t) + // hack: manually inline from_fn for 2x plus speedup (sadly very important, from_elem is a + // bottleneck in borrowck!) + unsafe { + let mut v = with_capacity(n_elts); + do as_mut_buf(v) |p, _len| { + let mut i = 0u; + while i < n_elts { + intrinsics::move_val_init(&mut(*ptr::mut_offset(p, i)), copy t); + i += 1u; + } + } + raw::set_len(&mut v, n_elts); + v + } } /// Creates a new unique vector with the same contents as the slice |
