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
>>>> [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/CAEqaEVjuFM0dP4NT3S53swNZXa661%2BZuM56-2u%3DyOu-LFoNCcg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to