[D-runtime] druntime commit, revision 410

Fawzi Mohamed fawzi at gmx.ch
Fri Nov 5 14:27:34 PDT 2010


On 5-nov-10, at 21:51, Jonathan M Davis wrote:

> On Friday, November 05, 2010 13:09:39 Sean Kelly wrote:
>> On Nov 5, 2010, at 11:43 AM, Fawzi Mohamed wrote:
>>> On 5-nov-10, at 18:59, Sean Kelly wrote:
>>>> On Nov 5, 2010, at 9:12 AM, Fawzi Mohamed wrote:
>>>>> Using integers one has to somehow give access to the time unit  
>>>>> in some
>>>>> way, and so make the interface more complex. If different timers  
>>>>> have
>>>>> different resolution different structures have to be used. Thus  
>>>>> they
>>>>> lead to a more complex interface.
>>>>
>>>> I disagree.  With the Duration code, the call looks like this:
>>>>  Thread.sleep(seconds(5) + milliseconds(10))
>>>>
>>>> How is that complex?  Though I'll admit that the double version  
>>>> is pretty
> straightforward too:
>>> You are right, It is not complex if you use it only for that.
>>> But if later you want to use the same/similar structure for  
>>> different
>>> clocks (probably outside the core), then you have problems if the  
>>> other
>>> clock has a different resolution.
>>
>> Resolution is only relevant insofar as the maximum and minimum  
>> duration
>> that can be represented.  Using a signed 64-bit value at a nanosecond
>> resolution, the maximum duration that can be represented is roughly  
>> 300
>> years, and bumping the resolution to 100ns increments (as in C#)  
>> would
>> make this 30,000 years.  Is there really a need for multiple- 
>> resolution
>> durations?  Perhaps duration should use a double internally as  
>> well?  One
>> of my concerns of using std.datetime as-is is that I'd need 4  
>> overloads of
>> Thread.sleep(), one for each duration type.  This suggests to me that
>> durations in std.datetime really weren't intended for independent  
>> use.
>
> The idea with the different durations that were in std.datetime was  
> that you'd do
> calls like Dur.years(1) + Dur.days(2) and have exactly the correct  
> duration
> types without worrying about what they actually were. The Dur  
> functions returned
> the correct duration type for that unit, and any arithmetic done on  
> them
> resulted in the correct duration type. So, for the most part, you  
> didn't have to
> worry about the duration types. However, any function that took a  
> duration would
> typically have been templated on the duration type. In the case of  
> sleep, it
> would only have been able to take an HNSecDuration or TickDuration  
> anyway, since
> MonthDuration and JointDuration wouldn't have been convertable  
> without a specific
> date (hence why they existed in the first place rather than just  
> having
> HNSecDuration for normal duration stuff and TickDuration for the few  
> things that
> actually cared about clock ticks).
>
> The problem, of course, was that anyone looking at the situation saw  
> multiple
> duration types and was wondering why and what they were for and how  
> to use them,
> even though the use case was really simple, and you really didn't  
> have to worry
> about the types for the most part (passing durations to functions  
> that you wrote
> was nearly the only place that it would have mattered). So, there  
> was a fair bit
> of confusion there. It's a bit like how many of the return types in
> std.algorithm tend to scare people when liberal use of auto (and  
> possible
> std.array.array) solves the problem quite easily, and you don't have  
> to worry
> about them. So, I liked them, but it seemed like the confusion  
> caused was too
> great to keep them. years and months now get dealt with separately  
> from
> durations.
>
> When I was designing them, I certainly wasn't thinking about using  
> them with
> stuff in core like Thread.sleep() and the like, but I'm not sure  
> that I would
> have done anything differently if I had. I'd have just made  
> Thread.sleep() take
> an HNSecDuration, since MonthDuration and JointDuration would have  
> made no sense
> in that context, and you could always cast TickDuration to an  
> HNSecDuration if
> you really wanted to use a TickDuration for some reason (though I  
> think that
> about the only place that a typical programmer would use  
> TickDuration directly
> would be when using StopWatch). So, that's essentially, what I'm  
> going to
> propose now, except that it's Duration instead of HNSecDuration (it  
> was renamed
> on the demise of MonthDuration and JointDuration). Thread.sleep()  
> and its
> friends can take a Duration, and if someone really wants to use a  
> TickDuration,
> they can cast it.
>
> Now, Duration has 100 ns precision, so if you really want a sleep  
> function that
> goes to nanosecond resolution, then you'd have to have it also take a
> TickDuration - if a clock tick is a high enough resolution,  
> TickDuration could
> be used to get something as precise as nanoseconds - but while it can
> theoretically hold nanoseconds, it can't actually return them or be  
> assigned
> them without doing the calculations yourself (hnsecs is the highest  
> resolution
> that it supports directly, but it holds its length in clock ticks).  
> But since
> Linux doesn't seem to support a resolution higher than microseconds  
> (on any
> system I've used anyway), and while Windows does support a higher  
> resolution,
> it's not much higher than microseconds IIRC, I'm not sure if there's  
> much point
> in trying to support resolutions higher than hnsecs.
>
> - Jonathan M Davis
I know that you went for a very different approach, but as said, I  
find something like what was used in NextStep/Openstep (that was cross  
platform) and now Apple iOS and OSX a cleaner approach, and one that  
doesn't need many templates.
The fact that libev (that is quite performance minded) also uses  
doubles just confirms that it is a good approach even if you want high  
performance.

The basic structure is reflected also in the C based Core Foundation  
types that are used to implement them nowardays:

http://developer.apple.com/library/ios/#documentation/CoreFoundation/ 
Conceptual/CFDatesAndTimes/Concepts/DataReps.html%23//apple_ref/doc/ 
uid/20001139-CJBEJBHH

(the Objective-C types based on them are)

http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/ 
DatesAndTimes/DatesAndTimes.html%23//apple_ref/doc/uid/10000039i

Note that these are basically lifted from the open specification of  
OpenStep (that Gnustep for example tries to implement)

http://docs.sun.com/app/docs/doc/802-2112?l=en

Fawzi


More information about the D-runtime mailing list