> > 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/CAEqaEVgN%2BkNLEzT42UexwX5wtshiDxQrJaoaX%3DUwa2H%2B2P9LdA%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
