Home | History | Annotate | Download | only in profiler
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.camera.stats.profiler;
     18 
     19 import com.android.camera.async.MainThread;
     20 
     21 /**
     22  * Basic profiler that will compute start, end and "time since last event"
     23  * values and pass them along to the subclass. This also provides
     24  * standard formatting methods for messages to keep them consistent.
     25  */
     26 public abstract class ProfileBase implements Profile {
     27     private final String mName;
     28 
     29     private long mStartNanos;
     30     private long mLastMark;
     31 
     32     /** Create a new profile for a given name. */
     33     public ProfileBase(String name) {
     34         mName = name;
     35     }
     36 
     37     @Override
     38     public final Profile start() {
     39         mStartNanos = System.nanoTime();
     40         mLastMark = mStartNanos;
     41         onStart();
     42 
     43         return this;
     44     }
     45 
     46     @Override
     47     public final void mark() {
     48         mLastMark = System.nanoTime();
     49         // In most cases this will only be used to reset the lastMark time.
     50     }
     51 
     52     @Override
     53     public final void mark(String reason) {
     54         long time = System.nanoTime();
     55         onMark(getTotalMillis(time), getTimeFromLastMillis(time), reason);
     56         mLastMark = time;
     57     }
     58 
     59     @Override
     60     public final void stop() {
     61         long time = System.nanoTime();
     62         onStop(getTotalMillis(time), getTimeFromLastMillis(time));
     63         mLastMark = time;
     64     }
     65 
     66     @Override
     67     public final void stop(String reason) {
     68         long time = System.nanoTime();
     69         onStop(getTotalMillis(time), getTimeFromLastMillis(time), reason);
     70         mLastMark = time;
     71     }
     72 
     73     /**
     74      * Format a simple message with the total elapsed time and a simple event.
     75      */
     76     protected final String format(double totalMillis, String event) {
     77         return String.format("[%7sms]%s %-6s %s",
     78               String.format("%.3f", totalMillis),
     79               MainThread.isMainThread() ? "[ui]" : "",
     80               event + ":",
     81               mName);
     82     }
     83 
     84     /**
     85      * Format a simple message with the total elapsed time, a simple event,
     86      * and a string reason at the end.
     87      */
     88     protected final String format(double totalMillis, String event, String reason) {
     89         return String.format("[%7sms]%s %-6s %s - %s",
     90               String.format("%.3f", totalMillis),
     91               MainThread.isMainThread() ? "[ui]" : "",
     92               event + ":",
     93               mName,
     94               reason);
     95     }
     96 
     97     /**
     98      * Format a simple message with the total elapsed time, a simple event,
     99      * a time since last event, and a string reason.
    100      */
    101     protected final String format(double totalMillis, String event, double lastMillis, String reason) {
    102         return String.format("[%7sms]%s %-6s %s - [%6sms] %s",
    103               String.format("%.3f", totalMillis),
    104               MainThread.isMainThread() ? "[ui]" : "",
    105               event + ":",
    106               mName,
    107               String.format("%.3f", lastMillis),
    108               reason);
    109     }
    110 
    111     /**
    112      * Called when start() is called.
    113      */
    114     protected void onStart() { }
    115 
    116     /**
    117      * Called when mark() is called with computed total and time
    118      * since last event values in milliseconds.
    119      */
    120     protected void onMark(double totalMillis, double lastMillis, String reason) { }
    121 
    122     /**
    123      * Called when stop() is called with computed total and time
    124      * since last event values in milliseconds.
    125      */
    126     protected void onStop(double totalMillis, double lastMillis) { }
    127 
    128     /**
    129      * Called when stop() is called with computed total and time
    130      * since last event values in milliseconds. Inclues the stop reason.
    131      */
    132     protected void onStop(double totalMillis, double lastMillis, String reason) { }
    133 
    134     private double getTotalMillis(long timeNanos) {
    135         return nanoToMillis(timeNanos - mStartNanos);
    136     }
    137 
    138     private double getTimeFromLastMillis(long timeNanos) {
    139         return nanoToMillis(timeNanos - mLastMark);
    140     }
    141 
    142     private double nanoToMillis(long timeNanos) {
    143         return (double)(timeNanos) / 1000000.0;
    144     }
    145 }
    146