Ah second implementation has a bug again that makes it much faster than it
should be I'll post the fix and the actual speed up, if any, shortly.

On Wed, Jan 14, 2015 at 5:34 PM, Richard Wallis <[email protected]> wrote:

> On a side note the Scheduler implentation needs to be rewritten to make it
> easier to provide alternative schedulers while letting those alternative
> schedulers use as much of the core code as possible.
>
> It would be easier to make these patches if runRepeatingTasks was
> protected and there was a Scheduler interface instead of an abstract class
> with so many nested classes.
>
>
> On Wed, Jan 14, 2015 at 5:25 PM, Richard Wallis <[email protected]>
> wrote:
>
>> Also, your approach is assuming that all tasks in the queue are "the same
>>> task" that needs repeating. But what if I schedule 2 incremental tasks?
>>
>>
>> Loop count code takes this into account and only runs if the length of
>> the task queue == 1.
>>
>> The second approach where you divide the TIME_SLICE by elapsed time and
>> then multiply by how many tasks have run will work with multiple tasks at a
>> time.  It's dangerous in the current implementation because the faster job
>> can die before a slower job messing up the estimate.  But it can be made
>> safe
>>
>> On Wed, Jan 14, 2015 at 5:14 PM, Thomas Broyer <[email protected]>
>> wrote:
>>
>>> Also, your approach is assuming that all tasks in the queue are "the
>>> same task" that needs repeating. But what if I schedule 2 incremental tasks?
>>>
>>>
>>> On Wednesday, January 14, 2015 at 3:07:47 PM UTC+1, Richard Wallis wrote:
>>>>
>>>> Just an update, there's a bug in my original implementation which
>>>> causes the loopCounter to tend to increase until the task ends.
>>>>
>>>> After removing the bug, the performance increase is only about 8% for
>>>> the fibonacci sequence.
>>>>
>>>> Also the safer version where the loopCounter increments by at most 1
>>>> eliminates the performance gain for the fibonacci test because the task
>>>> runs 8000 to 9000 times during each loop so the loopCounter never gets
>>>> anywhere close to a number that will make a difference.
>>>>
>>>>
>>>> On Wed, Jan 14, 2015 at 2:19 PM, Richard Wallis <[email protected]>
>>>> wrote:
>>>>
>>>>> Actually in defense of adding the optimization to the current api.
>>>>>
>>>>> It can be made safe by only ever setting lastLoopCounter to
>>>>> min(lastLoopCounter + 1, loopCounter).
>>>>>
>>>>> That should cause similar improved performance for multiple second
>>>>> tasks without ever having a lower frame rate than the current scheduler.
>>>>>
>>>>> On Wed, Jan 14, 2015 at 1:41 PM, Richard Wallis <[email protected]>
>>>>> wrote:
>>>>>
>>>>>> You can't use webworkers to process the dom / xml, or do layout which
>>>>>> is pretty much all my long running tasks do.
>>>>>>
>>>>>> Agree this is too dangerous to just add to the existing api but if
>>>>>> you added a new method scheduleConstantTime() that ran the optimization 
>>>>>> it
>>>>>> might be useful.
>>>>>>
>>>>>>
>>>>>> On Wed, Jan 14, 2015 at 1:27 PM, 'Daniel Kurka' via GWT Contributors
>>>>>> <[email protected]> wrote:
>>>>>>
>>>>>>> I think we do not want to make any assumptions about runtime of any
>>>>>>> tasks since this would not work well with task that have variable 
>>>>>>> runtime.
>>>>>>>
>>>>>>> If you need to do heavy calculations since browser APIs have evolved
>>>>>>> a lot you should be using web workers anyway.
>>>>>>>
>>>>>>> On Wed, Jan 14, 2015 at 11:57 AM, Richard Wallis <[email protected]
>>>>>>> > wrote:
>>>>>>>
>>>>>>>> At the moment, incremental scheduler runs a repeating task in a
>>>>>>>> while loop that checks if its duration has exceeded 16ms and then 
>>>>>>>> returns
>>>>>>>> control to the browser.
>>>>>>>>
>>>>>>>> If you assume that an incrementally scheduled task will tend to run
>>>>>>>> in about the same time as it did before then you can get about a 10% 
>>>>>>>> speed
>>>>>>>> up by counting the number of times the task ran during the last 
>>>>>>>> duration
>>>>>>>> loop and then running the task that many times at the start (and 
>>>>>>>> skipping
>>>>>>>> the duration check).
>>>>>>>>
>>>>>>>> On chrome a task that calculated the fibonacci sequence managed to
>>>>>>>> calculate about 450000 numbers in a second with the current scheduler 
>>>>>>>> and
>>>>>>>> about 500000 numbers in the same time with my new one below.
>>>>>>>>
>>>>>>>> And a realworld task that parses xml dropped from taking about 50
>>>>>>>> seconds each run to 42 seconds.
>>>>>>>>
>>>>>>>> Of course if the incrementally scheduled task tends to take a
>>>>>>>> longer and longer time to complete on each run the oprimization might 
>>>>>>>> cause
>>>>>>>> issues so maybe we need to create a new kind of task scheduler 
>>>>>>>> specifically
>>>>>>>> for tasks that tend to complete their runs in a similar timeframe.
>>>>>>>>
>>>>>>>> I'm looking for critiscim of the code below, (and maybe someone to
>>>>>>>> take ownership of this and do a PR to gerrit on my behalf)
>>>>>>>>
>>>>>>>> In SchedulerImpl replace the current runRepeatingTasks method with
>>>>>>>> this:  (lastLoopCount is a private int field);
>>>>>>>>
>>>>>>>>   /**
>>>>>>>>    * Execute a list of Tasks that hold RepeatingCommands.
>>>>>>>>    *
>>>>>>>>    * @return A replacement array that is possibly a shorter copy of
>>>>>>>> <code>tasks</code>
>>>>>>>>    */
>>>>>>>>   private JsArray<Task> runRepeatingTasks(JsArray<Task> tasks) {
>>>>>>>>     assert tasks != null : "tasks";
>>>>>>>>
>>>>>>>>     int length = tasks.length();
>>>>>>>>     if (length == 0) {
>>>>>>>>       return null;
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     boolean canceledSomeTasks = false;
>>>>>>>>
>>>>>>>>     Duration duration = createDuration();
>>>>>>>>     int loopCount = 0;
>>>>>>>>     outer: while (duration.elapsedMillis() < TIME_SLICE) {
>>>>>>>>
>>>>>>>>         if (length == 1) {
>>>>>>>>             while (lastLoopCount-- > 0 ) {
>>>>>>>>                  if (!tasks.get(0).executeRepeating()) {
>>>>>>>>                       tasks.set(0, null);
>>>>>>>>                       canceledSomeTasks = true;
>>>>>>>>                       break outer;
>>>>>>>>                  }
>>>>>>>>                  loopCount += 1;
>>>>>>>>             }
>>>>>>>>         }
>>>>>>>>       boolean executedSomeTask = false;
>>>>>>>>       for (int i = 0; i < length; i++) {
>>>>>>>>         assert tasks.length() == length : "Working array length
>>>>>>>> changed " + tasks.length() + " != "
>>>>>>>>             + length;
>>>>>>>>         Task t = tasks.get(i);
>>>>>>>>         if (t == null) {
>>>>>>>>           continue;
>>>>>>>>         }
>>>>>>>>         executedSomeTask = true;
>>>>>>>>
>>>>>>>>         assert t.isRepeating() : "Found a non-repeating Task";
>>>>>>>>
>>>>>>>>         if (!t.executeRepeating()) {
>>>>>>>>           tasks.set(i, null);
>>>>>>>>           canceledSomeTasks = true;
>>>>>>>>         }
>>>>>>>>         loopCount += 1;
>>>>>>>>       }
>>>>>>>>       if (!executedSomeTask) {
>>>>>>>>         // no work left to do, break to avoid busy waiting until
>>>>>>>> TIME_SLICE is reached
>>>>>>>>         break;
>>>>>>>>       }
>>>>>>>>     }
>>>>>>>>     if (length == 1) {
>>>>>>>>         lastLoopCount = loopCount;
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     if (canceledSomeTasks) {
>>>>>>>>         lastLoopCount = 0;
>>>>>>>>       JsArray<Task> newTasks = createQueue();
>>>>>>>>       // Remove tombstones
>>>>>>>>       for (int i = 0; i < length; i++) {
>>>>>>>>         if (tasks.get(i) != null) {
>>>>>>>>           newTasks.push(tasks.get(i));
>>>>>>>>         }
>>>>>>>>       }
>>>>>>>>       assert newTasks.length() < length;
>>>>>>>>       return newTasks.length() == 0 ? null : newTasks;
>>>>>>>>     } else {
>>>>>>>>       return tasks;
>>>>>>>>     }
>>>>>>>>   }
>>>>>>>>
>>>>>>>> --
>>>>>>>> You received this message because you are subscribed to the Google
>>>>>>>> Groups "GWT Contributors" group.
>>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>>> send an email to google-web-toolkit-contributors+unsubscribe@
>>>>>>>> googlegroups.com.
>>>>>>>> To view this discussion on the web visit
>>>>>>>> https://groups.google.com/d/msgid/google-web-toolkit-
>>>>>>>> contributors/80297aa7-c49a-4e3b-b70a-554bfaef52f0%
>>>>>>>> 40googlegroups.com
>>>>>>>> <https://groups.google.com/d/msgid/google-web-toolkit-contributors/80297aa7-c49a-4e3b-b70a-554bfaef52f0%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>>> .
>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Google Germany GmbH
>>>>>>> *Dienerstr. 12*
>>>>>>> *80331 München*
>>>>>>>
>>>>>>> Registergericht und -nummer: Hamburg, HRB 86891
>>>>>>> Sitz der Gesellschaft: Hamburg
>>>>>>> Geschäftsführer: Graham Law, Katherine Stephens
>>>>>>>
>>>>>>> --
>>>>>>> You received this message because you are subscribed to the Google
>>>>>>> Groups "GWT Contributors" group.
>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>> send an email to google-web-toolkit-contributors+unsubscribe@
>>>>>>> googlegroups.com.
>>>>>>> To view this discussion on the web visit
>>>>>>> https://groups.google.com/d/msgid/google-web-toolkit-contributors/
>>>>>>> CALLujipuOFMxCnLjdM_FER4n3-eAHPEWUQGf3AZENR_ezq255A%40mail.gmail.com
>>>>>>> <https://groups.google.com/d/msgid/google-web-toolkit-contributors/CALLujipuOFMxCnLjdM_FER4n3-eAHPEWUQGf3AZENR_ezq255A%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>>>> .
>>>>>>>
>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>  --
>>> You received this message because you are subscribed to the Google
>>> Groups "GWT Contributors" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected]
>>> .
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/google-web-toolkit-contributors/26df3965-32f3-482d-a3e5-a7bba432d427%40googlegroups.com
>>> <https://groups.google.com/d/msgid/google-web-toolkit-contributors/26df3965-32f3-482d-a3e5-a7bba432d427%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>
>

-- 
You received this message because you are subscribed to the Google Groups "GWT 
Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/google-web-toolkit-contributors/CAEqaEVhMb%2BMgoE%2B25nz3E-pa2qRb5cuhvvKgaMPXz%3D_wvRYo9A%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to