about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2018-05-02 10:13:11 +0000
committerbors <bors@rust-lang.org>2018-05-02 10:13:11 +0000
commit6a87289fa4f49b6bdd62f33f69a580026223421f (patch)
treee8e3a61af5cd6573aa5139cf4d63c4457da47db9 /src/libsyntax
parent5f3994f58f41818bf31efeda6af41e8060978ca5 (diff)
parent989815d5670826078d9984a3515eeb68235a4687 (diff)
downloadrust-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.rs30
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;
         }