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.
