Matt, I created a Wave "Advanced GWT Compiler Optimizations" and invited you to it. Anyone who sends me their sandbox ID, I will invite. I am using it to collect non-trivial optimizations in an outline draft where we can discuss them. As a first pass, I entered the idea of Hybrid-SSA/Tree-SSA/Expression-only SSA with examples of how it can be used to do better block level optimization.
-Ray On Mon, Jun 15, 2009 at 7:09 PM, Matt Mastracci<matt...@mastracci.com> wrote: > > I do as well - I'm mmastrac. > > On 15-Jun-09, at 8:02 PM, Ray Cromwell wrote: > >> >> I do, cromwellian is my id on the sandbox. >> >> -Ray >> >> >> On Mon, Jun 15, 2009 at 6:14 PM, Bruce Johnson<br...@google.com> >> wrote: >>> I'm starting to make a bit o' progress on this. I'll send out a >>> design doc >>> "real soon now". >>> >>> BTW, anyone on the Contributors list here have Wave sandbox >>> accounts? Sure >>> would be easier to discuss this in a wave... >>> >>> On Mon, Jun 15, 2009 at 7:54 PM, Stefan Haustein >>> <haust...@google.com> >>> wrote: >>>> >>>> Ray, >>>> >>>> I think we can improve the class over time -- any reasonable >>>> starting >>>> point (even without iterators or with non-optimal iterators) would >>>> help >>>> significantly. >>>> >>>> Stefan >>>> >>>> On Sat, Jun 13, 2009 at 4:21 AM, Ray Cromwell >>>> <cromwell...@gmail.com> >>>> wrote: >>>>> >>>>> BTW, the last proposal is very unsafe with some form of escape >>>>> analysis since it is unsafe to pass references to classes which >>>>> reference local scope to other scopes. Another possibility is a >>>>> form >>>>> of 'destructuring' of Iterator classes by inlining them completely >>>>> into local scope vs escape analysis and then forgoing separate >>>>> construction. >>>>> >>>>> A simpler way to maintain for-each with JRE collections without >>>>> creating objects is to change the way that for-each deals with >>>>> Iterable<T> when T is a List. >>>>> >>>>> The compiler could change: >>>>> for(T x : foo) { ... } >>>>> >>>>> where foo is a List<T> >>>>> >>>>> into >>>>> >>>>> for(int i=0; i<foo.size(); ++i) { >>>>> T x = foo.get(i); >>>>> } >>>>> >>>>> instead of calling foo.iterator() and using Iterator methods. >>>>> >>>>> -Ray >>>>> >>>>> On Fri, Jun 12, 2009 at 7:31 PM, Ray >>>>> Cromwell<cromwell...@gmail.com> >>>>> wrote: >>>>>> I'm in the process of some final tweaks on GQuery, so I'll look >>>>>> at how >>>>>> much of my private JSArray class I can move over as a patch. >>>>>> >>>>>> One possibility for avoiding Iterator object creation without >>>>>> using >>>>>> flyweights is to introduce a new Iterator type which contains >>>>>> methods >>>>>> which are parameterized by the collection and which use my >>>>>> Extension >>>>>> Method/Category method JSO trick. >>>>>> >>>>>> public class FastIterator<T> extends JavaScriptObject { >>>>>> protected FastIterator() {} >>>>>> public <S, T extends List<S>> FastIterator<S> make(T<S> list) { >>>>>> return (FastIterator<S>)(GWT.isScript() ? makeWeb() : >>>>>> makeHosted()); >>>>>> } >>>>>> >>>>>> private final native FastIterator makeWeb() /*-{ >>>>>> return 0; >>>>>> }-*/; >>>>>> >>>>>> private final native FastIterator makeHosted() /*-{ >>>>>> return [0]; >>>>>> }-*/; >>>>>> >>>>>> public final int value() { >>>>>> return GWT.isScript() ? valueWeb() : valueHosted(); >>>>>> } >>>>>> >>>>>> public native int valueWeb() /*-{ >>>>>> return this; >>>>>> }-*/; >>>>>> >>>>>> public native int valueHosted() /*-{ >>>>>> return this[0]; >>>>>> }-*/; >>>>>> >>>>>> public native hasNext(List<T> list) { >>>>>> return value() < list.size(); >>>>>> } >>>>>> >>>>>> public native T next(List<T> list) { >>>>>> return list.get(value()++); // unsure if using value() as >>>>>> rvalue >>>>>> will work here >>>>>> } >>>>>> } >>>>>> >>>>>> then you should be able to write code like >>>>>> >>>>>> List<String> foo = getList(); >>>>>> FastIterator<String> iter = FastIterator.make(foo); >>>>>> >>>>>> while(iter.hasNext(foo)) { >>>>>> String s = iter.next(foo); >>>>>> } >>>>>> >>>>>> Why doesn't this create any additional objects? Because >>>>>> 'iter'/FastIterator is actually a native JS number/scalar type, >>>>>> and >>>>>> what this is really doing is simulating the addition of >>>>>> hasNext()/next() to the number's prototype. >>>>>> >>>>>> We could dispense with the need for an additional parameter if >>>>>> GWT had >>>>>> a magic method for allocating new local variables/symbols in the >>>>>> local >>>>>> scope. Imagine if writing >>>>>> >>>>>> Variable<T> x = GWT.createVariable(0); >>>>>> >>>>>> was a magic method that just generated a 'var x = 0' >>>>>> declaration, only >>>>>> it promised to always be inlined and do so in the caller's scope. >>>>>> 'Variable' would be a magic class that never creates fields on the >>>>>> actual object themselves and are pruned/removed at runtime. >>>>>> >>>>>> Then you could have FastIterator impersonate a reference to the >>>>>> underlying List<T>, and rewrite hasNext()/next() as: >>>>>> >>>>>> VariableInt x = GWT.createVariableInt(0); >>>>>> public boolean hasNext() { >>>>>> return x.get() < this.size(); >>>>>> } >>>>>> >>>>>> public T next() { >>>>>> return this.get(x.get()++); // or x.postIncrement() >>>>>> } >>>>>> >>>>>> this would produce code that would create no additional objects as >>>>>> well as maintain Iterator-like interface. >>>>>> >>>>>> -Ray >>>>>> >>>>>> >>>>>> On Thu, Jun 11, 2009 at 7:25 AM, Stefan Haustein<haust...@google.com >>>>>> > >>>>>> wrote: >>>>>>> +1 Ray >>>>>>> Could you contribute your implementation(s)? >>>>>>> >>>>>>> On Thu, Jun 11, 2009 at 12:51 PM, Joel Webber <j...@google.com> >>>>>>> wrote: >>>>>>>> >>>>>>>> +1 Ray. Now here's the really tricky question. Is there any >>>>>>>> way we >>>>>>>> can >>>>>>>> take advantage of Javascript's "for (x in y) { ... }" syntax >>>>>>>> (and >>>>>>>> should we, >>>>>>>> given its spotty performance)? My intuition tells me that the >>>>>>>> only >>>>>>>> way we >>>>>>>> could use it would be through a callback, because there's >>>>>>>> nothing >>>>>>>> like .NET >>>>>>>> generators/yield in Javascript. >>>>>>>> On Wed, Jun 10, 2009 at 7:26 PM, Ray Cromwell <cromwell...@gmail.com >>>>>>>> > >>>>>>>> wrote: >>>>>>>>> >>>>>>>>> My take on this is that there is many places where I'd like >>>>>>>>> to avoid >>>>>>>>> JRE collections, but the basic JsArray is too much of a >>>>>>>>> downgrade. I >>>>>>>>> don't mind changing it to <T> if it doesn't effect >>>>>>>>> performance cause >>>>>>>>> then I could subclass it, but as an example of the stuff I >>>>>>>>> would >>>>>>>>> like >>>>>>>>> in a 'FastArrayList' that is not a collections derivative: >>>>>>>>> >>>>>>>>> 1) add() instead of just set(length(), item) (e.g. push) >>>>>>>>> 2) addAll(anotherFastArrayList) (e.g. concat) >>>>>>>>> 3) splice >>>>>>>>> 4) toArray() (webmode is reinterpret cast op) >>>>>>>>> 5) remove >>>>>>>>> 6) shift/unshift (useful for queue when combined with pop) >>>>>>>>> >>>>>>>>> I use the following pattern all over GQuery to avoid JRE >>>>>>>>> collections >>>>>>>>> but preserve for-each >>>>>>>>> >>>>>>>>> for(Foo f : fooList.elements()) { ... } >>>>>>>>> >>>>>>>>> where fooList is my own JsArray<T> class, and elements() >>>>>>>>> returns T[] >>>>>>>>> via reinterpret cast in webmode. >>>>>>>>> >>>>>>>>> -Ray >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On Thu, Jun 11, 2009 at 2:43 AM, Lex Spoon<sp...@google.com> >>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>> Bah, mis-send. What I was typing was: >>>>>>>>>> >>>>>>>>>> >>>>>>>>>>> I though the point was to get rid of JRE collections? >>>>>>>>>>> Anyway, >>>>>>>>>>> the >>>>>>>>>>> collection in question is used as a queue. I would hate to >>>>>>>>>>> see >>>>>>>>>>> its >>>>>>>>>>> performance get worse when there' >>>>>>>>>> >>>>>>>>>> ...when there's a known, straightforward alternative, and when >>>>>>>>>> that >>>>>>>>>> alternative provides a class people have been wanting for >>>>>>>>>> separate >>>>>>>>>> purposes. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Lex >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>>>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Stefan Haustein >>>>>>> Google UK Limited >>>>>>> >>>>>>> Registered Office: Belgrave House, 76 Buckingham Palace Road, >>>>>>> London >>>>>>> SW1W >>>>>>> 9TQ; Registered in England Number: 3977902 >>>>>>> >>>>>>> >>>>>> >>>> >>>> >>>> >>>> -- >>>> Stefan Haustein >>>> Google UK Limited >>>> >>>> Registered Office: Belgrave House, 76 Buckingham Palace Road, >>>> London SW1W >>>> 9TQ; Registered in England Number: 3977902 >>>> >>> >>> >> >> > > > > > > --~--~---------~--~----~------------~-------~--~----~ http://groups.google.com/group/Google-Web-Toolkit-Contributors -~----------~----~----~----~------~----~------~--~---