• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.browser;
18 
19 import android.net.WebAddress;
20 import android.os.Debug;
21 import android.os.Process;
22 import android.os.SystemClock;
23 import android.util.Log;
24 
25 /**
26  * Performance analysis
27  */
28 public class Performance {
29 
30     private static final String LOGTAG = "browser";
31 
32     private final static boolean LOGD_ENABLED =
33             com.android.browser.Browser.LOGD_ENABLED;
34 
35     private static boolean mInTrace;
36 
37     // Performance probe
38     private static final int[] SYSTEM_CPU_FORMAT = new int[] {
39             Process.PROC_SPACE_TERM | Process.PROC_COMBINE,
40             Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 1: user time
41             Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 2: nice time
42             Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 3: sys time
43             Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 4: idle time
44             Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 5: iowait time
45             Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 6: irq time
46             Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG  // 7: softirq time
47     };
48 
49     private static long mStart;
50     private static long mProcessStart;
51     private static long mUserStart;
52     private static long mSystemStart;
53     private static long mIdleStart;
54     private static long mIrqStart;
55 
56     private static long mUiStart;
57 
tracePageStart(String url)58     static void tracePageStart(String url) {
59         if (BrowserSettings.getInstance().isTracing()) {
60             String host;
61             try {
62                 WebAddress uri = new WebAddress(url);
63                 host = uri.getHost();
64             } catch (android.net.ParseException ex) {
65                 host = "browser";
66             }
67             host = host.replace('.', '_');
68             host += ".trace";
69             mInTrace = true;
70             Debug.startMethodTracing(host, 20 * 1024 * 1024);
71         }
72     }
73 
tracePageFinished()74     static void tracePageFinished() {
75         if (mInTrace) {
76             mInTrace = false;
77             Debug.stopMethodTracing();
78         }
79     }
80 
onPageStarted()81     static void onPageStarted() {
82         mStart = SystemClock.uptimeMillis();
83         mProcessStart = Process.getElapsedCpuTime();
84         long[] sysCpu = new long[7];
85         if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, null, sysCpu, null)) {
86             mUserStart = sysCpu[0] + sysCpu[1];
87             mSystemStart = sysCpu[2];
88             mIdleStart = sysCpu[3];
89             mIrqStart = sysCpu[4] + sysCpu[5] + sysCpu[6];
90         }
91         mUiStart = SystemClock.currentThreadTimeMillis();
92     }
93 
onPageFinished(String url)94     static void onPageFinished(String url) {
95         long[] sysCpu = new long[7];
96         if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, null, sysCpu, null)) {
97             String uiInfo =
98                     "UI thread used " + (SystemClock.currentThreadTimeMillis() - mUiStart) + " ms";
99             if (LOGD_ENABLED) {
100                 Log.d(LOGTAG, uiInfo);
101             }
102             // The string that gets written to the log
103             String performanceString =
104                     "It took total " + (SystemClock.uptimeMillis() - mStart)
105                             + " ms clock time to load the page." + "\nbrowser process used "
106                             + (Process.getElapsedCpuTime() - mProcessStart)
107                             + " ms, user processes used " + (sysCpu[0] + sysCpu[1] - mUserStart)
108                             * 10 + " ms, kernel used " + (sysCpu[2] - mSystemStart) * 10
109                             + " ms, idle took " + (sysCpu[3] - mIdleStart) * 10
110                             + " ms and irq took " + (sysCpu[4] + sysCpu[5] + sysCpu[6] - mIrqStart)
111                             * 10 + " ms, " + uiInfo;
112             if (LOGD_ENABLED) {
113                 Log.d(LOGTAG, performanceString + "\nWebpage: " + url);
114             }
115             if (url != null) {
116                 // strip the url to maintain consistency
117                 String newUrl = new String(url);
118                 if (newUrl.startsWith("http://www.")) {
119                     newUrl = newUrl.substring(11);
120                 } else if (newUrl.startsWith("http://")) {
121                     newUrl = newUrl.substring(7);
122                 } else if (newUrl.startsWith("https://www.")) {
123                     newUrl = newUrl.substring(12);
124                 } else if (newUrl.startsWith("https://")) {
125                     newUrl = newUrl.substring(8);
126                 }
127                 if (LOGD_ENABLED) {
128                     Log.d(LOGTAG, newUrl + " loaded");
129                 }
130             }
131         }
132     }
133 }
134