On 20/03/2011, at 12:08, David Bruant wrote:
> Le 20/03/2011 04:11, Brendan Eich a écrit :
>> On Mar 19, 2011, at 4:20 PM, Sam Tobin-Hochstadt wrote:
>> 
>>> On Sat, Mar 19, 2011 at 6:50 PM, Brendan Eich <bren...@mozilla.com> wrote:
>>>> setTimeout does not introduce threads, shared memory among them, or even
>>>> non-determinism if we spec carefully (browsers have to implement carefully
>>>> already).
>>> `setTimeout' already introduces nondeterminism based on the speed of
>>> the implementation.  Consider:
>>> 
>>> setTimeout(f1,1000)
>>> compute()
>>> setTimeout(f2,0)
>>> 
>>> If `compute' takes a long time, then `f1' runs before `f2', otherwise
>>> `f2' runs first.
>> Isn't the non-determinism entirely in compute(), so that if you replace the 
>> two setTimeout calls with Date.now calls, saving results, you can measure 
>> the ND that either does or does not reorder f1 with respect to f2?
>> 
>> My point was that setTimeout, unlike threads racing over shared mutable 
>> state, does not introduce new sources of ND not already in the current 
>> execution model.
>> 
>> We need to be careful about order, though. If setTimeout(f1, 1000) schedules 
>> f1 to be called at t1, and setTimeout(f2, 0) schedules f2 at t2, then if t2 
>> >= t1, f1 should be called first. I'm not sure all browsers implement this.
> I'm sorry, but even though I agree on the principle, I do not know why
> "f1 /should/ be called first".
> With names:
> ----
> setTimeout(f1, delay1);
> computea();
> setTimeout(f2, delay2);
> computeb(); // to enforce the idea that the program doesn't stop right away
> ----
> At the end, f1 is scheduled at t1, f2 at t2. (t1<t and t2<t with t
> present time). We have two timeouts ready to be fired, there is a
> decision that has to be made on the firing order. I would personnally
> choose yours, which is to call the function that has been the most
> delayed (max(t - t_i)). However, other decision policies could be valid.
> For instance, choosing max( (t-t_i)/delay_i ) could be a valid policy
> too. The rationale would be to keep at a minimum not the absolute delay,
> but the relative delay.
> Another thing that could be taken into account is heuristics on the time
> that f1 and f2 take to execute.
> Mixing all these things together, there are certainly other valid
> policies that could be considered.
> 
> Once again, my personal preference, the policy I find the most fair, is
> reducing absolute delay as you suggest, but is there a reason why this
> /should/ be the behavior accross browsers? Should even the behavior be
> consistent across browser? Across hardware, ES engine implementation and
> external factors (OS scheduling with other programs), computea and
> computeb can make t1 and t2 relative order different from one run to
> another. So there is no way to test the consistency.
> 
> Is there a reason why you're expecting browsers 1) to be consistent in
> their policies 2) to choose a particular policy?

A timer that expires is an event, and I would expect events to be serviced in 
the order they happen. As when I click twice, I'd expect the first click to be 
serviced before the second click.

So given 2 timers, expiring at t0 and t1 with t0 < t1, if Date.now() is >= t0 
and >= t1, I would expect t0 to be serviced first, yes.
-- 
Jorge.
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to