Improve performance of small CursorWindows.
Currently each CursorWindow allocates a 2MiB ashmem region to store data, but this ends up being quite wasteful since the majority of windows only end up storing a small handful of rows/columns. In addition, creating and mmap'ing these ashmem regions requires acquiring the mmap semaphore in the kernel, which can significantly impact P95/P99 metrics when the system is under heavy load. To mitigate the issues described above, this change adjusts CursorWindow to send small windows (under 16KiB in size) directly inline in Parcel responses without requiring an ashmem region. CursorWindows also offer to gracefully "inflate" themselves into an ashmem region when filled with more than 16KiB of data. This requires some bugfixes around alloc() call sites to ensure that any pointers are converted to offsets during a potential inflation. The benchmarks referenced below show the following improvements after this change is applied: * Small cursor (1 row): 36% performance improvement * Medium cursor (100 rows): no difference * Large cursor (10k rows): no difference Bug: 169251528 Test: atest CtsDatabaseTestCases Test: atest FrameworksCoreTests:android.database Test: ./frameworks/base/libs/hwui/tests/scripts/prep_generic.sh little && atest CorePerfTests:android.database.CrossProcessCursorPerfTest Change-Id: Ie0fd149299f9847bf59a39f2855ed201bca4cdf6
Loading
Please register or sign in to comment