Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Avoid more allocations when compiling html5ever #37373

Merged
merged 3 commits into from
Oct 29, 2016

Conversation

nnethercote
Copy link
Contributor

These three commits reduce the number of allocations performed when compiling html5ever from 13.2M to 10.8M, which speeds up compilation by about 2%.

r? @nrc

@@ -161,7 +162,7 @@ pub fn count_names(ms: &[TokenTree]) -> usize {
})
}

pub fn initial_matcher_pos(ms: Rc<Vec<TokenTree>>, sep: Option<Token>, lo: BytePos)
pub fn initial_matcher_pos(ms: Vec<TokenTree>, sep: Option<Token>, lo: BytePos)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe this means that we are now copying/moving the Vec; perhaps we only need &[TokenTree] here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Vec gets put into the MatcherPos, so if it becomes a reference then MatcherPos will need a lifetime paramter and things get more complicated. Copying a Vec shouldn't be that expensive because only three words get copied, right? I did a Cachegrind run and this commit caused the number of instructions executed to drop.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cloning a Vec copies all the allocated elements. But it can probably use memcpy, so that should be fast.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was under the impression that passing a Vec as an argument to a function doesn't clone it. Have I got that wrong?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh right... forget I said anything, I thought the Rc was there to prevent the cloning.

@leonardo-m
Copy link

Are those changes speeding up the compilation of other programs too? Optimizations should be added only after there's a more general proof of their quality.

@bluss
Copy link
Member

bluss commented Oct 24, 2016

It looks like SmallVec should impl Deref/DerefMut so that the .as_slice()/mut calls become redundant, and it's more of a drop in replacement for Vec.

.cloned()
.collect()),
let mut cur_eis = SmallVector::zero();
cur_eis.push(initial_matcher_pos(ms.iter().cloned().collect(),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this should be a simple ms.to_owned()

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And could this use SmallVector::one instead of zero and push?

@nrc
Copy link
Member

nrc commented Oct 25, 2016

r=me with the nits in macro_parser.rs addressed

This avoids 800,000 heap allocations when compiling html5ever.
This avoids 800,000 heap allocations when compiling html5ever. It
requires tweaking `SmallVector` a little.
This avoids 800,000 allocations when compiling html5ever.
@nnethercote
Copy link
Contributor Author

Updated to address comments, including adding Deref and DerefMut support to SmallVector, which made things nicer :)

@nrc
Copy link
Member

nrc commented Oct 25, 2016

@bors: r+

@bors
Copy link
Contributor

bors commented Oct 25, 2016

📌 Commit c440a7a has been approved by nrc

Manishearth added a commit to Manishearth/rust that referenced this pull request Oct 26, 2016
Avoid more allocations when compiling html5ever

These three commits reduce the number of allocations performed when compiling html5ever from 13.2M to 10.8M, which speeds up compilation by about 2%.

r? @nrc
@bors
Copy link
Contributor

bors commented Oct 29, 2016

⌛ Testing commit c440a7a with merge e9b2fcb...

bors added a commit that referenced this pull request Oct 29, 2016
Avoid more allocations when compiling html5ever

These three commits reduce the number of allocations performed when compiling html5ever from 13.2M to 10.8M, which speeds up compilation by about 2%.

r? @nrc
@bors bors merged commit c440a7a into rust-lang:master Oct 29, 2016
@nnethercote nnethercote deleted the html5ever-more-more branch October 30, 2016 22:57
@brson brson added the relnotes Marks issues that should be documented in the release notes of the next release. label Nov 1, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
relnotes Marks issues that should be documented in the release notes of the next release.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants