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 [email protected].
>> 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 [email protected].
> 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/CAEqaEViFOJ_JPtUpwxSj%2BkzR4xdtNqTGfi%2BeQ_yuiigiv9Y0vA%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to