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.
