Bill Stoddard wrote:
Under this proposal, the sequence of time operations in an
httpd request would look like:
1. gettimeofday
(fast, no loss of accuracy)
We cannot avoid this, right?
Right (but it's fast enough that we don't need to worry about it).
2. 64-bit multiplication to build an apr_time_t
(slow (on lots of current platforms), no loss of accuracy)
Do we eliminate this by representing apr_time_t as busec?
Yes. Representing apr_time_t as busec is, from my perspective,
the ideal solution: we get speed and accuracy, while still
providing microsecond resolution to those apps that need it.
3. 64-bit shifts to get approximate seconds
(fast, but loss of accuracy)
If you convert from microseconds to integer seconds (which is what httpd
requires), you loose -resolution- no matter how you do it. If the accuracy
you loose is smaller than the resolution, then what does it matter that you
loose some accuracy?
I think it's possible to see inaccuracies at the second level if
we divide the current time_t by 2^20. If not, then this concern
vanishes.
We end up with compromises in both performance and accuracy,
in code that:
- is completely under our control, and
- wouldn't require any compromise of performance or accuracy
if we just stopped creating the seconds*1000000+microseconds
representation in step 2.
I must have blinked... How does step 2 work with busec?
With busec, step 2 replaces the 64-bit multiplication with
a 64-bit shift.
I'd like to leave the struct/function renames off the table for now and just
discuss the technical details of the proposals... It was the intertwining of
the technical and esthetics of the naming convestions that made the previous
discussion difficult for me to follow.
I agree on this part. Looking just at the proposals I've heard so
far for the representation, and ignoring the naming issues, here's
my attempt to enumerate the advantages and drawbacks of each
representation:
* Scalar containing seconds since the epoch (like time_t):
Pros: Adequate for things that only need seconds,
extracting seconds from this object has zero cost :-)
Cons: Not a general-purpose solution because it can't
hold microseconds
* Scalar containing seconds and usec, encoded in the current
apr_time_t format:
Pros: Microsecond resolution
Cons: 64-bit multiplication and division ops are a
performance problem in some important applications
(like the httpd)
* Scalar containing seconds and usec, encoded in busec format:
Pros: Microsecond resolution, fast retrieval of seconds and
microseconds
Cons: None that I know of
* Struct containing seconds and usec as separate fields
Pros: Microsecond resolution, fast retrieval of seconds and
microseconds
Cons: May take up more space (64-bit seconds plus 32-bit usec,
compared to 64 bits for the whole object in some of
the other designs), addition and subtraction are slower
with a struct than with a scalar.
Based on the technical merits of these designs (which I hope I've
described accurately here--corrections welcome), I think the binary
microseconds design is the best.
--Brian