1d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde/* 2d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * Copyright (C) 2015 The Android Open Source Project 3d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * 4d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * Licensed under the Apache License, Version 2.0 (the "License"); 5d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * you may not use this file except in compliance with the License. 6d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * You may obtain a copy of the License at 7d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * 8d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * http://www.apache.org/licenses/LICENSE-2.0 9d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * 10d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * Unless required by applicable law or agreed to in writing, software 11d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * distributed under the License is distributed on an "AS IS" BASIS, 12d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * See the License for the specific language governing permissions and 14d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * limitations under the License. 15d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde */ 16d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 17d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohdepackage com.android.camera.stats.profiler; 18d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 19d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohdeimport com.android.camera.debug.Log; 20d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohdeimport com.android.camera.debug.Log.Tag; 21d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 22d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde/** 23d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * A set of common, easy to use profilers that fill the most 24d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde * common use cases when profiling parts of an app. 25d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde */ 26d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohdepublic class Profilers { 27d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde private static final Tag TAG = new Tag("Profiler"); 28d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 29d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde private static Writer sErrorWriter = new ErrorWriter(); 30d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde private static Writer sWarningWriter = new WarningWriter(); 31d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde private static Writer sInfoWriter = new InfoWriter(); 32d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde private static Writer sDebugWriter = new DebugWriter(); 33d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde private static Writer sVerboseWriter = new VerboseWriter(); 34d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 35d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde private static class Singleton { 36d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde private static final Profilers INSTANCE = new Profilers( 37d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde new LoggingProfiler(sErrorWriter), 38d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde new LoggingProfiler(sWarningWriter), 39d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde new LoggingProfiler(sInfoWriter), 40d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde new LoggingProfiler(sDebugWriter), 41d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde new LoggingProfiler(sVerboseWriter), 42d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde new GuardingProfiler(sInfoWriter, sVerboseWriter)); 43d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 44d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 45d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde /** get a single shared Profilers instance */ 46d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde public static Profilers instance() { 47d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde return Singleton.INSTANCE; 48d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 49d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 50d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde private final LoggingProfiler mErrorProfiler; 51d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde private final LoggingProfiler mWarningProfiler; 52d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde private final LoggingProfiler mInfoProfiler; 53d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde private final LoggingProfiler mDebugProfiler; 54d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde private final LoggingProfiler mVerboseProfiler; 55d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde private final GuardingProfiler mGuardingProfiler; 56d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 57d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde private Profilers(LoggingProfiler errorProfiler, 58d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde LoggingProfiler warningProfiler, 59d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde LoggingProfiler infoProfiler, 60d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde LoggingProfiler debugProfiler, 61d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde LoggingProfiler verboseProfiler, 62d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde GuardingProfiler guardingProfiler) { 63d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde mErrorProfiler = errorProfiler; 64d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde mWarningProfiler = warningProfiler; 65d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde mInfoProfiler = infoProfiler; 66d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde mDebugProfiler = debugProfiler; 67d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde mVerboseProfiler = verboseProfiler; 68d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde mGuardingProfiler = guardingProfiler; 69d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 70d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 71d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde public LoggingProfiler e() { 72d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde return mErrorProfiler; 73d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 74d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 75d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde public Profile e(String name) { 76d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde return e().create(name).start(); 77d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 78d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 79d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde public LoggingProfiler w() { 80d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde return mWarningProfiler; 81d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 82d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 83d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde public Profile w(String name) { 84d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde return w().create(name).start(); 85d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 86d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 87d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde public LoggingProfiler i() { 88d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde return mInfoProfiler; 89d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 90d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 91d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde public Profile i(String name) { 92d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde return i().create(name).start(); 93d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 94d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 95d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde public LoggingProfiler d() { 96d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde return mDebugProfiler; 97d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 98d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 99d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde public Profile d(String name) { 100d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde return d().create(name).start(); 101d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 102d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 103d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde public LoggingProfiler v() { 104d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde return mVerboseProfiler; 105d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 106d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 107d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde public Profile v(String name) { 108d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde return v().create(name).start(); 109d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 110d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 111d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde public GuardingProfiler guard() { 112d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde return mGuardingProfiler; 113d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 114d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 115d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde public Profile guard(String name) { 116d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde return guard().create(name).start(); 117d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 118d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 119d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde public Profile guard(String name, int durationMillis) { 120d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde return guard().create(name, durationMillis).start(); 121d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 122d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 123d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde private static class DebugWriter implements Writer { 124d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde @Override 125d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde public void write(String message) { 126d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde Log.d(TAG, message); 127d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 128d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 129d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 130d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde private static class ErrorWriter implements Writer { 131d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde @Override 132d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde public void write(String message) { 133d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde Log.e(TAG, message); 134d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 135d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 136d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 137d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde private static class InfoWriter implements Writer { 138d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde @Override 139d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde public void write(String message) { 140d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde Log.i(TAG, message); 141d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 142d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 143d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 144d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde private static class VerboseWriter implements Writer { 145d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde @Override 146d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde public void write(String message) { 147d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde Log.v(TAG, message); 148d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 149d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 150d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde 151d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde private static class WarningWriter implements Writer { 152d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde @Override 153d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde public void write(String message) { 154d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde Log.w(TAG, message); 155d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 156d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde } 157d34df829eba68c977ef4c77e3f6830fbbc8d01bfPaul Rohde} 158