1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*
2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Copyright (C) 2008 The Android Open Source Project
3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * you may not use this file except in compliance with the License.
6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * You may obtain a copy of the License at
7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Unless required by applicable law or agreed to in writing, software
11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * See the License for the specific language governing permissions and
14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * limitations under the License.
15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */
16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.IOException;
18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.FileInputStream;
19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.ObjectInputStream;
20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.BufferedInputStream;
21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.Writer;
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.io.PrintStream;
23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.Set;
24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.HashSet;
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.TreeSet;
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.Iterator;
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/**
29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Prints raw information in CSV format.
30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */
31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic class PrintCsv {
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public static void main(String[] args)
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            throws IOException, ClassNotFoundException {
35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (args.length != 1) {
36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            System.err.println("Usage: PrintCsv [compiled log file]");
37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            System.exit(0);
38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Root root = Root.fromFile(args[0]);
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        printHeaders(System.out);
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        MemoryUsage baseline = MemoryUsage.baseline();
45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (LoadedClass loadedClass : root.loadedClasses.values()) {
47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            if (!loadedClass.systemClass) {
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                continue;
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            printRow(System.out, baseline, loadedClass);
52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    static void printHeaders(PrintStream out) {
56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out.println("Name"
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                + ",Preloaded"
58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                + ",Median Load Time (us)"
59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                + ",Median Init Time (us)"
60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                + ",Process Names"
61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                + ",Load Count"
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                + ",Init Count"
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                + ",Managed Heap (B)"
64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                + ",Native Heap (B)"
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                + ",Managed Pages (kB)"
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                + ",Native Pages (kB)"
67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                + ",Other Pages (kB)");
68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    static void printRow(PrintStream out, MemoryUsage baseline,
71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            LoadedClass loadedClass) {
72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out.print(loadedClass.name);
73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out.print(',');
74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out.print(loadedClass.preloaded);
75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out.print(',');
76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out.print(loadedClass.medianLoadTimeMicros());
77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out.print(',');
78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out.print(loadedClass.medianInitTimeMicros());
79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out.print(',');
80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out.print('"');
81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        Set<String> procNames = new TreeSet<String>();
83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (Operation op : loadedClass.loads)
84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            procNames.add(op.process.name);
85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        for (Operation op : loadedClass.initializations)
86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            procNames.add(op.process.name);
87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (procNames.size() <= 3) {
89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            for (String name : procNames) {
90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                out.print(name + "\n");
91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            }
92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            Iterator<String> i = procNames.iterator();
94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out.print(i.next() + "\n");
95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out.print(i.next() + "\n");
96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out.print("...and " + (procNames.size() - 2)
97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    + " others.");
98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out.print('"');
101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out.print(',');
102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out.print(loadedClass.loads.size());
103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out.print(',');
104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out.print(loadedClass.initializations.size());
105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (loadedClass.memoryUsage.isAvailable()) {
107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            MemoryUsage subtracted
108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                    = loadedClass.memoryUsage.subtract(baseline);
109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out.print(',');
111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out.print(subtracted.javaHeapSize());
112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out.print(',');
113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out.print(subtracted.nativeHeapSize);
114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out.print(',');
115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out.print(subtracted.javaPagesInK());
116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out.print(',');
117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out.print(subtracted.nativePagesInK());
118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out.print(',');
119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out.print(subtracted.otherPagesInK());
120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        } else {
122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            out.print(",n/a,n/a,n/a,n/a,n/a");
123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        out.println();
126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}
128