summaryrefslogtreecommitdiff
path: root/apct-tests/perftests/utils
diff options
context:
space:
mode:
authorJing Ji <jji@google.com>2019-10-17 15:36:57 -0700
committerJing Ji <jji@google.com>2019-12-13 14:51:41 -0800
commit84121313620345199b56816c579df31d68567581 (patch)
tree4bd8e5d711cabbc48f7bfdfd8db5771ff66d5e92 /apct-tests/perftests/utils
parent81826ce75f7d2c507a997a041bd14d23c91fd73b (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.java24
-rw-r--r--apct-tests/perftests/utils/src/android/perftests/utils/TraceMarkParser.java46
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 + "}";
}
}