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

Commit d2cbeb8c authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Reduce frequency of LongArrayMultistateCounter.incrementValues calls

This is an optimization that skips incrementing a multi-state counter
with an array of zeros. Adding a zero does not take much time,
but locking the java array in the JNI layer is expensive.

Bug: 395954049
Test: atest PowerStatsTests; atest PowerStatsTests:BatteryUsageStatsProviderPerfTest#getBatteryUsageStats_accumulated
Flag: EXEMPT bugfix
Change-Id: I5310a08bf8a56818ee3361097842f763f3c026ac
parent 726819d7
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.internal.os;

import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcelable;
import android.ravenwood.annotation.RavenwoodKeepWholeClass;
@@ -155,8 +156,9 @@ public final class LongArrayMultiStateCounter implements Parcelable {

    /**
     * Adds the supplied values to the current accumulated values in the counter.
     * Null `values` parameter is interpreted as an array of zeros.
     */
    public void incrementValues(long[] values, long timestampMs) {
    public void incrementValues(@Nullable long[] values, long timestampMs) {
        native_incrementValues(mNativeObject, values, timestampMs);
    }

+8 −4
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.internal.os;

import android.annotation.Nullable;
import android.os.BadParcelableException;
import android.os.Parcel;
import android.ravenwood.annotation.RavenwoodKeepWholeClass;
@@ -147,11 +148,13 @@ class LongArrayMultiStateCounter_ravenwood {
            mLastUpdateTimestampMs = timestampMs;
        }

        public void incrementValues(long[] delta, long timestampMs) {
        public void incrementValues(@Nullable long[] delta, long timestampMs) {
            long[] values = Arrays.copyOf(mValues, mValues.length);
            if (delta != null) {
                for (int i = 0; i < mArrayLength; i++) {
                    values[i] += delta[i];
                }
            }
            updateValue(values, timestampMs);
        }

@@ -304,7 +307,8 @@ class LongArrayMultiStateCounter_ravenwood {
        getInstance(targetInstanceId).copyStatesFrom(getInstance(sourceInstanceId));
    }

    public static void native_incrementValues(long instanceId, long[] delta, long timestampMs) {
    public static void native_incrementValues(long instanceId, @Nullable long[] delta,
            long timestampMs) {
        getInstance(instanceId).incrementValues(delta, timestampMs);
    }

+7 −1
Original line number Diff line number Diff line
@@ -97,7 +97,13 @@ static void native_updateValues(JNIEnv *env, jclass, jlong nativePtr, jlongArray
static void native_incrementValues(JNIEnv *env, jclass, jlong nativePtr, jlongArray values,
                                   jlong timestamp) {
    auto *counter = reinterpret_cast<LongArrayMultiStateCounter *>(nativePtr);
    if (values != nullptr) {
        counter->incrementValue(JavaUint64Array(env, values), timestamp);
    } else {
        // Pass an empty Uint64Array, which is equivalent to an array of zeros.
        // This is done to ensure that the timestamp is still updated in the counter.
        counter->incrementValue(Uint64Array(), timestamp);
    }
}

static void native_addCounts(JNIEnv *env, jclass, jlong nativePtr, jlongArray values) {
+7 −6
Original line number Diff line number Diff line
@@ -274,9 +274,9 @@ abstract class BinaryStatePowerStatsProcessor extends PowerStatsProcessor {
                    int uid = uids.get(k);
                    if (stats.getUidStats(mTmpUidStatsArray, uid,
                            proportionalEstimate.stateValues)) {
                        double power = intermediates.power
                                * mStatsLayout.getUidUsageDuration(mTmpUidStatsArray)
                                / intermediates.duration;
                        long duration = mStatsLayout.getUidUsageDuration(mTmpUidStatsArray);
                        if (duration != 0) {
                            double power = intermediates.power * duration / intermediates.duration;
                            mStatsLayout.setUidPowerEstimate(mTmpUidStatsArray, power);
                            stats.setUidStats(uid, proportionalEstimate.stateValues,
                                    mTmpUidStatsArray);
@@ -286,3 +286,4 @@ abstract class BinaryStatePowerStatsProcessor extends PowerStatsProcessor {
            }
        }
    }
}
+4 −2
Original line number Diff line number Diff line
@@ -299,8 +299,10 @@ class BluetoothPowerStatsProcessor extends PowerStatsProcessor {
                            / intermediates.txBytes;
                }
            }
            if (power != 0) {
                mStatsLayout.setUidPowerEstimate(mTmpUidStatsArray, power);
                stats.setUidStats(uid, proportionalEstimate.stateValues, mTmpUidStatsArray);
            }
        }
    }
}
Loading