17687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki/*
27687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki * Copyright (C) 2010 The Android Open Source Project
37687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki *
47687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki * Licensed under the Apache License, Version 2.0 (the "License");
57687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki * you may not use this file except in compliance with the License.
67687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki * You may obtain a copy of the License at
77687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki *
87687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki *      http://www.apache.org/licenses/LICENSE-2.0
97687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki *
107687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki * Unless required by applicable law or agreed to in writing, software
117687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki * distributed under the License is distributed on an "AS IS" BASIS,
127687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki * See the License for the specific language governing permissions and
147687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki * limitations under the License.
157687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki */
167687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki
177687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onukipackage com.android.email;
187687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki
1931d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blankimport com.android.emailcommon.Logging;
20560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedyimport com.android.mail.utils.LogUtils;
2131d9acbf0623872f9d4a2b3210b5970854b654c7Marc Blank
227687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onukiimport android.os.SystemClock;
237687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki
247687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki/**
257687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki * A simple class to measure elapsed time.
267687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki *
277687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki * <code>
287687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki *   StopWatch s = StopWatch.start();
297687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki *   // Do your stuff
307687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki *   s.split();
317687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki *   // More stuff
327687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki *   s.split();
337687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki *   // More stuff
347687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki *   s.stop();
357687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki * </code>
367687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki */
377687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onukipublic class StopWatch {
387687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki    private final String mName;
397687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki    private final long mStart;
407687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki    private long mLastSplit;
417687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki
427687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki    private StopWatch(String name) {
437687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki        mName = name;
447687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki        mStart = getCurrentTime();
457687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki        mLastSplit = mStart;
46560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy        LogUtils.w(Logging.LOG_TAG, "StopWatch(" + mName + ") start");
477687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki    }
487687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki
497687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki    public static StopWatch start(String name) {
507687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki        return new StopWatch(name);
517687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki    }
527687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki
537687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki    public void split(String label) {
547687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki        long now = getCurrentTime() ;
557687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki        long elapse = now - mLastSplit;
56560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy        LogUtils.w(Logging.LOG_TAG, "StopWatch(" + mName + ") split(" + label + ") " + elapse);
577687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki        mLastSplit = now;
587687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki    }
597687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki
607687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki    public void stop() {
617687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki        long now = getCurrentTime();
62560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedy        LogUtils.w(Logging.LOG_TAG, "StopWatch(" + mName + ") stop: "
637687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki                + (now - mLastSplit)
647687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki                + "  (total " + (now - mStart) + ")");
657687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki    }
667687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki
677687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki    private static long getCurrentTime() {
687687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki        // We might want to use other counters, such as currentThreadTimeMillis().
697687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki        // TODO add option for that?
707687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki        return SystemClock.elapsedRealtime();
717687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki    }
727687f05f7bd02a4400e340eeb05cd296c34da42aMakoto Onuki}
73