diff --git a/startop/apps/test/src/SystemServerBenchmarkActivity.java b/startop/apps/test/src/SystemServerBenchmarkActivity.java index 59a30a540d999..61d43226c41ea 100644 --- a/startop/apps/test/src/SystemServerBenchmarkActivity.java +++ b/startop/apps/test/src/SystemServerBenchmarkActivity.java @@ -17,8 +17,11 @@ package com.android.startop.test; import android.app.Activity; +import android.content.ComponentName; import android.content.Context; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.os.AsyncTask; import android.os.Bundle; import android.os.Trace; @@ -32,7 +35,8 @@ import android.widget.TextView; import java.util.Arrays; class Benchmark { - public static final int NUM_ITERATIONS = 1000; + // Time limit to run benchmarks in seconds + public static final int TIME_LIMIT = 5; public Benchmark(ViewGroup parent, CharSequence name, Runnable thunk) { Context context = parent.getContext(); @@ -54,28 +58,25 @@ class Benchmark { @Override protected Object doInBackground(Object... _args) { - long[] results = new long[NUM_ITERATIONS]; + long startTime = System.nanoTime(); + int count = 0; // Run benchmark - for (int i = 0; i < results.length; i++) { - results[i] = -System.nanoTime(); + while (true) { + long elapsed = -System.nanoTime(); thunk.run(); - results[i] += System.nanoTime(); + elapsed += System.nanoTime(); + + count++; + double elapsedVariance = (double) elapsed - resultMean; + resultMean += elapsedVariance / count; + resultStdev += elapsedVariance * ((double) elapsed - resultMean); + + if (System.nanoTime() - startTime > TIME_LIMIT * 1e9) { + break; + } } - - // Compute mean - long sum = Arrays.stream(results).sum(); - resultMean = (double) sum / results.length; - - // Compute standard deviation - double variance = 0; - for (long i : results) { - double t = (double) i - resultMean; - variance += t * t; - } - variance /= results.length - 1; - - resultStdev = Math.sqrt(variance); + resultStdev = Math.sqrt(resultStdev / (count - 1)); return null; } @@ -108,5 +109,48 @@ public class SystemServerBenchmarkActivity extends Activity { new Benchmark(benchmarkList, "getInstalledApplications", () -> { pm.getInstalledApplications(PackageManager.MATCH_SYSTEM_ONLY); }); + + new Benchmark(benchmarkList, "getInstalledPackages", () -> { + pm.getInstalledPackages(PackageManager.GET_ACTIVITIES); + }); + + new Benchmark(benchmarkList, "getPackageInfo", () -> { + try { + pm.getPackageInfo("com.android.startop.test", 0); + } catch (NameNotFoundException e) { + throw new RuntimeException(e); + } + }); + + new Benchmark(benchmarkList, "getApplicationInfo", () -> { + try { + pm.getApplicationInfo("com.android.startop.test", 0); + } catch (NameNotFoundException e) { + throw new RuntimeException(e); + } + }); + + try { + ApplicationInfo app = pm.getApplicationInfo("com.android.startop.test", 0); + new Benchmark(benchmarkList, "getResourcesForApplication", () -> { + try { + pm.getResourcesForApplication(app); + } catch (NameNotFoundException e) { + throw new RuntimeException(e); + } + }); + } catch (NameNotFoundException e) { + throw new RuntimeException(e); + } + + ComponentName component = new ComponentName(this, this.getClass()); + new Benchmark(benchmarkList, "getActivityInfo", () -> { + try { + pm.getActivityInfo(component, PackageManager.GET_META_DATA); + } catch (NameNotFoundException e) { + throw new RuntimeException(e); + } + }); + } }