Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2b070546 authored by Devin Moore's avatar Devin Moore
Browse files

Increase parcel capacity before writing strings in String16 array

Parcel.writeString16Array writes arrays of strings one string at a time.
This causes the parcel to grow its size very often. It's grown at 3/2
the requested size to reduce the number of subsequent allocations, but
this still creates many allocations for a large array and extra wasted
memory.

This CL computes the necessary size based on the string sizes and
metadata placed into the parcel data for each string then sets the
parcel's capacity to that size.

TL;DR: writing String[1] from 156ns to 165ns (106%), String[100] from 3596ns to 2967ns (82%), String[1000] from 30822ns to 28918ns (94%).

Before the change in Parcel.java:
[1/7] android.os.ParcelPerfTest#timeWriteString16ArrayOverhead_1000: PASSED (3.691s)
        timeWriteString16ArrayOverhead_1000_mean (ns): 1962
        timeWriteString16ArrayOverhead_1000_median (ns): 1964
        timeWriteString16ArrayOverhead_1000_min (ns): 1955
        timeWriteString16ArrayOverhead_1000_standardDeviation: 4
[2/7] android.os.ParcelPerfTest#timeWriteString16Array_100_notBmp: PASSED (2.243s)
        timeWriteString16Array_100_notBmp_mean (ns): 3303
        timeWriteString16Array_100_notBmp_median (ns): 3301
        timeWriteString16Array_100_notBmp_min (ns): 3251
        timeWriteString16Array_100_notBmp_standardDeviation: 37
[3/7] android.os.ParcelPerfTest#timeWriteString16Array_1: PASSED (1.036s)
        timeWriteString16Array_1_mean (ns): 155
        timeWriteString16Array_1_median (ns): 156
        timeWriteString16Array_1_min (ns): 155
        timeWriteString16Array_1_standardDeviation: 0
[4/7] android.os.ParcelPerfTest#timeWriteString16Array_1_notBmp: PASSED (1.035s)
        timeWriteString16Array_1_notBmp_mean (ns): 153
        timeWriteString16Array_1_notBmp_median (ns): 154
        timeWriteString16Array_1_notBmp_min (ns): 153
        timeWriteString16Array_1_notBmp_standardDeviation: 0
[5/7] android.os.ParcelPerfTest#timeWriteString16Array_1000_notBmp: PASSED (2.269s)
        timeWriteString16Array_1000_notBmp_mean (ns): 26980
        timeWriteString16Array_1000_notBmp_median (ns): 27091
        timeWriteString16Array_1000_notBmp_min (ns): 26542
        timeWriteString16Array_1000_notBmp_standardDeviation: 269
[6/7] android.os.ParcelPerfTest#timeWriteString16Array_100: PASSED (2.218s)
        timeWriteString16Array_100_mean (ns): 3590
        timeWriteString16Array_100_median (ns): 3596
        timeWriteString16Array_100_min (ns): 3569
        timeWriteString16Array_100_standardDeviation: 17
[7/7] android.os.ParcelPerfTest#timeWriteString16Array_1000: PASSED (2.224s)
        timeWriteString16Array_1000_mean (ns): 30879
        timeWriteString16Array_1000_median (ns): 30822
        timeWriteString16Array_1000_min (ns): 30457
        timeWriteString16Array_1000_standardDeviation: 317

With this change:
[1/7] android.os.ParcelPerfTest#timeWriteString16ArrayOverhead_1000: PASSED (3.588s)
        timeWriteString16ArrayOverhead_1000_mean (ns): 1955
        timeWriteString16ArrayOverhead_1000_median (ns): 1956
        timeWriteString16ArrayOverhead_1000_min (ns): 1952
        timeWriteString16ArrayOverhead_1000_standardDeviation: 2
[2/7] android.os.ParcelPerfTest#timeWriteString16Array_100_notBmp: PASSED (2.299s)
        timeWriteString16Array_100_notBmp_mean (ns): 2456
        timeWriteString16Array_100_notBmp_median (ns): 2456
        timeWriteString16Array_100_notBmp_min (ns): 2410
        timeWriteString16Array_100_notBmp_standardDeviation: 30
[3/7] android.os.ParcelPerfTest#timeWriteString16Array_1: PASSED (1.086s)
        timeWriteString16Array_1_mean (ns): 164
        timeWriteString16Array_1_median (ns): 165
        timeWriteString16Array_1_min (ns): 164
        timeWriteString16Array_1_standardDeviation: 0
[4/7] android.os.ParcelPerfTest#timeWriteString16Array_1_notBmp: PASSED (1.060s)
        timeWriteString16Array_1_notBmp_mean (ns): 160
        timeWriteString16Array_1_notBmp_median (ns): 161
        timeWriteString16Array_1_notBmp_min (ns): 160
        timeWriteString16Array_1_notBmp_standardDeviation: 0
[5/7] android.os.ParcelPerfTest#timeWriteString16Array_1000_notBmp: PASSED (2.244s)
        timeWriteString16Array_1000_notBmp_mean (ns): 23705
        timeWriteString16Array_1000_notBmp_median (ns): 23682
        timeWriteString16Array_1000_notBmp_min (ns): 23338
        timeWriteString16Array_1000_notBmp_standardDeviation: 250
[6/7] android.os.ParcelPerfTest#timeWriteString16Array_100: PASSED (2.193s)
        timeWriteString16Array_100_mean (ns): 2962
        timeWriteString16Array_100_median (ns): 2967
        timeWriteString16Array_100_min (ns): 2932
        timeWriteString16Array_100_standardDeviation: 19
[7/7] android.os.ParcelPerfTest#timeWriteString16Array_1000: PASSED (2.245s)
        timeWriteString16Array_1000_mean (ns): 28870
        timeWriteString16Array_1000_median (ns): 28918
        timeWriteString16Array_1000_min (ns): 28614
        timeWriteString16Array_1000_standardDeviation: 221

Test: atest CorePerfTests --test-filter='.*timeWriteString16A.*'
Bug: 438750707
Flag: EXEMPT performance improvement

Change-Id: Ia6a9f32e57b2b173b88f60e9b819df6688d2b16e
parent fce2b2a2
Loading
Loading
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment