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