diff options
| author | bors <bors@rust-lang.org> | 2018-05-02 10:13:11 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-05-02 10:13:11 +0000 |
| commit | 6a87289fa4f49b6bdd62f33f69a580026223421f (patch) | |
| tree | e8e3a61af5cd6573aa5139cf4d63c4457da47db9 /src/libsyntax | |
| parent | 5f3994f58f41818bf31efeda6af41e8060978ca5 (diff) | |
| parent | 989815d5670826078d9984a3515eeb68235a4687 (diff) | |
| download | rust-6a87289fa4f49b6bdd62f33f69a580026223421f.tar.gz rust-6a87289fa4f49b6bdd62f33f69a580026223421f.zip | |
Auto merge of #50339 - nnethercote:lazy-Printer-buf, r=michaelwoerister
Extend Printer::buf on demand.
So that 55 entries (at 48 bytes each) don't need to be eagerly
initialized on creation.
This speeds up numerous rust-perf benchmark runs, by up to 3%.
```
crates.io-check
avg: -2.4% min: -3.7% max: -1.1%
encoding-check
avg: -2.1% min: -2.9% max: -1.2%
crates.io-opt
avg: -1.3% min: -2.7% max: -0.1%
crates.io
avg: -1.4% min: -2.7% max: -0.3%
encoding-opt
avg: -1.1% min: -2.5% max: 0.1%
encoding
avg: -1.3% min: -2.4% max: -0.3%
hyper-check
avg: -1.7% min: -2.3% max: -0.9%
regex-check
avg: -1.5% min: -1.9% max: -0.7%
piston-image-check
avg: -0.9% min: -1.8% max: -0.5%
hyper
avg: -1.0% min: -1.7% max: -0.3%
hyper-opt
avg: -0.9% min: -1.7% max: -0.1%
syn-check
avg: -1.0% min: -1.5% max: -0.6%
clap-rs
avg: -0.3% min: -1.5% max: 0.2%
regex-opt
avg: -0.6% min: -1.5% max: -0.0%
regression-31157-check
avg: -1.1% min: -1.4% max: -0.7%
regex
avg: -0.7% min: -1.3% max: -0.1%
clap-rs-check
avg: -0.5% min: -1.2% max: 0.1%
syn-opt
avg: -0.5% min: -1.1% max: -0.1%
syn
avg: -0.5% min: -1.1% max: -0.2%
serde-opt
avg: -0.3% min: -1.1% max: 0.1%
piston-image-opt
avg: -0.4% min: -1.1% max: -0.0%
piston-image
avg: -0.4% min: -1.0% max: -0.0%
```
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/print/pp.rs | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/src/libsyntax/print/pp.rs b/src/libsyntax/print/pp.rs index 5c4bf47a6db..e7bd369053c 100644 --- a/src/libsyntax/print/pp.rs +++ b/src/libsyntax/print/pp.rs @@ -247,12 +247,14 @@ pub fn mk_printer<'a>(out: Box<io::Write+'a>, linewidth: usize) -> Printer<'a> { debug!("mk_printer {}", linewidth); Printer { out, - buf_len: n, + buf_max_len: n, margin: linewidth as isize, space: linewidth as isize, left: 0, right: 0, - buf: vec![BufEntry { token: Token::Eof, size: 0 }; n], + // Initialize a single entry; advance_right() will extend it on demand + // up to `buf_max_len` elements. + buf: vec![BufEntry::default()], left_total: 0, right_total: 0, scan_stack: VecDeque::new(), @@ -263,7 +265,7 @@ pub fn mk_printer<'a>(out: Box<io::Write+'a>, linewidth: usize) -> Printer<'a> { pub struct Printer<'a> { out: Box<io::Write+'a>, - buf_len: usize, + buf_max_len: usize, /// Width of lines we're constrained to margin: isize, /// Number of spaces left on line @@ -297,6 +299,12 @@ struct BufEntry { size: isize, } +impl Default for BufEntry { + fn default() -> Self { + BufEntry { token: Token::Eof, size: 0 } + } +} + impl<'a> Printer<'a> { pub fn last_token(&mut self) -> Token { self.buf[self.right].token.clone() @@ -322,7 +330,9 @@ impl<'a> Printer<'a> { self.right_total = 1; self.left = 0; self.right = 0; - } else { self.advance_right(); } + } else { + self.advance_right(); + } debug!("pp Begin({})/buffer Vec<{},{}>", b.offset, self.left, self.right); self.buf[self.right] = BufEntry { token: token, size: -self.right_total }; @@ -349,7 +359,9 @@ impl<'a> Printer<'a> { self.right_total = 1; self.left = 0; self.right = 0; - } else { self.advance_right(); } + } else { + self.advance_right(); + } debug!("pp Break({})/buffer Vec<{},{}>", b.offset, self.left, self.right); self.check_stack(0); @@ -408,7 +420,11 @@ impl<'a> Printer<'a> { } pub fn advance_right(&mut self) { self.right += 1; - self.right %= self.buf_len; + self.right %= self.buf_max_len; + // Extend the buf if necessary. + if self.right == self.buf.len() { + self.buf.push(BufEntry::default()); + } assert_ne!(self.right, self.left); } pub fn advance_left(&mut self) -> io::Result<()> { @@ -438,7 +454,7 @@ impl<'a> Printer<'a> { } self.left += 1; - self.left %= self.buf_len; + self.left %= self.buf_max_len; left_size = self.buf[self.left].size; } |
