| Karim BELABAS on Mon, 10 Jun 2002 00:52:43 +0200 (MEST) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| 30- library API |
On Sun, 9 Jun 2002, Karim BELABAS wrote:
> 30- INCOMPATIBILITY: [library] polred & polredabs do not take a 'prec'
> 37- INCOMPATIBILITY: removed gentimer() / genmsgtimer(). Use TIMER/msgTIMER
30- is straightforward: the 'prec' parameter of polred* functions was unused
(the routine now determine an adequate floating point accuracy for the LLL
reduction). So I removed it. C programs have to be updated.
37- is more annoying. I had introduced the gen*timer() routines to get finer
timings than would be available using only the built-in timer() / timer2()
functions. Also PARI timers work in a slightly weird way: they return the
delay since the last time they were called, if some other routine uses the
timer when you're not looking, you get junk.
So it worked like this: you had to reserve a unique "timer identifier" from
get_timer(), and give it as argument to the gen*timer() routines to specify
which timer they should use. Then you had to "release" the identifier, so
that it can be re-used [ there was a hardcoded limit of 32 simultaneous
timers ]
It was documented but rather obscure and, as far as I know, nobody used it
correctly (even the PARI code had it wrong, using the identifiers without
reserving them first).
I came up with the following alternative: we have a private struct
struct pari_timer {
long s; /* number of seconds */
long us; /* number of microseconds */
}
(= struct timeval from <sys/time.h>)
to store information about time . And a routine to fill and exploit it:
long TIMER(struct pari_timer *T) [ msgTIMER is similar ]
return the delay since
It works like this
fun()
{
pari_timer T;
long t;
(void)TIMER(&T); /* initialize timer */
...
t = TIMER(&T); /* number of ms since last call to timer T */
}
The members of T never need to be accessed directly, they simply translate in
a uniform way the output from the various time routine we might be using:
getrusage(), ftime(), GetTickCount(), clock() etc.
Probably the
(void)TIMER(&T);
could be replaced by something like
initTIMER(&T);
The names are debatable, but I think it's neater than the "identifier"
approach, and easier to use.
Problems:
1) I'd rather not leave the functions using the old interface (gentimer /
genmsgtimer) around, because they are ugly and a bit dangerous. Also they've
been introduced comparatively recently (2.0.18, december 1999) and I believe
nobody uses them. But there is a theoretical risk that programs would be
broken.
2) I could not test the new timers for all the time routines they are
supposed to encapsulate: I checked times(), getrusage(), ftime() and clock().
GetTickCount (#define WINCE), TickCount (#define macintosh) anyone ?
Karim.
--
Karim Belabas Tel: (+33) (0)1 69 15 57 48
Dép. de Mathematiques, Bat. 425 Fax: (+33) (0)1 69 15 60 19
Université Paris-Sud Email: Karim.Belabas@math.u-psud.fr
F-91405 Orsay (France) http://www.math.u-psud.fr/~belabas
--
PARI/GP Home Page: http://www.parigp-home.de/