/* * 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> callsList = getOpenSessionCallsList(calls).stream().sorted( Comparator.comparing( (Pair pair) -> pair.second).reversed()) .limit(20) .collect(Collectors.toList()); final FastPrintWriter pw = new FastPrintWriter(dummy); pw.println("Top openSession callers (uid=count):"); for (Pair uidCalls : callsList) { pw.print(uidCalls.first); pw.print("="); pw.println(uidCalls.second); } pw.println(); pw.flush(); } } private static List> getOpenSessionCallsList( SparseIntArray openSessionCalls) { ArrayList> list = new ArrayList<>(openSessionCalls.size()); for (int i=0; i(uid, openSessionCalls.get(uid))); } return list; } }