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/CAEqaEVj9__qvWCu1_rhwdEHggDncr0ZOUTOBudCCk%3D0B8G-AEg%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
