165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/* 265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Copyright (C) 2011 The Android Open Source Project 365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * 465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Licensed under the Apache License, Version 2.0 (the "License"); 565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * you may not use this file except in compliance with the License. 665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * You may obtain a copy of the License at 765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * 865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * http://www.apache.org/licenses/LICENSE-2.0 965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * 1065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Unless required by applicable law or agreed to in writing, software 1165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * distributed under the License is distributed on an "AS IS" BASIS, 1265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * See the License for the specific language governing permissions and 1465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * limitations under the License. 1565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */ 1665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 1765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennpackage android.filterfw.core; 1865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 1965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport android.os.SystemClock; 2065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport android.util.Log; 2165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport java.util.HashMap; 2265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 2365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/** 2465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * @hide 2565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */ 2665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennclass StopWatch { 2765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 2865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private int STOP_WATCH_LOGGING_PERIOD = 200; 2965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private String TAG = "MFF"; 3065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 3165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private String mName; 3265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private long mStartTime; 3365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private long mTotalTime; 3465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private int mNumCalls; 3565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 3665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public StopWatch(String name) { 3765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mName = name; 3865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mStartTime = -1; 3965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mTotalTime = 0; 4065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mNumCalls = 0; 4165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 4265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 4365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public void start() { 4465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (mStartTime != -1) { 4565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn throw new RuntimeException( 4665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn "Calling start with StopWatch already running"); 4765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 4865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mStartTime = SystemClock.elapsedRealtime(); 4965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 5065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 5165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public void stop() { 5265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (mStartTime == -1) { 5365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn throw new RuntimeException( 5465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn "Calling stop with StopWatch already stopped"); 5565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 5665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn long stopTime = SystemClock.elapsedRealtime(); 5765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mTotalTime += stopTime - mStartTime; 5865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn ++mNumCalls; 5965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mStartTime = -1; 6065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (mNumCalls % STOP_WATCH_LOGGING_PERIOD == 0) { 6165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn Log.i(TAG, "AVG ms/call " + mName + ": " + 6265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn String.format("%.1f", mTotalTime * 1.0f / mNumCalls)); 6365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mTotalTime = 0; 6465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mNumCalls = 0; 6565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 6665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 6765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 6865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} 6965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 7065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennpublic class StopWatchMap { 7165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 7265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public boolean LOG_MFF_RUNNING_TIMES = false; 7365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 7465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private HashMap<String, StopWatch> mStopWatches = null; 7565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 7665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public StopWatchMap() { 7765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mStopWatches = new HashMap<String, StopWatch>(); 7865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 7965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 8065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public void start(String stopWatchName) { 8165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (!LOG_MFF_RUNNING_TIMES) { 8265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return; 8365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 8465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (!mStopWatches.containsKey(stopWatchName)) { 8565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mStopWatches.put(stopWatchName, new StopWatch(stopWatchName)); 8665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 8765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mStopWatches.get(stopWatchName).start(); 8865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 8965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 9065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public void stop(String stopWatchName) { 9165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (!LOG_MFF_RUNNING_TIMES) { 9265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return; 9365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 9465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (!mStopWatches.containsKey(stopWatchName)) { 9565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn throw new RuntimeException( 9665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn "Calling stop with unknown stopWatchName: " + stopWatchName); 9765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 9865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mStopWatches.get(stopWatchName).stop(); 9965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 10065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 10165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} 102