1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru************************************************************************ 327f654740f2a26ad62a5c155af9199af9e69b889claireho* Copyright (c) 1997-2010, International Business Machines 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru************************************************************************ 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/ 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef _UTIMER_H 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define _UTIMER_H 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h" 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if defined(U_WINDOWS) 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# define VC_EXTRALEAN 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# define WIN32_LEAN_AND_MEAN 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# include <windows.h> 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#else 1885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho# if defined(OS390) 1985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho# define __UU /* Universal Unix - for struct timeval */ 2085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho# endif 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# include <time.h> 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# include <sys/time.h> 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# include <unistd.h> 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * This API provides functions for performing performance measurement 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * There are 3 main usage scenarios. 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * i) Loop until a threshold time is reached: 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Example: 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * <code> 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * typedef Params Params; 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * struct Params{ 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UChar* target; 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * int32_t targetLen; 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * const UChar* source; 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * int32_t sourceLen; 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UNormalizationMode mode; 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * } 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * void NormFn( void* param){ 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Params* parameters = ( Params*) param; 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UErrorCode error = U_ZERO_ERROR; 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * unorm_normalize(parameters->source, parameters->sourceLen, parameters->mode, 0, parameters->target, parameters->targetLen, &error); 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * if(U_FAILURE(error)){ 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * printf("Normalization failed\n"); 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * } 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * } 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * int main(){ 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * // time the normalization function 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * double timeTaken = 0; 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Params param; 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * param.source // set up the source buffer 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * param.target // set up the target buffer 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * .... so on ... 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UTimer timer; 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * // time the loop for 10 seconds at least and find out the loop count and time taken 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * timeTaken = utimer_loopUntilDone((double)10,(void*) param, NormFn, &loopCount); 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * } 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * </code> 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * ii) Measure the time taken 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Example: 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * <code> 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * double perfNormalization(NormFn fn,const char* mode,Line* fileLines,int32_t loopCount){ 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * int line; 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * int loops; 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UErrorCode error = U_ZERO_ERROR; 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UChar* dest=NULL; 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * int32_t destCapacity=0; 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * int len =-1; 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * double elapsedTime = 0; 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * int retVal=0; 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UChar arr[5000]; 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * dest=arr; 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * destCapacity = 5000; 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UTimer start; 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * // Initialize cache and ensure the data is loaded. 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * // This loop checks for errors in Normalization. Once we pass the initialization 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * // without errors we can safelly assume that there are no errors while timing the 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * // funtion 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * for (loops=0; loops<10; loops++) { 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * for (line=0; line < gNumFileLines; line++) { 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * if (opt_uselen) { 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * len = fileLines[line].len; 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * } 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * retVal= fn(fileLines[line].name,len,dest,destCapacity,&error); 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * #if defined(U_WINDOWS) 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * if(retVal==0 ){ 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * fprintf(stderr,"Normalization of string in Windows API failed for mode %s. ErrorNo: %i at line number %i\n",mode,GetLastError(),line); 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * return 0; 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * } 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * #endif 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * if(U_FAILURE(error)){ 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * fprintf(stderr,"Normalization of string in ICU API failed for mode %s. Error: %s at line number %i\n",mode,u_errorName(error),line); 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * return 0; 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * } 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * } 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * } 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * //compute the time 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * utimer_getTime(&start); 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * for (loops=0; loops<loopCount; loops++) { 109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * for (line=0; line < gNumFileLines; line++) { 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * if (opt_uselen) { 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * len = fileLines[line].len; 112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * } 113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * retVal= fn(fileLines[line].name,len,dest,destCapacity,&error); 115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * } 117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * } 118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * return utimer_getElapsedSeconds(&start); 120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * } 121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * </code> 122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * iii) Let a higher level function do the calculation of confidence levels etc. 124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Example: 125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * <code> 126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * void perf(UTimer* timer, UChar* source, int32_t sourceLen, UChar* target, int32_t targetLen, int32_t loopCount,UNormalizationMode mode, UErrorCode* error){ 127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * int32_t loops; 128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * for (loops=0; loops<loopCount; loops++) { 129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * unorm_normalize(source,sourceLen,target, targetLen,mode,error); 130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * } 131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * utimer_getTime(timer); 132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * } 133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * void main(const char* argsc, int argv){ 134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * // read the file and setup the data 135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * // set up options 136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UTimer start,timer1, timer2, timer3, timer4; 137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * double NFDTimeTaken, NFCTimeTaken, FCDTimeTaken; 138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * switch(opt){ 139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * case 0: 140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * utimer_getTime(start); 141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * perf(timer1, source,sourceLen, target, targetLen,loopCount,UNORM_NFD,&error); 142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * NFDTimeTaken = utimer_getDeltaSeconds(start,timer1); 143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * case 1: 144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * timer_getTime(start); 145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * perf(timer2,source,sourceLen,target,targetLen,loopCount,UNORM_NFC,&error); 146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * NFCTimeTaken = utimer_getDeltaSeconds(start,timer2); 147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * perf(timer3, source, sourceLen, target,targetLen, loopCount, UNORM_FCD,&error); 148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * // ........so on ............. 149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * } 150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * // calculate confidence levels etc and print 151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * } 153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * </code> 155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef struct UTimer UTimer; 159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef void FuntionToBeTimed(void* param); 161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if defined(U_WINDOWS) 164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru struct UTimer{ 166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru LARGE_INTEGER start; 167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru LARGE_INTEGER placeHolder; 168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru }; 169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int uprv_initFrequency(UTimer* timer) 171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return QueryPerformanceFrequency(&timer->placeHolder); 173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void uprv_start(UTimer* timer) 175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru QueryPerformanceCounter(&timer->start); 177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru double uprv_delta(UTimer* timer1, UTimer* timer2){ 179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return ((double)(timer2->start.QuadPart - timer1->start.QuadPart))/((double)timer1->placeHolder.QuadPart); 180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool uprv_compareFrequency(UTimer* timer1, UTimer* timer2){ 182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return (timer1->placeHolder.QuadPart == timer2->placeHolder.QuadPart); 183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#else 186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru struct UTimer{ 188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru struct timeval start; 189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru struct timeval placeHolder; 190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru }; 191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t uprv_initFrequency(UTimer* /*timer*/) 193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return 0; 195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void uprv_start(UTimer* timer) 197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gettimeofday(&timer->start, 0); 199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru double uprv_delta(UTimer* timer1, UTimer* timer2){ 201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru double t1, t2; 202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru t1 = (double)timer1->start.tv_sec + (double)timer1->start.tv_usec/(1000*1000); 204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru t2 = (double)timer2->start.tv_sec + (double)timer2->start.tv_usec/(1000*1000); 205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return (t2-t1); 206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool uprv_compareFrequency(UTimer* /*timer1*/, UTimer* /*timer2*/){ 208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return TRUE; 209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Intializes the timer with the current time 214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param timer A pointer to UTimer struct to recieve the current time 216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic U_INLINE void U_EXPORT2 218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutimer_getTime(UTimer* timer){ 219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uprv_initFrequency(timer); 220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uprv_start(timer); 221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Returns the difference in times between timer1 and timer2 by subtracting 225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * timer1's time from timer2's time 226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param timer1 A pointer to UTimer struct to be used as starting time 228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param timer2 A pointer to UTimer struct to be used as end time 229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return Time in seconds 230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic U_INLINE double U_EXPORT2 232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutimer_getDeltaSeconds(UTimer* timer1, UTimer* timer2){ 233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(uprv_compareFrequency(timer1,timer2)){ 234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return uprv_delta(timer1,timer2); 235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* got error return -1 */ 237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return -1; 238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Returns the time elapsed from the starting time represented by the 242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UTimer struct pointer passed 243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param timer A pointer to UTimer struct to be used as starting time 244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return Time elapsed in seconds 245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic U_INLINE double U_EXPORT2 247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutimer_getElapsedSeconds(UTimer* timer){ 248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UTimer temp; 249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru utimer_getTime(&temp); 250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return uprv_delta(timer,&temp); 251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Executes the function pointed to for a given time and returns exact time 255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * taken and number of iterations of the loop 256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param thresholTimeVal 257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param loopCount output param to recieve the number of iterations 258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param fn The funtion to be executed 259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param param Parameters to be passed to the fn 260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return the time elapsed in seconds 261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic U_INLINE double U_EXPORT2 263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruutimer_loopUntilDone(double thresholdTimeVal, 264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t* loopCount, 265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru FuntionToBeTimed fn, 266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void* param){ 267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UTimer timer; 268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru double currentVal=0; 269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *loopCount = 0; 270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru utimer_getTime(&timer); 271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for(;currentVal<thresholdTimeVal;){ 272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fn(param); 273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru currentVal = utimer_getElapsedSeconds(&timer); 27427f654740f2a26ad62a5c155af9199af9e69b889claireho (*loopCount)++; 275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return currentVal; 277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 281