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
Loading
Please register or sign in to comment