Firebase Android offline performance


Nils

When storing around 5000 child nodes under a single node, Firebase is very slow to initialize when using the offline feature. It takes about 30 seconds to execute the first query. Once initialized, executing subsequent queries (such as listing the top 25 children) will take less than a second.

I am using the following property to enable offline functionality: Firebase.getDefaultConfig(). setPersistenceEnabled(true); firebase.keepSynced(true);

My structure looks like this:

<root>
 |-my-app-name
   |-<uid>
     |-node
       |-sub node 1
       |-...
       |-sub node 5000

Keep Sync is set on the <uid>node . Child nodes are displayed in the Recycler View. Preferably, I'd like to list everything (instead of 25 per page), but I know that's not possible because there is no Cursor-like mechanism available for Firebase (Android provides for SQLite).

This is by design, do I modify the data structure? Or is there some other way to reduce initialization time?

I've provided some logging below. As you can see, a lot of garbage collection is going on. Does Firebase evaluate the entire database when initializing?

Thanks! Nils

04-01 15:59:12.029 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 43005(1717KB) AllocSpace objects, 0(0B) LOS objects, 4% free, 31MB/32MB, paused 5.674ms total 57.402ms
04-01 15:59:13.415 2222-2240/abcdef W/art: Suspending all threads took: 6.600ms
04-01 15:59:13.424 2222-2245/abcdef W/art: Suspending all threads took: 9.339ms
04-01 15:59:13.433 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 7097(281KB) AllocSpace objects, 0(0B) LOS objects, 0% free, 32MB/32MB, paused 11.175ms total 27.105ms
04-01 15:59:13.821 2222-2245/abcdef I/art: Background partial concurrent mark sweep GC freed 101674(5MB) AllocSpace objects, 18(530KB) LOS objects, 35% free, 28MB/44MB, paused 3.400ms total 152.664ms
04-01 15:59:15.107 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 394024(15MB) AllocSpace objects, 0(0B) LOS objects, 20% free, 30MB/38MB, paused 1.865ms total 152.182ms
04-01 15:59:15.817 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 218328(8MB) AllocSpace objects, 0(0B) LOS objects, 19% free, 31MB/38MB, paused 1.711ms total 112.325ms
04-01 15:59:16.451 2222-2240/abcdef W/art: Suspending all threads took: 27.786ms
04-01 15:59:16.465 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 190591(7MB) AllocSpace objects, 0(0B) LOS objects, 18% free, 31MB/38MB, paused 1.832ms total 107.416ms
04-01 15:59:16.472 2222-2245/abcdef W/art: Suspending all threads took: 6.823ms
04-01 15:59:17.084 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 178714(6MB) AllocSpace objects, 0(0B) LOS objects, 15% free, 32MB/38MB, paused 1.717ms total 105.529ms
04-01 15:59:17.629 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 163584(6MB) AllocSpace objects, 0(0B) LOS objects, 14% free, 33MB/38MB, paused 1.743ms total 110.764ms
04-01 15:59:18.941 2222-2240/abcdef W/art: Suspending all threads took: 5.078ms
04-01 15:59:19.691 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 95627(3MB) AllocSpace objects, 0(0B) LOS objects, 8% free, 35MB/38MB, paused 7.190ms total 86.171ms
04-01 15:59:19.961 2222-2240/abcdef W/art: Suspending all threads took: 18.208ms
04-01 15:59:20.965 2222-2245/abcdef W/art: Suspending all threads took: 5.254ms
04-01 15:59:20.990 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 55899(2MB) AllocSpace objects, 0(0B) LOS objects, 5% free, 36MB/38MB, paused 6.799ms total 66.923ms
04-01 15:59:22.495 2222-2240/abcdef W/art: Suspending all threads took: 45.180ms
04-01 15:59:22.509 2222-2245/abcdef W/art: Suspending all threads took: 14.254ms
04-01 15:59:22.562 2222-2245/abcdef I/art: Background partial concurrent mark sweep GC freed 198174(6MB) AllocSpace objects, 3(487KB) LOS objects, 32% free, 33MB/49MB, paused 16.949ms total 215.369ms
04-01 15:59:23.811 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 392437(15MB) AllocSpace objects, 0(0B) LOS objects, 18% free, 35MB/43MB, paused 1.936ms total 168.222ms
04-01 15:59:24.480 2222-2240/abcdef W/art: Suspending all threads took: 22.464ms
04-01 15:59:24.497 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 227043(8MB) AllocSpace objects, 0(0B) LOS objects, 18% free, 35MB/43MB, paused 1.723ms total 117.855ms
04-01 15:59:25.173 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 203910(7MB) AllocSpace objects, 0(0B) LOS objects, 16% free, 36MB/43MB, paused 1.694ms total 112.618ms
04-01 15:59:25.181 2222-2245/abcdef W/art: Suspending all threads took: 7.301ms
04-01 15:59:25.784 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 185627(7MB) AllocSpace objects, 0(0B) LOS objects, 14% free, 37MB/43MB, paused 1.719ms total 115.362ms
04-01 15:59:26.345 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 167066(6MB) AllocSpace objects, 0(0B) LOS objects, 13% free, 37MB/43MB, paused 1.651ms total 106.055ms
04-01 15:59:26.865 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 154535(6MB) AllocSpace objects, 0(0B) LOS objects, 11% free, 38MB/43MB, paused 1.644ms total 104.888ms
04-01 15:59:28.357 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 151375(5MB) AllocSpace objects, 33(671KB) LOS objects, 9% free, 39MB/43MB, paused 2.740ms total 104.176ms
04-01 15:59:29.006 2222-2240/abcdef W/art: Suspending all threads took: 19.232ms
04-01 15:59:29.060 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 133554(5MB) AllocSpace objects, 29(580KB) LOS objects, 10% free, 39MB/43MB, paused 1.563ms total 100.220ms
04-01 15:59:30.173 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 131062(4MB) AllocSpace objects, 31(637KB) LOS objects, 9% free, 39MB/43MB, paused 1.653ms total 102.705ms
04-01 15:59:31.245 2222-2245/abcdef I/art: Background sticky concurrent mark sweep GC freed 122085(4MB) AllocSpace objects, 26(522KB) LOS objects, 8% free, 39MB/43MB, paused 2.380ms total 100.776ms
04-01 15:59:32.024 2222-2240/abcdef W/art: Suspending all threads took: 20.662ms

PS: This is a cross post : https://groups.google.com/forum/#!topic/firebase-talk/migEAwv26ns

Nils

So sharding the data so that a root node has at most 200 children seems to be the answer at the moment. I set .keepSynced(true) on the shard, which resulted in better performance.

To display a list of shards in a single recycler view, I created a FirebaseArrays class which is a collection of FirebaseArrays that aggregates multiple arrays into a single observable collection.
https://gist.github.com/ndefeijter/2191f8a43ce903c5d9ea69f02c7ee7e9

I also modified FirebaseRecyclerAdapter to use FirebaseArrays as the underlying data structure instead of a single FirebaseArray . The interface was extended with some methods to add additional Firebase paths (i.e. shards).
https://gist.github.com/ndefeijter/d98eb5f643b5faf5476b8a611de912c1

These paths are added on the "load more" event (e.g. in the case of endless scrolling).

private void loadMore() {

    final View view = getView();
    if (null != view) {
        final RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
        final FirebaseRecyclerAdapter2<Visit, VisitViewHolder> adapter = (FirebaseRecyclerAdapter2<Visit, VisitViewHolder>) recyclerView.getAdapter();
        adapter.addQuery(nextQuery());
    }
}

Related


Firebase Android offline performance

Nils When storing around 5000 child nodes under a single node, Firebase is very slow to initialize when using the offline feature. It takes about 30 seconds to execute the first query. Once initialized, executing subsequent queries (such as listing the top 25

Firebase Android offline performance

Nils When storing around 5000 child nodes under a single node, Firebase is very slow to initialize when using the offline feature. It takes about 30 seconds to execute the first query. Once initialized, executing subsequent queries (such as listing the top 25

Firebase Android offline performance

Nils When storing around 5000 child nodes under a single node, Firebase is very slow to initialize when using the offline feature. It takes about 30 seconds to execute the first query. Once initialized, executing subsequent queries (such as listing the top 25

Firebase Android offline performance

Nils When storing around 5000 child nodes under a single node, Firebase is very slow to initialize when using the offline feature. It takes about 30 seconds to execute the first query. Once initialized, executing subsequent queries (such as listing the top 25

Firebase Android offline performance

Nils When storing around 5000 child nodes under a single node, Firebase is very slow to initialize when using the offline feature. It takes about 30 seconds to execute the first query. Once initialized, executing subsequent queries (such as listing the top 25

Firebase Android offline performance

Nils When storing around 5000 child nodes under a single node, Firebase is very slow to initialize when using the offline feature. It takes about 30 seconds to execute the first query. Once initialized, executing subsequent queries (such as listing the top 25

Firebase Android offline performance

Nils When storing around 5000 child nodes under a single node, Firebase is very slow to initialize when using the offline feature. It takes about 30 seconds to execute the first query. Once initialized, executing subsequent queries (such as listing the top 25

Android Live Firebase Offline Sync

Kevin Jensen I'm not sure if this is what firebase is supposed to do, but when I use this line: FirebaseDatabase.getInstance().setPersistenceEnabled(true); Everything is great and I can use the app offline. But what I want to achieve is when the user adds som

Log Firebase events offline and online in Android

Amit: If I log events offline and then bulk send them online to Firebase, will the event date be the same as the send or log date? Alex Momo: Neither Cloud Firestore nor Firebase Realtime Database store date and time in metadata. If you need this functionality

Does Firebase Storage for Android support offline caching?

VivekRajendran I wonder if Firebase Storage for Android supports offline features like Firestore? Doug Stevenson The Firebase SDK for cloud storage does not natively support offline access. If you're using a library like Glide for Android, you might have some

Log Firebase events offline and online in Android

Amit: If I log an event offline and then batch send it online to Firebase, will the event date be the same as the send or log date? Alex Momo: Neither Cloud Firestore nor Firebase Realtime Database store date and time in metadata. If you need this functionalit

Log Firebase events offline and online in Android

Amit: If I log an event offline and then batch send it online to Firebase, will the event date be the same as the send or log date? Alex Momo: Neither Cloud Firestore nor Firebase Realtime Database store date and time in metadata. If you need this functionalit

How to modify Firebase offline data via Android?

casaba The android app I'm currently developing will mostly run offline. However, when online, users can connect to the database to download the required data. Additionally, they are able to manage data offline, so they can delete data they don't want to use.

Android-Firebase Offline Best Practices

Chandra Sekhar I've been understanding the concept of taking Firebase App offline. According to the documentation, we need to call: FirebaseDatabase.getInstance().setPersistenceEnabled(true); But where should we call it? Should it be used in every activity of

Does Firebase Storage for Android support offline caching?

VivekRajendran I wonder if Firebase Storage for Android supports offline features like Firestore? Doug Stevenson The Firebase SDK for cloud storage does not natively support offline access. If you're using a library like Glide for Android, you might have some

Log Firebase events offline and online in Android

Amit: If I log an event offline and then batch send it online to Firebase, will the event date be the same as the send or log date? Alex Momo: Neither Cloud Firestore nor Firebase Realtime Database store date and time in metadata. If you need this functionalit

Log Firebase events offline and online in Android

Amit: If I log an event offline and then batch send it online to Firebase, will the event date be the same as the send or log date? Alex Momo: Neither Cloud Firestore nor Firebase Realtime Database store date and time in metadata. If you need this functionalit

Does Firebase Storage for Android support offline caching?

VivekRajendran I wonder if Firebase Storage for Android supports offline features like Firestore? Doug Stevenson The Firebase SDK for cloud storage does not natively support offline access. If you're using a library like Glide for Android, you might have some

How to modify Firebase offline data via Android?

casaba The android app I'm currently developing will mostly run offline. However, when online, users can connect to the database to download the required data. Additionally, they are able to manage data offline, so they can delete data they don't want to use.

Firebase setOffline() and reading offline data (android)

Collide The following situations: User is not registered and I save data offline (Firebase setOffline()) Unable to read local data (fill listview etc.) - Don't fire in ValueEventListener and ChildEventListener I have setOnline() set on Firebase instance Data i

Can I add the Firebase SDK to my Android Studio offline?

Sinanta Dahir I need to use firbase for my android project. But my computer has no internet connection. Can I download the firebase SDK and manually add it to my Android Studio? please help me. Doug Stevenson All you need to do is create a project, reference a

Can I add the Firebase SDK to my Android Studio offline?

Sinanta Dahir I need to use firbase for my android project. But my computer has no internet connection. Can I download the firebase SDK and manually add it to my Android Studio? Please help me. Doug Stevenson All you need to do is create a project, reference a

Firebase Rest API performance results for Android app

Saru TD As we all know, Firebase provides App performance monitoring. I have integrated my app with it and got the results on the Firebase console. I would like to get the result via the Rest API provided by Firebase or other means. Please let me know if Fireb

Firebase Rest API performance results for Android app

Saru TD As we all know, Firebase provides App performance monitoring. I have integrated my app with it and got the results on the Firebase console. I would like to get the result via the Rest API provided by Firebase or other means. Please let me know if Fireb

Firebase Rest API performance results for Android app

Saru TD As we all know, Firebase provides App performance monitoring. I have integrated my app with it and got the results on the Firebase console. I would like to get the result via the Rest API provided by Firebase or other means. Please let me know if Fireb

Firebase Rest API performance results for Android app

Saru TD As we all know, Firebase provides App performance monitoring. I have integrated my app with it and got the results on the Firebase console. I would like to get the result via the Rest API provided by Firebase or other means. Please let me know if Fireb

Firebase Rest API performance results for Android app

Saru TD As we all know, Firebase provides App performance monitoring. I have integrated my app with it and got the results on the Firebase console. I would like to get the result via the Rest API provided by Firebase or other means. Please let me know if Fireb

Firebase Rest API performance results for Android app

Saru TD As we all know, Firebase provides App performance monitoring. I have integrated my app with it and got the results on the Firebase console. I would like to get the result via the Rest API provided by Firebase or other means. Please let me know if Fireb