18233facddcc51865d612a919d450db6954aa48e3Michael Kolb/* 28233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Copyright (C) 2010 The Android Open Source Project 38233facddcc51865d612a919d450db6954aa48e3Michael Kolb * 48233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Licensed under the Apache License, Version 2.0 (the "License"); 58233facddcc51865d612a919d450db6954aa48e3Michael Kolb * you may not use this file except in compliance with the License. 68233facddcc51865d612a919d450db6954aa48e3Michael Kolb * You may obtain a copy of the License at 78233facddcc51865d612a919d450db6954aa48e3Michael Kolb * 88233facddcc51865d612a919d450db6954aa48e3Michael Kolb * http://www.apache.org/licenses/LICENSE-2.0 98233facddcc51865d612a919d450db6954aa48e3Michael Kolb * 108233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Unless required by applicable law or agreed to in writing, software 118233facddcc51865d612a919d450db6954aa48e3Michael Kolb * distributed under the License is distributed on an "AS IS" BASIS, 128233facddcc51865d612a919d450db6954aa48e3Michael Kolb * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138233facddcc51865d612a919d450db6954aa48e3Michael Kolb * See the License for the specific language governing permissions and 148233facddcc51865d612a919d450db6954aa48e3Michael Kolb * limitations under the License. 158233facddcc51865d612a919d450db6954aa48e3Michael Kolb */ 168233facddcc51865d612a919d450db6954aa48e3Michael Kolb 178233facddcc51865d612a919d450db6954aa48e3Michael Kolbpackage com.android.browser; 188233facddcc51865d612a919d450db6954aa48e3Michael Kolb 198233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.net.WebAddress; 208233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.os.Debug; 218233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.os.Process; 228233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.os.SystemClock; 238233facddcc51865d612a919d450db6954aa48e3Michael Kolbimport android.util.Log; 248233facddcc51865d612a919d450db6954aa48e3Michael Kolb 258233facddcc51865d612a919d450db6954aa48e3Michael Kolb/** 268233facddcc51865d612a919d450db6954aa48e3Michael Kolb * Performance analysis 278233facddcc51865d612a919d450db6954aa48e3Michael Kolb */ 288233facddcc51865d612a919d450db6954aa48e3Michael Kolbpublic class Performance { 298233facddcc51865d612a919d450db6954aa48e3Michael Kolb 308233facddcc51865d612a919d450db6954aa48e3Michael Kolb private static final String LOGTAG = "browser"; 318233facddcc51865d612a919d450db6954aa48e3Michael Kolb 328233facddcc51865d612a919d450db6954aa48e3Michael Kolb private final static boolean LOGD_ENABLED = 338233facddcc51865d612a919d450db6954aa48e3Michael Kolb com.android.browser.Browser.LOGD_ENABLED; 348233facddcc51865d612a919d450db6954aa48e3Michael Kolb 358233facddcc51865d612a919d450db6954aa48e3Michael Kolb private static boolean mInTrace; 368233facddcc51865d612a919d450db6954aa48e3Michael Kolb 378233facddcc51865d612a919d450db6954aa48e3Michael Kolb // Performance probe 388233facddcc51865d612a919d450db6954aa48e3Michael Kolb private static final int[] SYSTEM_CPU_FORMAT = new int[] { 398233facddcc51865d612a919d450db6954aa48e3Michael Kolb Process.PROC_SPACE_TERM | Process.PROC_COMBINE, 408233facddcc51865d612a919d450db6954aa48e3Michael Kolb Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 1: user time 418233facddcc51865d612a919d450db6954aa48e3Michael Kolb Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 2: nice time 428233facddcc51865d612a919d450db6954aa48e3Michael Kolb Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 3: sys time 438233facddcc51865d612a919d450db6954aa48e3Michael Kolb Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 4: idle time 448233facddcc51865d612a919d450db6954aa48e3Michael Kolb Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 5: iowait time 458233facddcc51865d612a919d450db6954aa48e3Michael Kolb Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG, // 6: irq time 468233facddcc51865d612a919d450db6954aa48e3Michael Kolb Process.PROC_SPACE_TERM | Process.PROC_OUT_LONG // 7: softirq time 478233facddcc51865d612a919d450db6954aa48e3Michael Kolb }; 488233facddcc51865d612a919d450db6954aa48e3Michael Kolb 498233facddcc51865d612a919d450db6954aa48e3Michael Kolb private static long mStart; 508233facddcc51865d612a919d450db6954aa48e3Michael Kolb private static long mProcessStart; 518233facddcc51865d612a919d450db6954aa48e3Michael Kolb private static long mUserStart; 528233facddcc51865d612a919d450db6954aa48e3Michael Kolb private static long mSystemStart; 538233facddcc51865d612a919d450db6954aa48e3Michael Kolb private static long mIdleStart; 548233facddcc51865d612a919d450db6954aa48e3Michael Kolb private static long mIrqStart; 558233facddcc51865d612a919d450db6954aa48e3Michael Kolb 568233facddcc51865d612a919d450db6954aa48e3Michael Kolb private static long mUiStart; 578233facddcc51865d612a919d450db6954aa48e3Michael Kolb 588233facddcc51865d612a919d450db6954aa48e3Michael Kolb static void tracePageStart(String url) { 598233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (BrowserSettings.getInstance().isTracing()) { 608233facddcc51865d612a919d450db6954aa48e3Michael Kolb String host; 618233facddcc51865d612a919d450db6954aa48e3Michael Kolb try { 628233facddcc51865d612a919d450db6954aa48e3Michael Kolb WebAddress uri = new WebAddress(url); 638233facddcc51865d612a919d450db6954aa48e3Michael Kolb host = uri.getHost(); 648233facddcc51865d612a919d450db6954aa48e3Michael Kolb } catch (android.net.ParseException ex) { 658233facddcc51865d612a919d450db6954aa48e3Michael Kolb host = "browser"; 668233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 678233facddcc51865d612a919d450db6954aa48e3Michael Kolb host = host.replace('.', '_'); 688233facddcc51865d612a919d450db6954aa48e3Michael Kolb host += ".trace"; 698233facddcc51865d612a919d450db6954aa48e3Michael Kolb mInTrace = true; 708233facddcc51865d612a919d450db6954aa48e3Michael Kolb Debug.startMethodTracing(host, 20 * 1024 * 1024); 718233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 728233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 738233facddcc51865d612a919d450db6954aa48e3Michael Kolb 748233facddcc51865d612a919d450db6954aa48e3Michael Kolb static void tracePageFinished() { 758233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (mInTrace) { 768233facddcc51865d612a919d450db6954aa48e3Michael Kolb mInTrace = false; 778233facddcc51865d612a919d450db6954aa48e3Michael Kolb Debug.stopMethodTracing(); 788233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 798233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 808233facddcc51865d612a919d450db6954aa48e3Michael Kolb 818233facddcc51865d612a919d450db6954aa48e3Michael Kolb static void onPageStarted() { 828233facddcc51865d612a919d450db6954aa48e3Michael Kolb mStart = SystemClock.uptimeMillis(); 838233facddcc51865d612a919d450db6954aa48e3Michael Kolb mProcessStart = Process.getElapsedCpuTime(); 848233facddcc51865d612a919d450db6954aa48e3Michael Kolb long[] sysCpu = new long[7]; 858233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, null, sysCpu, null)) { 868233facddcc51865d612a919d450db6954aa48e3Michael Kolb mUserStart = sysCpu[0] + sysCpu[1]; 878233facddcc51865d612a919d450db6954aa48e3Michael Kolb mSystemStart = sysCpu[2]; 888233facddcc51865d612a919d450db6954aa48e3Michael Kolb mIdleStart = sysCpu[3]; 898233facddcc51865d612a919d450db6954aa48e3Michael Kolb mIrqStart = sysCpu[4] + sysCpu[5] + sysCpu[6]; 908233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 918233facddcc51865d612a919d450db6954aa48e3Michael Kolb mUiStart = SystemClock.currentThreadTimeMillis(); 928233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 938233facddcc51865d612a919d450db6954aa48e3Michael Kolb 948233facddcc51865d612a919d450db6954aa48e3Michael Kolb static void onPageFinished(String url) { 958233facddcc51865d612a919d450db6954aa48e3Michael Kolb long[] sysCpu = new long[7]; 968233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT, null, sysCpu, null)) { 978233facddcc51865d612a919d450db6954aa48e3Michael Kolb String uiInfo = 988233facddcc51865d612a919d450db6954aa48e3Michael Kolb "UI thread used " + (SystemClock.currentThreadTimeMillis() - mUiStart) + " ms"; 998233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (LOGD_ENABLED) { 1008233facddcc51865d612a919d450db6954aa48e3Michael Kolb Log.d(LOGTAG, uiInfo); 1018233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1028233facddcc51865d612a919d450db6954aa48e3Michael Kolb // The string that gets written to the log 1038233facddcc51865d612a919d450db6954aa48e3Michael Kolb String performanceString = 1048233facddcc51865d612a919d450db6954aa48e3Michael Kolb "It took total " + (SystemClock.uptimeMillis() - mStart) 1058233facddcc51865d612a919d450db6954aa48e3Michael Kolb + " ms clock time to load the page." + "\nbrowser process used " 1068233facddcc51865d612a919d450db6954aa48e3Michael Kolb + (Process.getElapsedCpuTime() - mProcessStart) 1078233facddcc51865d612a919d450db6954aa48e3Michael Kolb + " ms, user processes used " + (sysCpu[0] + sysCpu[1] - mUserStart) 1088233facddcc51865d612a919d450db6954aa48e3Michael Kolb * 10 + " ms, kernel used " + (sysCpu[2] - mSystemStart) * 10 1098233facddcc51865d612a919d450db6954aa48e3Michael Kolb + " ms, idle took " + (sysCpu[3] - mIdleStart) * 10 1108233facddcc51865d612a919d450db6954aa48e3Michael Kolb + " ms and irq took " + (sysCpu[4] + sysCpu[5] + sysCpu[6] - mIrqStart) 1118233facddcc51865d612a919d450db6954aa48e3Michael Kolb * 10 + " ms, " + uiInfo; 1128233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (LOGD_ENABLED) { 1138233facddcc51865d612a919d450db6954aa48e3Michael Kolb Log.d(LOGTAG, performanceString + "\nWebpage: " + url); 1148233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1158233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (url != null) { 1168233facddcc51865d612a919d450db6954aa48e3Michael Kolb // strip the url to maintain consistency 1178233facddcc51865d612a919d450db6954aa48e3Michael Kolb String newUrl = new String(url); 1188233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (newUrl.startsWith("http://www.")) { 1198233facddcc51865d612a919d450db6954aa48e3Michael Kolb newUrl = newUrl.substring(11); 1208233facddcc51865d612a919d450db6954aa48e3Michael Kolb } else if (newUrl.startsWith("http://")) { 1218233facddcc51865d612a919d450db6954aa48e3Michael Kolb newUrl = newUrl.substring(7); 1228233facddcc51865d612a919d450db6954aa48e3Michael Kolb } else if (newUrl.startsWith("https://www.")) { 1238233facddcc51865d612a919d450db6954aa48e3Michael Kolb newUrl = newUrl.substring(12); 1248233facddcc51865d612a919d450db6954aa48e3Michael Kolb } else if (newUrl.startsWith("https://")) { 1258233facddcc51865d612a919d450db6954aa48e3Michael Kolb newUrl = newUrl.substring(8); 1268233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1278233facddcc51865d612a919d450db6954aa48e3Michael Kolb if (LOGD_ENABLED) { 1288233facddcc51865d612a919d450db6954aa48e3Michael Kolb Log.d(LOGTAG, newUrl + " loaded"); 1298233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1308233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1318233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1328233facddcc51865d612a919d450db6954aa48e3Michael Kolb } 1338233facddcc51865d612a919d450db6954aa48e3Michael Kolb} 134