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