stopwatch.cpp revision b0ba9854ae1310425d7c09c72c528239a001e7c7
139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania/*
239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * Copyright (C) 2009 The Android Open Source Project
339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * All rights reserved.
439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania *
539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * Redistribution and use in source and binary forms, with or without
639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * modification, are permitted provided that the following conditions
739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * are met:
839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania *  * Redistributions of source code must retain the above copyright
939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania *    notice, this list of conditions and the following disclaimer.
1039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania *  * Redistributions in binary form must reproduce the above copyright
1139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania *    notice, this list of conditions and the following disclaimer in
1239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania *    the documentation and/or other materials provided with the
1339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania *    distribution.
1439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania *
1539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
1839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
1939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
2039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
2139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
2239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
2339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
2439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
2539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania * SUCH DAMAGE.
2739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania */
2839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
2939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
3039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania#include <malloc.h>
3139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania#include <stdio.h>
3239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania#include <time.h>
3339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania#include "stopwatch.h"
34b0ba9854ae1310425d7c09c72c528239a001e7c7Xia Wang#include <math.h>
3539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
3639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania#define SNPRINTF_OR_RETURN(str, size, format, ...) {                    \
3739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        int len = snprintf((str), (size), (format), ## __VA_ARGS__);    \
3839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        if (len < 0) return;                                            \
3939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        if (len > static_cast<int>(size)) {                             \
4039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            fprintf(stderr, "Not enough space\n");                      \
4139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            return;                                                     \
4239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        } else {                                                        \
4339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            (size) -= len; (str) += len;                                \
4439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        }                                                               \
4539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
4639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
4739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catanianamespace {
4839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniaconst bool kVerbose = false;
4939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniabool printRaw = false;
5039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
5139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
5239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catanianamespace android_test {
5339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
5439c016f875b793296a121f41de5775b88f6fa1c9Nicolas CataniaStopWatch::StopWatch(const char *name, size_t capacity)
5539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    : mName(strdup(name)), mNum(0), mData(NULL), mDataLen(0), mCapacity(capacity * 2),
5639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      mSizeKbytes(0), mAlreadyPrinted(false), mPrintRaw(false),
57b0ba9854ae1310425d7c09c72c528239a001e7c7Xia Wang      mDuration(0.0), mDeviation(0.0),
5839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      mMinDuration(0.0), mMinIdx(0),
5939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      mMaxDuration(0.0), mMaxIdx(0),
6039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania      mDeltas(NULL), mUsed(false)
6139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania{
6239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    mStart.tv_sec = 0;
6339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    mStart.tv_nsec = 0;
6439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    mData = (Measurement *) malloc(mCapacity * sizeof(Measurement));
6539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
6639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
6739c016f875b793296a121f41de5775b88f6fa1c9Nicolas CataniaStopWatch::~StopWatch()
6839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania{
6939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    if (mUsed && !mAlreadyPrinted)
7039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    {
7139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        fprintf(stderr, "Discarding data for %s\n", mName);
7239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
7339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    free(mData);
7439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    free(mName);
7539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    delete [] mDeltas;
7639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
7739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
7839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniavoid StopWatch::start()
7939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania{
8039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    checkCapacity();
8139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    clock_gettime(CLOCK_MONOTONIC, &mData[mDataLen].mTime);
8239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    mData[mDataLen].mIsStart = true;
8339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    if (!mUsed)
8439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    {
8539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        mStart = mData[mDataLen].mTime; // mDataLen should be 0
8639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        mUsed = true;
8739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
8839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    ++mNum;
8939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    ++mDataLen;
9039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
9139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
9239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniavoid StopWatch::stop()
9339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania{
9439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    checkCapacity();
9539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    clock_gettime(CLOCK_MONOTONIC, &mData[mDataLen].mTime);
9639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    mData[mDataLen].mIsStart = false;
9739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    ++mDataLen;
9839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
9939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
10039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniavoid StopWatch::setPrintRawMode(bool raw)
10139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania{
10239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    printRaw = raw;
10339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
10439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
10539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
10639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniavoid StopWatch::sprint(char **str, size_t *size)
10739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania{
10839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    if (kVerbose) fprintf(stderr, "printing\n");
10939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    mAlreadyPrinted = true;
11039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    if (0 == mDataLen)
11139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    {
11239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        return;
11339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
11439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    if (mDataLen > 0 && mData[mDataLen - 1].mIsStart)
11539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    {
11639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        stop();
11739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
11839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    if (kVerbose) SNPRINTF_OR_RETURN(*str, *size, "# Got %d samples for %s\n", mDataLen, mName);
11939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    processSamples();
12039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
121d6079c62819b4c022fe23e5101ca5382fbedb10fNicolas Catania    SNPRINTF_OR_RETURN(*str, *size, "# StopWatch %s total/cumulative duration %f Samples: %d\n",
12239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania                       mName, mDuration, mNum);
12339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    printThroughput(str, size);
12439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    printAverageMinMax(str, size);
12539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
12639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    if (printRaw)
12739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    {
12839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        // print comment header and summary values.
12939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
130b0ba9854ae1310425d7c09c72c528239a001e7c7Xia Wang        SNPRINTF_OR_RETURN(*str, *size, "# Name Iterations  Duration Min MinIdx Max MaxIdx SizeKbytes\n");
13139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        SNPRINTF_OR_RETURN(*str, *size, "%s %d %f %f %d %f %d %d\n", mName, mNum, mDuration,
13239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania                           mMinDuration, mMinIdx, mMaxDuration, mMaxIdx, mSizeKbytes);
13339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        // print each duration sample
13439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        for (size_t i = 0; i < mDataLen / 2; ++i)
13539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        {
13639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            long second = mData[i * 2].mTime.tv_sec - mStart.tv_sec;
13739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            long nano = mData[i * 2].mTime.tv_nsec - mStart.tv_nsec;
13839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
13939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            SNPRINTF_OR_RETURN(*str, *size, "%f %f\n", double(second) + double(nano) / 1.0e9, mDeltas[i]);
14039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        }
14139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
14239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
14339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
14439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
14539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania// Normally we should have enough capacity but if we have to
14639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania// reallocate the measurement buffer (e.g start and stop called more
14739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania// than once in an iteration) we let the user know. She should provide
14839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania// a capacity when building the StopWatch.
14939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniavoid StopWatch::checkCapacity()
15039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania{
15139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    if (mDataLen >= mCapacity)
15239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    {
15339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        mCapacity *= 2;
15439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        fprintf(stderr, "# Increased capacity to %d for %s. Measurement affected.\n",
15539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania                mCapacity, mName);
15639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        mData = (Measurement *)realloc(mData, mCapacity * sizeof(Measurement));
15739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
15839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
15939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
16039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
16139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania// Go over all the samples and compute the diffs between a start and
16239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania// stop pair. The diff is accumulated in mDuration and inserted in
16339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania// mDeltas.
16439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania// The min and max values for a diff are also tracked.
16539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniavoid StopWatch::processSamples()
16639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania{
16739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    if (kVerbose) fprintf(stderr, "processing samples\n");
168b0ba9854ae1310425d7c09c72c528239a001e7c7Xia Wang    size_t n = mDataLen / 2;
169b0ba9854ae1310425d7c09c72c528239a001e7c7Xia Wang    mDeltas= new double[n];
17039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    for (size_t i = 0; i < mDataLen; i += 2)   // even: start  odd: stop
17139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    {
17239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        long second = mData[i + 1].mTime.tv_sec - mData[i].mTime.tv_sec;
17339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        long nano = mData[i + 1].mTime.tv_nsec - mData[i].mTime.tv_nsec;
17439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
17539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        mDeltas[i / 2] = double(second) + double(nano) / 1.0e9;
17639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
17739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
178b0ba9854ae1310425d7c09c72c528239a001e7c7Xia Wang    for (size_t i = 0; i < n; ++i)
17939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    {
18039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        if (0 == i)
18139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        {
18239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            mMinDuration = mMaxDuration = mDeltas[i];
18339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        }
18439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        else
18539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        {
18639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            if (mMaxDuration < mDeltas[i])
18739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            {
18839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania                mMaxDuration = mDeltas[i];
18939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania                mMaxIdx = i;
19039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            }
19139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            if (mMinDuration > mDeltas[i])
19239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            {
19339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania                mMinDuration = mDeltas[i];
19439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania                mMinIdx = i;
19539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania            }
19639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        }
19739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        mDuration += mDeltas[i];
19839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
199b0ba9854ae1310425d7c09c72c528239a001e7c7Xia Wang    double avgDuration = mDuration / n;
200b0ba9854ae1310425d7c09c72c528239a001e7c7Xia Wang    double diffSQ = 0.0;
201b0ba9854ae1310425d7c09c72c528239a001e7c7Xia Wang    for (size_t i = 0; i < n; ++i)
202b0ba9854ae1310425d7c09c72c528239a001e7c7Xia Wang    {
203b0ba9854ae1310425d7c09c72c528239a001e7c7Xia Wang      diffSQ += pow((mDeltas[i] - avgDuration), 2.0);
204b0ba9854ae1310425d7c09c72c528239a001e7c7Xia Wang    }
205b0ba9854ae1310425d7c09c72c528239a001e7c7Xia Wang    mDeviation = sqrt(diffSQ / n);
20639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
20739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
208b0ba9854ae1310425d7c09c72c528239a001e7c7Xia Wang
20939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniadouble StopWatch::timespecToDouble(const struct timespec& time)
21039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania{
21139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    double val = double(time.tv_nsec) / 1.0e9 + double(time.tv_sec);
21239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    return val < 0.0 ? -val : val;  // sometimes 0.00 is -0.00
21339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
21439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
21539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
21639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania// If we have only 2 values, don't bother printing anything.
21739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniavoid StopWatch::printAverageMinMax(char **str, size_t *size)
21839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania{
21939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    if (mDataLen > 2) // if there is only one sample, avg, min, max are trivial.
22039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    {
22139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        SNPRINTF_OR_RETURN(*str, *size, "# Average %s duration %f s/op\n", mName, mDuration / mNum);
222b0ba9854ae1310425d7c09c72c528239a001e7c7Xia Wang        SNPRINTF_OR_RETURN(*str, *size, "# Standard deviation %s duration %f \n", mName, mDeviation);
22339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        SNPRINTF_OR_RETURN(*str, *size, "# Min %s duration %f [%d]\n", mName, mMinDuration, mMinIdx);
22439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        SNPRINTF_OR_RETURN(*str, *size, "# Max %s duration %f [%d]\n", mName, mMaxDuration, mMaxIdx);
22539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
22639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
22739c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania
22839c016f875b793296a121f41de5775b88f6fa1c9Nicolas Cataniavoid StopWatch::printThroughput(char **str, size_t *size)
22939c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania{
23039c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    if (0 != mSizeKbytes)
23139c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    {
23239c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        SNPRINTF_OR_RETURN(*str, *size, "# Size: %d Kbytes  Total: %d\n", mSizeKbytes, mNum);
23339c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania        SNPRINTF_OR_RETURN(*str, *size, "# Speed %f Kbyte/s\n", double(mSizeKbytes) * mNum / mDuration);
23439c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania    }
23539c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}
23639c016f875b793296a121f41de5775b88f6fa1c9Nicolas Catania}  // namespace android_test
237