7 /* Function prototypes */
8 static int prof_clearexcept_all(size_t iterations);
9 static int prof_clearexcept_random(size_t iterations);
10 static int prof_getenv(size_t iterations);
11 static int prof_getround(size_t iterations);
12 static int prof_holdexcept(size_t iterations);
13 static int prof_raiseexcept(size_t iterations);
14 static int prof_setenv_default(size_t iterations);
15 static int prof_setenv_getenv(size_t iterations);
16 static int prof_setround(size_t iterations);
17 static int prof_updateenv_default(size_t iterations);
18 static int prof_updateenv_getenv(size_t iterations);
21 /* Constants and macros */
22 #define ITERATIONS (10 * 1000 * 1000)
25 * They are esentially the same, but we still define them as if
26 * they were different, for conceptual consistency and clarity.
28 #define MARK_START(tv1) \
29 assert(gettimeofday(tv1, NULL) == 0);
31 #define MARK_END(tv2) \
32 assert(gettimeofday(tv2, NULL) == 0);
34 #define MSECS(tv1, tv2) \
35 (((tv2).tv_sec - (tv1).tv_sec ) * 1000 + \
36 ((tv2).tv_usec - (tv1).tv_usec) / 1000)
38 static int extable[] = {
64 { "feclearexcept() FE_ALL_EXCEPT",
68 { "feclearexcept() random",
69 prof_clearexcept_random,
88 { " fesetenv() FE_DFL_ENV",
92 { " fesetenv() random",
100 { " feupdateenv() FE_DFL_ENV",
101 prof_updateenv_default,
104 { " feupdateenv() random",
105 prof_updateenv_getenv,
114 const struct pentry *p;
117 for (p = ptable; p; p++) {
118 if (p->p_desc == NULL && p->p_func == NULL && p->p_iter == 0)
121 msecs = p->p_func(p->p_iter);
122 printf("%s: %5d msecs for %d iterations\n",
123 p->p_desc, msecs, p->p_iter);
130 prof_clearexcept_all(size_t iterations)
132 struct timeval tv1, tv2;
137 for (i = 0; i < iterations; i++)
138 assert(feclearexcept(FE_ALL_EXCEPT) == 0);
142 return MSECS(tv1, tv2);
146 prof_clearexcept_random(size_t iterations)
148 struct timeval tv1, tv2;
151 N = sizeof(extable) / sizeof(extable[0]);
156 for (i = 0; i < iterations; i++)
157 assert(feclearexcept(extable[i%N]) == 0);
161 return MSECS(tv1, tv2);
165 prof_getenv(size_t iterations)
167 struct timeval tv1, tv2;
173 for (i = 0; i < iterations; i++)
174 assert(fegetenv(&env) == 0);
178 return MSECS(tv1, tv2);
182 prof_getround(size_t iterations)
184 struct timeval tv1, tv2;
189 for (i = 0; i < iterations; i++)
190 assert(fegetround() == 0);
194 return MSECS(tv1, tv2);
198 prof_holdexcept(size_t iterations)
200 struct timeval tv1, tv2;
206 for (i = 0; i < iterations; i++)
207 assert(feholdexcept(&env) == 0);
211 return MSECS(tv1, tv2);
215 prof_setenv_default(size_t iterations)
217 struct timeval tv1, tv2;
222 for (i = 0; i < iterations; i++)
223 assert(fesetenv(FE_DFL_ENV) == 0);
227 return MSECS(tv1, tv2);
231 prof_updateenv_default(size_t iterations)
233 struct timeval tv1, tv2;
238 for (i = 0; i < iterations; i++)
239 assert(feupdateenv(FE_DFL_ENV) == 0);
243 return MSECS(tv1, tv2);
247 prof_setenv_getenv(size_t iterations)
249 struct timeval tv1, tv2;
255 for (i = 0; i < iterations; i++) {
256 assert(fegetenv(&env) == 0);
257 assert(fesetenv(&env) == 0);
262 return MSECS(tv1, tv2);
266 prof_setround(size_t iterations)
268 const int rndmodes[] = {
282 const size_t N = sizeof(rndmodes) / sizeof(rndmodes[0]);
283 struct timeval tv1, tv2;
288 for (i = 0; i < iterations; i++) {
289 assert(fesetround(rndmodes[i % N]) == 0);
294 return MSECS(tv1, tv2);
298 prof_updateenv_getenv(size_t iterations)
300 struct timeval tv1, tv2;
306 for (i = 0; i < iterations; i++) {
307 assert(fegetenv(&env) == 0);
308 assert(feupdateenv(&env) == 0);
313 return MSECS(tv1, tv2);
317 prof_raiseexcept(size_t iterations)
319 struct timeval tv1, tv2;
322 N = sizeof(extable) / sizeof(extable[0]);
327 for (i = 0; i < iterations; i++) {
328 assert(feraiseexcept(extable[i%N]) == 0);
333 return MSECS(tv1, tv2);