Skip to content

Improve performance by checking that the data changes#279

Merged
Rich-Harris merged 3 commits intosveltejs:masterfrom
PaulBGD:improve-perf
Feb 15, 2017
Merged

Improve performance by checking that the data changes#279
Rich-Harris merged 3 commits intosveltejs:masterfrom
PaulBGD:improve-perf

Conversation

@PaulBGD
Copy link
Copy Markdown
Member

@PaulBGD PaulBGD commented Feb 6, 2017

Basically, anything that touches the DOM is slow. Because if that, this PR checks if any data changes before touching the DOM.

You can see the performance by comparing the dbmonster built with this PR to the normal one: https://svelte-dbmonster-perf.surge.sh/dist/index.html

Here are some screenshots from my late 2012 i5 macbook pro:

screen shot 2017-02-05 at 8 06 03 pm
screen shot 2017-02-05 at 8 06 14 pm

The dbmonster based off this PR will jump up to 600fps, but the regular dbmonster doesn't go past 60fps. I'm not sure why the dbmonster based off this PR has such sudden fps jumps (although it doesn't drop below 60 for me.)

@PaulBGD
Copy link
Copy Markdown
Member Author

PaulBGD commented Feb 6, 2017

After testing this in chrome, it seems that this only has such a big performance improvement for Firefox. I guess chrome must internally check if it changed and firefox doesn't.

@Swatinem
Copy link
Copy Markdown
Member

Swatinem commented Feb 8, 2017

Depending on the expression, snippet might be pretty long (codesize-wise) and also be slow (think computed accessors).

I was thinking about creating a helper for text nodes (and later also for attributes, see #25 ) that does memoization and comparison internally.
That textnode helper might have the same api as fragments, with update, mount, and detach functions.
What do you think about that?

@Rich-Harris
Copy link
Copy Markdown
Member

Wow, that's an impressive speedup on Firefox. Memoizing helpers is definitely worth exploring — there might be an overhead involved (truthfully I have no idea) so maybe the right move in the meantime would be to assign ${snippet} to a tmp variable (which could be reused) and comparing that to last_${name}?

@PaulBGD
Copy link
Copy Markdown
Member Author

PaulBGD commented Feb 8, 2017

Good idea about assigning ${snippet} to a temporary variable.

@PaulBGD
Copy link
Copy Markdown
Member Author

PaulBGD commented Feb 8, 2017

So since I'm finally on a windows computer I decided to try this on Edge.

Regular:
Image

PR:
Image

The FPS isn't very different but the change between view update time is huge.

@Rich-Harris Rich-Harris merged commit 3bcdab9 into sveltejs:master Feb 15, 2017
@Rich-Harris
Copy link
Copy Markdown
Member

I implemented the temporary variable thing, and extended this to {{{triples}}} and attributes

@PaulBGD
Copy link
Copy Markdown
Member Author

PaulBGD commented Feb 15, 2017

Looks good.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants