Skip to content

Commit 0c42a3f

Browse files
committed
vec::append reuses its left hand side when possible. (issue #2719)
1 parent 3297d46 commit 0c42a3f

File tree

2 files changed

+25
-6
lines changed

2 files changed

+25
-6
lines changed

src/libcore/vec.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -484,10 +484,9 @@ fn push_all_move<T>(&v: [const T]/~, -rhs: [const T]/~) {
484484

485485
// Appending
486486
#[inline(always)]
487-
pure fn append<T: copy>(lhs: [T]/&, rhs: [const T]/&) -> [T]/~ {
488-
let mut v = []/~;
487+
pure fn append<T: copy>(+lhs: [T]/~, rhs: [const T]/&) -> [T]/~ {
488+
let mut v <- lhs;
489489
unchecked {
490-
push_all(v, lhs);
491490
push_all(v, rhs);
492491
}
493492
ret v;

src/test/bench/core-std.rs

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ fn main(argv: [str]/~) {
2222
#bench[shift_push];
2323
#bench[read_line];
2424
#bench[str_set];
25+
#bench[vec_plus];
2526
#bench[vec_append];
2627
#bench[vec_push_all];
2728
}
@@ -75,18 +76,37 @@ fn str_set() {
7576
}
7677
}
7778

78-
fn vec_append() {
79+
fn vec_plus() {
7980
let r = rand::rng();
8081

81-
let mut v = []/~;
82-
for uint::range(0, 1500) {|i|
82+
let mut v = []/~;
83+
let mut i = 0;
84+
while i < 1500 {
8385
let rv = vec::from_elem(r.gen_uint_range(0, i + 1), i);
8486
if r.gen_bool() {
8587
v += rv;
8688
}
8789
else {
8890
v = rv + v;
8991
}
92+
i += 1;
93+
}
94+
}
95+
96+
fn vec_append() {
97+
let r = rand::rng();
98+
99+
let mut v = []/~;
100+
let mut i = 0;
101+
while i < 1500 {
102+
let rv = vec::from_elem(r.gen_uint_range(0, i + 1), i);
103+
if r.gen_bool() {
104+
v = vec::append(v, rv);
105+
}
106+
else {
107+
v = vec::append(rv, v);
108+
}
109+
i += 1;
90110
}
91111
}
92112

0 commit comments

Comments
 (0)