diff options
| author | bors <bors@rust-lang.org> | 2018-07-29 21:37:47 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-07-29 21:37:47 +0000 |
| commit | 866a713258915e6cbb212d135f751a6a8c9e1c0a (patch) | |
| tree | a167fe06a630b04423cfd159186a0eacc27afc52 /src/libsyntax | |
| parent | 70cac59031d5c33962a1f53cdca9359c0dcd1f9f (diff) | |
| parent | 59c8a279daf6912b99ba089ff6dafbfc3469831e (diff) | |
| download | rust-866a713258915e6cbb212d135f751a6a8c9e1c0a.tar.gz rust-866a713258915e6cbb212d135f751a6a8c9e1c0a.zip | |
Auto merge of #52738 - ljedrz:push_to_extend, r=eddyb
Replace push loops with extend() where possible Or set the vector capacity where I couldn't do it. According to my [simple benchmark](https://gist.github.com/ljedrz/568e97621b749849684c1da71c27dceb) `extend`ing a vector can be over **10 times** faster than `push`ing to it in a loop: 10 elements (6.1 times faster): ``` test bench_extension ... bench: 75 ns/iter (+/- 23) test bench_push_loop ... bench: 458 ns/iter (+/- 142) ``` 100 elements (11.12 times faster): ``` test bench_extension ... bench: 87 ns/iter (+/- 26) test bench_push_loop ... bench: 968 ns/iter (+/- 3,528) ``` 1000 elements (11.04 times faster): ``` test bench_extension ... bench: 311 ns/iter (+/- 9) test bench_push_loop ... bench: 3,436 ns/iter (+/- 233) ``` Seems like a good idea to use `extend` as much as possible.
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ast.rs | 10 | ||||
| -rw-r--r-- | src/libsyntax/parse/lexer/mod.rs | 4 |
2 files changed, 3 insertions, 11 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index 1b6b47f5489..d59c9dd6b53 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -500,10 +500,7 @@ impl Pat { PatKind::Slice(pats, None, _) if pats.len() == 1 => pats[0].to_ty().map(TyKind::Slice)?, PatKind::Tuple(pats, None) => { - let mut tys = Vec::new(); - for pat in pats { - tys.push(pat.to_ty()?); - } + let tys = pats.iter().map(|pat| pat.to_ty()).collect::<Option<Vec<_>>>()?; TyKind::Tup(tys) } _ => return None, @@ -949,10 +946,7 @@ impl Expr { ExprKind::Array(exprs) if exprs.len() == 1 => exprs[0].to_ty().map(TyKind::Slice)?, ExprKind::Tup(exprs) => { - let mut tys = Vec::new(); - for expr in exprs { - tys.push(expr.to_ty()?); - } + let tys = exprs.iter().map(|expr| expr.to_ty()).collect::<Option<Vec<_>>>()?; TyKind::Tup(tys) } ExprKind::Binary(binop, lhs, rhs) if binop.node == BinOpKind::Add => diff --git a/src/libsyntax/parse/lexer/mod.rs b/src/libsyntax/parse/lexer/mod.rs index 4b077aa8dd4..f9b9e95ead1 100644 --- a/src/libsyntax/parse/lexer/mod.rs +++ b/src/libsyntax/parse/lexer/mod.rs @@ -265,9 +265,7 @@ impl<'a> StringReader<'a> { m.push(c); } _ => { - for c in c.escape_default() { - m.push(c); - } + m.extend(c.escape_default()); } } } |
