--- /dev/null
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.util;
+
+import com.android.internal.util.FastPrintWriter;
+
+import com.google.caliper.AfterExperiment;
+import com.google.caliper.BeforeExperiment;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Random;
+import java.util.stream.Collectors;
+
+public class StreamsBenchmark {
+ private OutputStream dummy = new OutputStream() {
+ @Override
+ public void write(int b) throws IOException {
+ }
+
+ @Override
+ public void write(byte b[], int off, int len) throws IOException {
+ }
+ };
+
+ private SparseIntArray calls;
+
+ @BeforeExperiment
+ protected void setUp() {
+ calls = new SparseIntArray();
+ final Random r = new Random(1);
+ for (int i = 0; i < 100; i++) {
+ calls.put(i, r.nextInt(Integer.MAX_VALUE));
+ }
+ }
+
+ @AfterExperiment
+ protected void tearDown() {
+ calls = null;
+ }
+
+ public void timeDirect(int reps) {
+ for (int i = 0; i < reps; i++) {
+ final int N = calls.size();
+ final long[] values = new long[N];
+ for (int j = 0; j < N; j++) {
+ values[j] = ((long) calls.valueAt(j) << 32) | calls.keyAt(j);
+ }
+ Arrays.sort(values);
+
+ final FastPrintWriter pw = new FastPrintWriter(dummy);
+ pw.println("Top openSession callers (uid=count):");
+ final int end = Math.max(0, N - 20);
+ for (int j = N - 1; j >= end; j--) {
+ final int uid = (int) (values[j] & 0xffffffff);
+ final int count = (int) (values[j] >> 32);
+ pw.print(uid);
+ pw.print("=");
+ pw.println(count);
+ }
+ pw.println();
+ pw.flush();
+ }
+ }
+
+ public void timeStreams(int reps) {
+ for (int i = 0; i < reps; i++) {
+ List<Pair<Integer, Integer>> callsList =
+ getOpenSessionCallsList(calls).stream().sorted(
+ Comparator.comparing(
+ (Pair<Integer, Integer> pair) -> pair.second).reversed())
+ .limit(20)
+ .collect(Collectors.toList());
+
+ final FastPrintWriter pw = new FastPrintWriter(dummy);
+ pw.println("Top openSession callers (uid=count):");
+ for (Pair<Integer, Integer> uidCalls : callsList) {
+ pw.print(uidCalls.first);
+ pw.print("=");
+ pw.println(uidCalls.second);
+ }
+ pw.println();
+ pw.flush();
+ }
+ }
+
+ private static List<Pair<Integer, Integer>> getOpenSessionCallsList(
+ SparseIntArray openSessionCalls) {
+ ArrayList<Pair<Integer, Integer>> list = new ArrayList<>(openSessionCalls.size());
+ for (int i=0; i<openSessionCalls.size(); i++) {
+ final int uid = openSessionCalls.keyAt(i);
+ list.add(new Pair<>(uid, openSessionCalls.get(uid)));
+ }
+
+ return list;
+ }
+}