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