blob: a4f8abb820b2ce4b4b9c520f93677120ac98f208 [file] [log] [blame]
/*
* 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;
}
}