diff options
author | Jing Ji <jji@google.com> | 2019-10-17 15:36:57 -0700 |
---|---|---|
committer | Jing Ji <jji@google.com> | 2019-12-13 14:51:41 -0800 |
commit | 84121313620345199b56816c579df31d68567581 (patch) | |
tree | 4bd8e5d711cabbc48f7bfdfd8db5771ff66d5e92 /apct-tests/perftests/utils | |
parent | 81826ce75f7d2c507a997a041bd14d23c91fd73b (diff) |
Add performance test for OomAdjuster
Bug: 140254153
Test: atest -c ActivityManagerPerfTests:OomAdjPerfTest#testOomAdj
Change-Id: Id12667c71300e6fe4dc063c83807834bbdb5e62a
Diffstat (limited to 'apct-tests/perftests/utils')
-rw-r--r-- | apct-tests/perftests/utils/src/android/perftests/utils/ManualBenchmarkState.java | 24 | ||||
-rw-r--r-- | apct-tests/perftests/utils/src/android/perftests/utils/TraceMarkParser.java | 46 |
2 files changed, 63 insertions, 7 deletions
diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/ManualBenchmarkState.java b/apct-tests/perftests/utils/src/android/perftests/utils/ManualBenchmarkState.java index b07523976bfe..fe2b1f6443b3 100644 --- a/apct-tests/perftests/utils/src/android/perftests/utils/ManualBenchmarkState.java +++ b/apct-tests/perftests/utils/src/android/perftests/utils/ManualBenchmarkState.java @@ -23,11 +23,15 @@ import android.os.Bundle; import android.util.ArrayMap; import android.util.Log; +import com.android.internal.util.ArrayUtils; + import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.concurrent.TimeUnit; /** @@ -140,6 +144,8 @@ public final class ManualBenchmarkState { /** @see #addExtraResult(String, long) */ private ArrayMap<String, ArrayList<Long>> mExtraResults; + private final List<Long> mTmpDurations = Arrays.asList(0L); + // Statistics. These values will be filled when the benchmark has finished. // The computation needs double precision, but long int is fine for final reporting. private Stats mStats; @@ -188,14 +194,25 @@ public final class ManualBenchmarkState { if (duration < 0) { throw new RuntimeException("duration is negative: " + duration); } + mTmpDurations.set(0, duration); + return keepRunning(mTmpDurations); + } + + /** + * Similar to the {@link #keepRunning(long)} but accepts a list of durations + */ + public boolean keepRunning(List<Long> durations) { switch (mState) { case NOT_STARTED: mState = WARMUP; mWarmupStartTime = System.nanoTime(); return true; case WARMUP: { + if (ArrayUtils.isEmpty(durations)) { + return true; + } final long timeSinceStartingWarmup = System.nanoTime() - mWarmupStartTime; - ++mWarmupIterations; + mWarmupIterations += durations.size(); if (mWarmupIterations >= WARMUP_MIN_ITERATIONS && timeSinceStartingWarmup >= mWarmupDurationNs) { beginBenchmark(timeSinceStartingWarmup, mWarmupIterations); @@ -203,7 +220,10 @@ public final class ManualBenchmarkState { return true; } case RUNNING: { - mResults.add(duration); + if (ArrayUtils.isEmpty(durations)) { + return true; + } + mResults.addAll(durations); final boolean keepRunning = mResults.size() < mMaxIterations; if (!keepRunning) { mStats = new Stats(mResults); diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/TraceMarkParser.java b/apct-tests/perftests/utils/src/android/perftests/utils/TraceMarkParser.java index 1afed3a0be5b..b15b6f61ae5d 100644 --- a/apct-tests/perftests/utils/src/android/perftests/utils/TraceMarkParser.java +++ b/apct-tests/perftests/utils/src/android/perftests/utils/TraceMarkParser.java @@ -40,6 +40,8 @@ public class TraceMarkParser { private final Predicate<TraceMarkLine> mTraceLineFilter; + private static final long MICROS_PER_SECOND = 1000L * 1000L; + public TraceMarkParser(Predicate<TraceMarkLine> traceLineFilter) { mTraceLineFilter = traceLineFilter; } @@ -116,13 +118,19 @@ public class TraceMarkParser { } } + public void reset() { + mSlicesMap.clear(); + mDepthMap.clear(); + mPendingStarts.clear(); + } + @Override public String toString() { final StringBuilder sb = new StringBuilder(); forAllSlices((key, slices) -> { double totalMs = 0; for (TraceMarkSlice s : slices) { - totalMs += s.getDurarionInSeconds() * 1000; + totalMs += s.getDurationInSeconds() * 1000; } sb.append(key).append(" count=").append(slices.size()).append(" avg=") .append(totalMs / slices.size()).append("ms\n"); @@ -134,6 +142,10 @@ public class TraceMarkParser { return sb.toString(); } + static double microsecondToSeconds(long ms) { + return (ms * 1.0d) / MICROS_PER_SECOND; + } + public static class TraceMarkSlice { public final TraceMarkLine begin; public final TraceMarkLine end; @@ -143,7 +155,11 @@ public class TraceMarkParser { this.end = end; } - public double getDurarionInSeconds() { + public double getDurationInSeconds() { + return microsecondToSeconds(end.timestamp - begin.timestamp); + } + + public long getDurationInMicroseconds() { return end.timestamp - begin.timestamp; } } @@ -164,7 +180,7 @@ public class TraceMarkParser { static final char SYNC_END = 'E'; public final String taskPid; - public final double timestamp; + public final long timestamp; // in microseconds public final String name; public final boolean isAsync; public final boolean isBegin; @@ -179,7 +195,7 @@ public class TraceMarkParser { if (timeBegin < 0) { throw new IllegalArgumentException("Timestamp start not found"); } - timestamp = Double.parseDouble(rawLine.substring(timeBegin, timeEnd)); + timestamp = parseMicroseconds(rawLine.substring(timeBegin, timeEnd)); isAsync = type == ASYNC_START || type == ASYNC_FINISH; isBegin = type == ASYNC_START || type == SYNC_BEGIN; @@ -223,9 +239,29 @@ public class TraceMarkParser { return null; } + /** + * Parse the timestamp from atrace output, the format will be like: + * 84962.920719 where the decimal part will be always exactly 6 digits. + * ^^^^^ ^^^^^^ + * | | + * sec microsec + */ + static long parseMicroseconds(String line) { + int end = line.length(); + long t = 0; + for (int i = 0; i < end; i++) { + char c = line.charAt(i); + if (c >= '0' && c <= '9') { + t = t * 10 + (c - '0'); + } + } + return t; + } + @Override public String toString() { - return "TraceMarkLine{pid=" + taskPid + " time=" + timestamp + " name=" + name + return "TraceMarkLine{pid=" + taskPid + " time=" + + microsecondToSeconds(timestamp) + " name=" + name + " async=" + isAsync + " begin=" + isBegin + "}"; } } |