1243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang/* 2243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang * Copyright (C) 2013 The Android Open Source Project 3243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang * 4243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang * Licensed under the Apache License, Version 2.0 (the "License"); 5243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang * you may not use this file except in compliance with the License. 6243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang * You may obtain a copy of the License at 7243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang * 8243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang * http://www.apache.org/licenses/LICENSE-2.0 9243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang * 10243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang * Unless required by applicable law or agreed to in writing, software 11243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang * distributed under the License is distributed on an "AS IS" BASIS, 12243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang * See the License for the specific language governing permissions and 14243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang * limitations under the License. 15243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang */ 1630e2c24b056542f3b1b438aeb798305d1226d0c8Andy Huangpackage com.android.mail.perf; 176f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 186f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereiraimport android.os.SystemClock; 19243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huangimport android.text.TextUtils; 206f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 2130e2c24b056542f3b1b438aeb798305d1226d0c8Andy Huangimport com.android.mail.utils.LogUtils; 226f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 236f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira/** 24243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang * A simple perf timer class that supports lap-time-style measurements. Once a 25243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang * timer is started, any number of laps can be marked, but they are all relative 26243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang * to the original start time. 276f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira */ 286f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereirapublic class SimpleTimer { 296f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 30243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang private static final String DEFAULT_LOG_TAG = "SimpleTimer"; 31243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang 32243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang private static final boolean ENABLE_SIMPLE_TIMER = false; 336f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 346f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira private final boolean mEnabled; 356f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira private long mStartTime; 36243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang private long mLastMarkTime; 376f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira private String mSessionName; 386f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 396f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira public SimpleTimer() { 406f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira this(false); 416f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 426f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 436f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira public SimpleTimer(boolean enabled) { 446f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira mEnabled = enabled; 456f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 466f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 47243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang public final boolean isEnabled() { 48243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang return ENABLE_SIMPLE_TIMER && LogUtils.isLoggable(getTag(), LogUtils.DEBUG) 496f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira && mEnabled; 506f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 516f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 52243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang public SimpleTimer withSessionName(String sessionName) { 53243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang mSessionName = sessionName; 54243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang return this; 556f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 566f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 57243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang public void start() { 58243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang mStartTime = mLastMarkTime = SystemClock.uptimeMillis(); 59243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang LogUtils.d(getTag(), "timer START"); 606f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 616f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 626f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira public void mark(String msg) { 636f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira if (isEnabled()) { 64243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang long now = SystemClock.uptimeMillis(); 65243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang LogUtils.d(getTag(), "[%s] %sms elapsed (%sms since last mark)", msg, now - mStartTime, 66243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang now - mLastMarkTime); 67243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang mLastMarkTime = now; 686f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 696f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira } 706f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira 71243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang private String getTag() { 72243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang return TextUtils.isEmpty(mSessionName) ? DEFAULT_LOG_TAG : mSessionName; 73243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang } 74243c23618b066bcdcd0ab9e36d8c01f50db2cbd0Andy Huang 756f92de64bbdf1ea6c4cd9774fc96921a10c266d7Mindy Pereira} 76