On 2/25/12 10:42 AM, "Michael A. Labriola" <labri...@digitalprimates.net>
wrote:

>> The current implementation is that all tags are encoded into an array that
>> gets interpreted during a method call in the lifecycle of the container so it
>> can be intercepted or the array can be modified up front.  There are >plans
>> for an API for manipulating the array.  It turned out to be much faster to
>> read the array than a data structure.
> 
>> But it is just a stake in the ground and can certainly be changed.
> 
> Alex,
> 
> Is it possible for you to discuss this more here without violating NDAs, etc.
> with Adobe. To be very clear, I am currently working on the research before
> implementing a series of compiler changes geared toward run-time performance
> gains for the framework. I also plan on implementing several features that I
> have wanted for a while. To that end, I will soon be addressing the way the
> code gen occurs from MXML as this is a pain point for me. I am hoping to get
> some of the thoughts you have already on this.
I will check with my legal advisors on whether I can just copy a
spec/proposal I had written up, but basically, the data I have is that the
method currently generated for a tag turns out to be much faster than I
would have guessed.  I expected the cost of verify-and-jit for each of the
methods which only get used once would be easy to recover.  It turned out
that the cost of working with a data structure is even more expensive even
though you should be gaining advantages of re-using the verify-and-jit.

For example, if you have N methods that look something like this:

 function method1()
 {
    var foo:Button = new Button();
    foo.someProperty = someValue;
    foo.setStyle("someStyleProperty", someStyleValue);
    addChild(foo);
 }
 function method2()
 {
    var foo:Label = new Label();
    foo.someOtherProperty = someOtherValue;
    foo.setStyle("someOtherStyleProperty", someOtherStyleValue);
    addChild(foo);
 }
    
You might want to run them through a data-driven loop:

    var childData:Array = [
        { clazz: Button,
            properties: [ "someProperty" ];
            propertyValues: [ someValue ];
            styles: [ "someStyleProperty" ];
            styleValues: [ someStyleValue ];
        },  
        { clazz: Label,
            properties: [ "someOtherProperty" ];
            propertyValues: [ someOtherValue ];
            styles: [ "someOtherStyleProperty" ];
            styleValues: [ someOtherStyleValue ];
        },
        ];

    for (var index:int = 0; index < childData.length; index++)
    {
        var childInfo:Object = childData[index];
        var foo:UIComponent = new childInfo.clazz();
        if (childInfo.properties)
            for (var j:int = 0; j < childInfo.properties.length; j++)
                foo[childInfo.properties[j]] = childInfo.propertyValues[j];
        if (childInfo.styles)
            for (var j:int = 0; j < childInfo.styles.length; j++)
                foo.setStyle(childInfo.styles[j], childInfo.styleValues[j]);
    }  

But I was unable to find something that was faster and still looked like a
data structure.  I did the usual optimizations of loops, local variables,
class definitions instead of just Object, etc.  I think one of the issues is
the cost of setting up the data structure.

What is as fast as the methods is a single array of encoded data with a loop
that decodes it.  So, you might pack everything in an array like this:

    [ Button, "someProperty", someValue, null, "someStyleProperty",
someStyleValue, null, Label, "someOtherProperty", someOtherValue, null,
"someOtherStyleProperty", someOtherStyleValue"];

You can play around with using null as a delimiter between properties and
styles or putting in the number of properties and styles or whatever, but I
think this is fast because the array setup time is much faster than data
structure setup time, and then you get to leverage the verify-and-jit.



-- 
Alex Harui
Flex SDK Team
Adobe Systems, Inc.
http://blogs.adobe.com/aharui

Reply via email to