18fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey/*
28fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey * Copyright (C) 2013 The Android Open Source Project
38fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey *
48fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
58fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey * you may not use this file except in compliance with the License.
68fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey * You may obtain a copy of the License at
78fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey *
88fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
98fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey *
108fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey * Unless required by applicable law or agreed to in writing, software
118fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
128fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey * See the License for the specific language governing permissions and
148fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey * limitations under the License.
158fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey */
168fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
178fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkeypackage com.android.internal.util;
188fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
198fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkeyimport com.google.android.collect.Lists;
208fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkeyimport com.google.caliper.SimpleBenchmark;
218fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
228fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkeyimport java.io.File;
238fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkeyimport java.io.FileOutputStream;
248fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkeyimport java.io.IOException;
258fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkeyimport java.io.PrintWriter;
268fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkeyimport java.util.ArrayList;
278fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
288fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkeypublic class IndentingPrintWriterBenchmark extends SimpleBenchmark {
298fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
308fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    private PrintWriter mDirect;
318fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    private IndentingPrintWriter mIndenting;
328fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
338fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    private Node mSimple;
348fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    private Node mComplex;
358fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
368fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    @Override
378fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    protected void setUp() throws IOException {
388fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        final FileOutputStream os = new FileOutputStream(new File("/dev/null"));
398fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        mDirect = new PrintWriter(os);
408fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        mIndenting = new IndentingPrintWriter(mDirect, "  ");
418fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
428fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        final Node manyChildren = Node.build("ManyChildren", Node.build("1"), Node.build("2"),
438fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey                Node.build("3"), Node.build("4"), Node.build("5"), Node.build("6"), Node.build("7"),
448fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey                Node.build("8"), Node.build("9"), Node.build("10"));
458fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
468fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        mSimple = Node.build("RED");
478fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        mComplex = Node.build("PARENT", Node.build("RED"), Node.build("GREEN",
488fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey                Node.build("BLUE", manyChildren, manyChildren), manyChildren, manyChildren),
498fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey                manyChildren);
508fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    }
518fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
528fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    @Override
538fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    protected void tearDown() {
548fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        mIndenting.close();
558fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        mIndenting = null;
568fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        mDirect = null;
578fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    }
588fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
598fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    public void timeSimpleDirect(int reps) {
608fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        for (int i = 0; i < reps; i++) {
618fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            mSimple.dumpDirect(mDirect, 0);
628fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        }
638fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    }
648fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
658fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    public void timeSimpleIndenting(int reps) {
668fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        for (int i = 0; i < reps; i++) {
678fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            mSimple.dumpIndenting(mIndenting);
688fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        }
698fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    }
708fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
718fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    public void timeComplexDirect(int reps) {
728fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        for (int i = 0; i < reps; i++) {
738fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            mComplex.dumpDirect(mDirect, 0);
748fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        }
758fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    }
768fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
778fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    public void timeComplexIndenting(int reps) {
788fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        for (int i = 0; i < reps; i++) {
798fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            mComplex.dumpIndenting(mIndenting);
808fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        }
818fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    }
828fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
838fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    public void timePairRaw(int reps) {
848fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        final int value = 1024;
858fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        for (int i = 0; i < reps; i++) {
868fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            mDirect.print("key=");
878fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            mDirect.print(value);
888fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            mDirect.print(" ");
898fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        }
908fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    }
918fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
928fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    public void timePairIndenting(int reps) {
938fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        final int value = 1024;
948fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        for (int i = 0; i < reps; i++) {
958fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            mIndenting.printPair("key", value);
968fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        }
978fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    }
988fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
998fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    private static class Node {
1008fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        public String name;
1018fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        public ArrayList<Node> children;
1028fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
1038fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        private static String[] sIndents = new String[] { "", "  ", "    ", "      ", "        " };
1048fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
1058fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        public static Node build(String name, Node... children) {
1068fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            Node node = new Node();
1078fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            node.name = name;
1088fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            if (children != null && children.length > 0) {
1098fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey                node.children = Lists.newArrayList(children);
1108fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            }
1118fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            return node;
1128fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        }
1138fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
1148fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        private void dumpSelf(PrintWriter pw) {
1158fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            pw.print("Node ");
1168fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            pw.print(name);
1178fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            pw.print(" first ");
1188fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            pw.print(512);
1198fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            pw.print(" second ");
1208fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            pw.print(1024);
1218fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            pw.print(" third ");
1228fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            pw.println(2048);
1238fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        }
1248fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
1258fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        public void dumpDirect(PrintWriter pw, int depth) {
1268fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            pw.print(sIndents[depth]);
1278fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            dumpSelf(pw);
1288fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
1298fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            if (children != null) {
1308fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey                for (Node child : children) {
1318fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey                    child.dumpDirect(pw, depth + 1);
1328fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey                }
1338fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            }
1348fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
1358fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            pw.println();
1368fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        }
1378fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
1388fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        public void dumpIndenting(IndentingPrintWriter pw) {
1398fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            dumpSelf(pw);
1408fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
1418fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            if (children != null) {
1428fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey                pw.increaseIndent();
1438fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey                for (Node child : children) {
1448fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey                    child.dumpIndenting(pw);
1458fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey                }
1468fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey                pw.decreaseIndent();
1478fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            }
1488fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey
1498fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey            pw.println();
1508fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey        }
1518fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey    }
1528fa9bb5210e3c48ad34cbd6db880ea12de4baca9Jeff Sharkey}
153