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; 2076a6cec97f48435863b6ab360e11f5da26d7956bPaul Duffinimport com.google.caliper.AfterExperiment; 2176a6cec97f48435863b6ab360e11f5da26d7956bPaul Duffinimport com.google.caliper.BeforeExperiment; 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 2876a6cec97f48435863b6ab360e11f5da26d7956bPaul Duffinpublic class IndentingPrintWriterBenchmark { 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 3676a6cec97f48435863b6ab360e11f5da26d7956bPaul Duffin @BeforeExperiment 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 5276a6cec97f48435863b6ab360e11f5da26d7956bPaul Duffin @AfterExperiment 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