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

Severe performance regression in onSnapshot listeners in Cloud Firestore #2620

Closed
djsweet opened this issue Feb 12, 2020 · 3 comments
Closed

Comments

@djsweet
Copy link

djsweet commented Feb 12, 2020

[REQUIRED] Describe your environment

  • Operating System version: Windows 10 Version 1909
  • Browser version: Google Chrome Version 80.0.3987.87 (Official Build) (64-bit)
  • Firebase SDK version: 7.8.1, since 7.3.0
  • Firebase Product: firestore (auth, database, storage, etc)

[REQUIRED] Describe the problem

SDK 7.3.0 introduced a severe performance regression in the Firestore onSnapshot listener mechanism.

We listen to up to 3000 writes per second written in batches of 50 per transaction. As of SDK 7.2.3, each round of 3000 writes takes approximately 1 second, but often blocks the event loop for up to the entire second. Starting with SDK 7.3.0, this same amount of writes takes upwards of 30 seconds, also often blocking the event loop for the entirety of the duration. Our users were complaining that their browsers were recommending that they close their tabs due to unresponsiveness.

I have prepared a sample project to reproduce this problem. Here are some relevant screenshots with simple measurements. In the report columns, "RAF" is used as a placeholder for requestAnimationFrame. The sample project uses window.requestAnimationFrame to determine the severity of event loop blocking.

SDK 7.2.3

Firebase 7 2 3 Update Times

SDK 7.3.0

Firebase 7 3 0 Update Times

SDK 7.8.0

Firebase 7 8 0 Update Times

SDK 7.8.1

Firebase 7 8 1 Update Times

It seems that there have been improvements since SDK 7.3.0, but stalling the event loop for 25 seconds as of SDK 7.8.1 is still unacceptable.

As is noted in the sample project, it is not easily possible to determine the duration of the first invocation of onSnapshot for an update session. Because of this, all reported times are optimistic: the actual duration of an update session is always worse than is written to the page.

Steps to reproduce:

See https://github.com/djsweet/firestore-looplock-bug-report for an environment which reproduces this problem.

@wu-hui
Copy link
Contributor

wu-hui commented Feb 12, 2020

Thank you very much for reporting this and the very detailed reproduction! Really appreciate it!

It turns out from 7.2.3 to 7.3.0 we introduced a new feature that utilized an inefficient Set union operation, which led to the performance regression.

#2624 should fix this regression.

Again, thanks for reporting this!

@wu-hui
Copy link
Contributor

wu-hui commented Feb 13, 2020

Fix is merged. This should be fixed in next release.

@djsweet
Copy link
Author

djsweet commented Feb 26, 2020

I can confirm that Firebase 7.9.1 fixes this issue.

@firebase firebase locked and limited conversation to collaborators Mar 15, 2020
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

3 participants