You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@flex.apache.org by Alex Harui <ah...@adobe.com> on 2013/11/04 18:57:48 UTC

Re: git commit: [flex-sdk] [refs/heads/develop] - FIX - FLEX-33865 ConstraintLayout optimization

Just thinking:  I know you've spent a lot of time on this (and thanks for
doing so), but is Array really being used just to pass two values?  I
wonder if it would be better to use Point.

On 11/4/13 12:55 AM, "mamsellem@apache.org" <ma...@apache.org> wrote:

>Updated Branches:
>  refs/heads/develop 5c9baf119 -> 7cab71bb2
>
>
>FIX - FLEX-33865 ConstraintLayout optimization
>
>
>Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo
>Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/7cab71bb
>Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/7cab71bb
>Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/7cab71bb
>
>Branch: refs/heads/develop
>Commit: 7cab71bb2192390dceaa4cc4c07eb45f49a4f5c7
>Parents: 5c9baf1
>Author: mamsellem <ma...@systar.com>
>Authored: Mon Nov 4 09:52:05 2013 +0100
>Committer: mamsellem <ma...@systar.com>
>Committed: Mon Nov 4 09:52:05 2013 +0100
>
>----------------------------------------------------------------------
> .../spark/src/spark/layouts/ConstraintLayout.as | 17 ++---
> .../supportClasses/LayoutElementHelper.as       | 78 ++++++++++++++++----
> 2 files changed, 72 insertions(+), 23 deletions(-)
>----------------------------------------------------------------------
>
>
>http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/7cab71bb/frameworks/p
>rojects/spark/src/spark/layouts/ConstraintLayout.as
>----------------------------------------------------------------------
>diff --git 
>a/frameworks/projects/spark/src/spark/layouts/ConstraintLayout.as
>b/frameworks/projects/spark/src/spark/layouts/ConstraintLayout.as
>index c7d47a6..60ef4cd 100644
>--- a/frameworks/projects/spark/src/spark/layouts/ConstraintLayout.as
>+++ b/frameworks/projects/spark/src/spark/layouts/ConstraintLayout.as
>@@ -605,7 +605,7 @@ public class ConstraintLayout extends LayoutBase
>         if (value == null)
>             return;
>         
>-        var constraintColumns:Vector.<ConstraintColumn> =
>this.constraintColumns;
>+        var constraintColumns:Vector.<ConstraintColumn> =
>this._constraintColumns;
>         var numCols:int = constraintColumns.length;
>         var totalWidth:Number = 0;
>         
>@@ -626,7 +626,7 @@ public class ConstraintLayout extends LayoutBase
>         if (value == null)
>             return;
>         
>-        var constraintRows:Vector.<ConstraintRow> = this.constraintRows;
>+        var constraintRows:Vector.<ConstraintRow> = this._constraintRows;
>         var numRows:int = constraintRows.length;
>         var totalHeight:Number = 0;
>         
>@@ -1669,24 +1669,23 @@ public class ConstraintLayout extends LayoutBase
>         
>         var message:String;
>         
>-        var temp:Array;
>-        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.left);
>+        var temp:Array =
>LayoutElementHelper.parseConstraintExp(layoutElement.left);
>         left = temp[0];
>         leftBoundary = temp[1];
>         
>-        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.right);
>+        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.right, temp);
>         right = temp[0];
>         rightBoundary = temp[1];
>         
>-        temp = LayoutElementHelper.parseConstraintExp(layoutElement.top);
>+        temp = LayoutElementHelper.parseConstraintExp(layoutElement.top,
>temp);
>         top = temp[0];
>         topBoundary = temp[1];
>         
>-        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.bottom);
>+        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.bottom, temp);
>         bottom = temp[0];
>         bottomBoundary = temp[1];
>         
>-        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.baseline);
>+        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.baseline, temp);
>         baseline = temp[0];
>         baselineBoundary = temp[1];
>         
>@@ -1938,4 +1937,4 @@ import mx.containers.utilityClasses.FlexChildInfo;
> class ConstraintRegionFlexChildInfo extends FlexChildInfo
> {
>     public var index:int
>-}
>\ No newline at end of file
>+}
>
>http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/7cab71bb/frameworks/p
>rojects/spark/src/spark/layouts/supportClasses/LayoutElementHelper.as
>----------------------------------------------------------------------
>diff --git 
>a/frameworks/projects/spark/src/spark/layouts/supportClasses/LayoutElement
>Helper.as 
>b/frameworks/projects/spark/src/spark/layouts/supportClasses/LayoutElement
>Helper.as
>index baab217..d8eac93 100644
>--- 
>a/frameworks/projects/spark/src/spark/layouts/supportClasses/LayoutElement
>Helper.as
>+++ 
>b/frameworks/projects/spark/src/spark/layouts/supportClasses/LayoutElement
>Helper.as
>@@ -19,6 +19,7 @@
> 
> package spark.layouts.supportClasses
> {
>+import mx.utils.StringUtil;
> 
> [ExcludeClass]
> 
>@@ -79,28 +80,77 @@ public class LayoutElementHelper
>      *  so that an array is returned where the first value is
>      *  the offset (ie: 10) and the second value is
>      *  the boundary (ie: "col1")
>+     *  @arg result :  optional Array to save an Array memory allocation
>      */
>-    public static function parseConstraintExp(val:Object):Array
>+    public static function parseConstraintExp(val:Object,
>result:Array=null):Array
>     {
>-        if (val is Number)
>-            return [Number(val), null];
>-        
>-        if (!val)
>-            return [NaN, null];
>-        // Replace colons with spaces
>-        var temp:String = String(val).replace(/:/g, " ");
>-        
>-        // Split the string into an array
>-        var args:Array = temp.split(/\s+/);
>+        // number
>+        if (val is Number) {
>+            if(result == null) {
>+                return [val as Number, null];
>+            }
>+            else {
>+                result[0] = val as Number;
>+                result[1] = null;
>+                return result;
>+            }
>+        }
>+       // null
>+        if (!val) {
>+            if(result == null) {
>+                return [NaN, null];
>+            }
>+            else {
>+                result[0] = NaN;
>+                result[1] = null;
>+                return result;
>+            }
>+        }
>+
>+        // String case  : 2 sub-cases, number of constraint
>+        var tmp:String = String(val);
>+        var colonPos:int = tmp.indexOf(":");
>         
>         // If the val was a String object representing a single number
>(i.e. "100"),
>         // then we'll hit this case:
>-        if (args.length == 1)
>-            return args;
>+        if(colonPos == -1) {
>+            return [StringUtil.trim(tmp)];
>+        }
>         
>         // Return [offset, boundary]
>-        return [args[1], args[0]];
>+        if(result == null) {
>+            result =[];
>+        }
>+        
>+        //here we do not use StringUtil in order to avoid unnecessary
>memory allocations
>+        var startIndex:int = 0;
>+        while (StringUtil.isWhitespace(tmp.charAt(startIndex))) {
>+            ++startIndex;
>+        }
>+        
>+        var endIndex:int = tmp.length - 1;
>+        while (StringUtil.isWhitespace(tmp.charAt(endIndex) )) {
>+            --endIndex;
>+        }
>+        
>+        var endIndexPart1:int = colonPos-1;
>+        while (StringUtil.isWhitespace(tmp.charAt(endIndexPart1))) {
>+            --endIndexPart1;
>+        }
>+        
>+        var startIndexPart2:int = colonPos+1;
>+        while (StringUtil.isWhitespace(tmp.charAt(startIndexPart2))) {
>+            ++startIndexPart2;
>+        }
>+        
>+        result[0] = tmp.substring(startIndexPart2, endIndex+1);
>+        result[1] = tmp.substring(startIndex, endIndexPart1+1);
>+        
>+        return result;
>     }
>+
>+
>+
> }
> 
> }
>


Re: git commit: [flex-sdk] [refs/heads/develop] - FIX - FLEX-33865 ConstraintLayout optimization

Posted by Alex Harui <ah...@adobe.com>.
I don't think there is any official public availability of "internals".
Some stuff is found on blogs, but may be stale, and the AVM code is
somewhere on Mozilla although I couldn't find it the other day.

-Alex

On 11/4/13 11:56 AM, "Maurice Amsellem" <ma...@systar.com>
wrote:

>That's interesting.
>
>Do you know where we can find reading on Adobe Flash internals, if any
>? 
>
>Maurice 
>
>-----Message d'origine-----
>De : Alex Harui [mailto:aharui@adobe.com]
>Envoyé : lundi 4 novembre 2013 20:46
>À : dev@flex.apache.org
>Objet : Re: git commit: [flex-sdk] [refs/heads/develop] - FIX -
>FLEX-33865 ConstraintLayout optimization
>
>
>
>On 11/4/13 10:13 AM, "Maurice Amsellem" <ma...@systar.com>
>wrote:
>
>>Alex, to be honest, the last "split" tests I did ( code optimization
>>only and  code optimization + Array recycling) show that the bulk of
>>the performance gain (10%) comes from the use of indexOf(..) to detect
>>that we are in a simple "Number case", instead of split+replace which
>>is very costly.
>>
>>All the rest (Array recycling, inlined code, etc...) induces a marginal
>>improvement of 1%.
>>
>>However, I would prefer not to spent time on this issue anymore.
>That's totally fine.  My recollection is that Array is slow, defaults to
>allocating 10 slots and [] lookups aren't all that fast. But no worries,
>it's not that important, I'm just putting it out there in case someone
>does have time.
>
>-Alex
>


RE: git commit: [flex-sdk] [refs/heads/develop] - FIX - FLEX-33865 ConstraintLayout optimization

Posted by Maurice Amsellem <ma...@systar.com>.
That's interesting.

Do you know where we can find reading on Adobe Flash internals, if any   ? 

Maurice 

-----Message d'origine-----
De : Alex Harui [mailto:aharui@adobe.com] 
Envoyé : lundi 4 novembre 2013 20:46
À : dev@flex.apache.org
Objet : Re: git commit: [flex-sdk] [refs/heads/develop] - FIX - FLEX-33865 ConstraintLayout optimization



On 11/4/13 10:13 AM, "Maurice Amsellem" <ma...@systar.com>
wrote:

>Alex, to be honest, the last "split" tests I did ( code optimization 
>only and  code optimization + Array recycling) show that the bulk of 
>the performance gain (10%) comes from the use of indexOf(..) to detect 
>that we are in a simple "Number case", instead of split+replace which 
>is very costly.
>
>All the rest (Array recycling, inlined code, etc...) induces a marginal 
>improvement of 1%.
>
>However, I would prefer not to spent time on this issue anymore.
That's totally fine.  My recollection is that Array is slow, defaults to allocating 10 slots and [] lookups aren't all that fast. But no worries, it's not that important, I'm just putting it out there in case someone does have time.

-Alex


Re: git commit: [flex-sdk] [refs/heads/develop] - FIX - FLEX-33865 ConstraintLayout optimization

Posted by Alex Harui <ah...@adobe.com>.

On 11/4/13 10:13 AM, "Maurice Amsellem" <ma...@systar.com>
wrote:

>Alex, to be honest, the last "split" tests I did ( code optimization only
>and  code optimization + Array recycling) show that the bulk of the
>performance gain (10%) comes from the use of indexOf(..) to detect that
>we are in a simple "Number case", instead of split+replace which is very
>costly.
>
>All the rest (Array recycling, inlined code, etc...) induces a marginal
>improvement of 1%.
>
>However, I would prefer not to spent time on this issue anymore.
That's totally fine.  My recollection is that Array is slow, defaults to
allocating 10 slots and [] lookups aren't all that fast. But no worries,
it's not that important, I'm just putting it out there in case someone
does have time.

-Alex


RE: git commit: [flex-sdk] [refs/heads/develop] - FIX - FLEX-33865 ConstraintLayout optimization

Posted by Maurice Amsellem <ma...@systar.com>.
Alex, to be honest, the last "split" tests I did ( code optimization only and  code optimization + Array recycling) show that the bulk of the performance gain (10%) comes from the use of indexOf(..) to detect that we are in a simple "Number case", instead of split+replace which is very costly.

All the rest (Array recycling, inlined code, etc...) induces a marginal improvement of 1%.

However, I would prefer not to spent time on this issue anymore.

Regards,

Maurice 

-----Message d'origine-----
De : Maurice Amsellem [mailto:maurice.amsellem@systar.com] 
Envoyé : lundi 4 novembre 2013 19:05
À : dev@flex.apache.org; commits@flex.apache.org
Objet : RE: git commit: [flex-sdk] [refs/heads/develop] - FIX - FLEX-33865 ConstraintLayout optimization

Actually, the values are one Number and optionally one String. So I don't think Point could be used.

Maybe a dedicated class ?

Maurice 

-----Message d'origine-----
De : Alex Harui [mailto:aharui@adobe.com] Envoyé : lundi 4 novembre 2013 18:58 À : dev@flex.apache.org; commits@flex.apache.org Objet : Re: git commit: [flex-sdk] [refs/heads/develop] - FIX - FLEX-33865 ConstraintLayout optimization

Just thinking:  I know you've spent a lot of time on this (and thanks for doing so), but is Array really being used just to pass two values?  I wonder if it would be better to use Point.

On 11/4/13 12:55 AM, "mamsellem@apache.org" <ma...@apache.org> wrote:

>Updated Branches:
>  refs/heads/develop 5c9baf119 -> 7cab71bb2
>
>
>FIX - FLEX-33865 ConstraintLayout optimization
>
>
>Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo
>Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/7cab71bb
>Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/7cab71bb
>Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/7cab71bb
>
>Branch: refs/heads/develop
>Commit: 7cab71bb2192390dceaa4cc4c07eb45f49a4f5c7
>Parents: 5c9baf1
>Author: mamsellem <ma...@systar.com>
>Authored: Mon Nov 4 09:52:05 2013 +0100
>Committer: mamsellem <ma...@systar.com>
>Committed: Mon Nov 4 09:52:05 2013 +0100
>
>----------------------------------------------------------------------
> .../spark/src/spark/layouts/ConstraintLayout.as | 17 ++---
> .../supportClasses/LayoutElementHelper.as       | 78 ++++++++++++++++----
> 2 files changed, 72 insertions(+), 23 deletions(-)
>----------------------------------------------------------------------
>
>
>http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/7cab71bb/framework
>s/p rojects/spark/src/spark/layouts/ConstraintLayout.as
>----------------------------------------------------------------------
>diff --git
>a/frameworks/projects/spark/src/spark/layouts/ConstraintLayout.as
>b/frameworks/projects/spark/src/spark/layouts/ConstraintLayout.as
>index c7d47a6..60ef4cd 100644
>--- a/frameworks/projects/spark/src/spark/layouts/ConstraintLayout.as
>+++ b/frameworks/projects/spark/src/spark/layouts/ConstraintLayout.as
>@@ -605,7 +605,7 @@ public class ConstraintLayout extends LayoutBase
>         if (value == null)
>             return;
>         
>-        var constraintColumns:Vector.<ConstraintColumn> =
>this.constraintColumns;
>+        var constraintColumns:Vector.<ConstraintColumn> =
>this._constraintColumns;
>         var numCols:int = constraintColumns.length;
>         var totalWidth:Number = 0;
>         
>@@ -626,7 +626,7 @@ public class ConstraintLayout extends LayoutBase
>         if (value == null)
>             return;
>         
>-        var constraintRows:Vector.<ConstraintRow> = this.constraintRows;
>+        var constraintRows:Vector.<ConstraintRow> = 
>+ this._constraintRows;
>         var numRows:int = constraintRows.length;
>         var totalHeight:Number = 0;
>         
>@@ -1669,24 +1669,23 @@ public class ConstraintLayout extends 
>LayoutBase
>         
>         var message:String;
>         
>-        var temp:Array;
>-        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.left);
>+        var temp:Array =
>LayoutElementHelper.parseConstraintExp(layoutElement.left);
>         left = temp[0];
>         leftBoundary = temp[1];
>         
>-        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.right);
>+        temp =
>LayoutElementHelper.parseConstraintExp(layoutElement.right, temp);
>         right = temp[0];
>         rightBoundary = temp[1];
>         
>-        temp = LayoutElementHelper.parseConstraintExp(layoutElement.top);
>+        temp =
>+ LayoutElementHelper.parseConstraintExp(layoutElement.top,
>temp);
>         top = temp[0];
>         topBoundary = temp[1];
>         
>-        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.bottom);
>+        temp =
>LayoutElementHelper.parseConstraintExp(layoutElement.bottom, temp);
>         bottom = temp[0];
>         bottomBoundary = temp[1];
>         
>-        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.baseline);
>+        temp =
>LayoutElementHelper.parseConstraintExp(layoutElement.baseline, temp);
>         baseline = temp[0];
>         baselineBoundary = temp[1];
>         
>@@ -1938,4 +1937,4 @@ import
>mx.containers.utilityClasses.FlexChildInfo;
> class ConstraintRegionFlexChildInfo extends FlexChildInfo  {
>     public var index:int
>-}
>\ No newline at end of file
>+}
>
>http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/7cab71bb/framework
>s/p
>rojects/spark/src/spark/layouts/supportClasses/LayoutElementHelper.as
>----------------------------------------------------------------------
>diff --git
>a/frameworks/projects/spark/src/spark/layouts/supportClasses/LayoutElem
>ent
>Helper.as
>b/frameworks/projects/spark/src/spark/layouts/supportClasses/LayoutElem
>ent
>Helper.as
>index baab217..d8eac93 100644
>---
>a/frameworks/projects/spark/src/spark/layouts/supportClasses/LayoutElem
>ent
>Helper.as
>+++ 
>b/frameworks/projects/spark/src/spark/layouts/supportClasses/LayoutElem
>ent
>Helper.as
>@@ -19,6 +19,7 @@
> 
> package spark.layouts.supportClasses
> {
>+import mx.utils.StringUtil;
> 
> [ExcludeClass]
> 
>@@ -79,28 +80,77 @@ public class LayoutElementHelper
>      *  so that an array is returned where the first value is
>      *  the offset (ie: 10) and the second value is
>      *  the boundary (ie: "col1")
>+     *  @arg result :  optional Array to save an Array memory 
>+ allocation
>      */
>-    public static function parseConstraintExp(val:Object):Array
>+    public static function parseConstraintExp(val:Object,
>result:Array=null):Array
>     {
>-        if (val is Number)
>-            return [Number(val), null];
>-        
>-        if (!val)
>-            return [NaN, null];
>-        // Replace colons with spaces
>-        var temp:String = String(val).replace(/:/g, " ");
>-        
>-        // Split the string into an array
>-        var args:Array = temp.split(/\s+/);
>+        // number
>+        if (val is Number) {
>+            if(result == null) {
>+                return [val as Number, null];
>+            }
>+            else {
>+                result[0] = val as Number;
>+                result[1] = null;
>+                return result;
>+            }
>+        }
>+       // null
>+        if (!val) {
>+            if(result == null) {
>+                return [NaN, null];
>+            }
>+            else {
>+                result[0] = NaN;
>+                result[1] = null;
>+                return result;
>+            }
>+        }
>+
>+        // String case  : 2 sub-cases, number of constraint
>+        var tmp:String = String(val);
>+        var colonPos:int = tmp.indexOf(":");
>         
>         // If the val was a String object representing a single number 
>(i.e. "100"),
>         // then we'll hit this case:
>-        if (args.length == 1)
>-            return args;
>+        if(colonPos == -1) {
>+            return [StringUtil.trim(tmp)];
>+        }
>         
>         // Return [offset, boundary]
>-        return [args[1], args[0]];
>+        if(result == null) {
>+            result =[];
>+        }
>+        
>+        //here we do not use StringUtil in order to avoid unnecessary
>memory allocations
>+        var startIndex:int = 0;
>+        while (StringUtil.isWhitespace(tmp.charAt(startIndex))) {
>+            ++startIndex;
>+        }
>+        
>+        var endIndex:int = tmp.length - 1;
>+        while (StringUtil.isWhitespace(tmp.charAt(endIndex) )) {
>+            --endIndex;
>+        }
>+        
>+        var endIndexPart1:int = colonPos-1;
>+        while (StringUtil.isWhitespace(tmp.charAt(endIndexPart1))) {
>+            --endIndexPart1;
>+        }
>+        
>+        var startIndexPart2:int = colonPos+1;
>+        while (StringUtil.isWhitespace(tmp.charAt(startIndexPart2))) {
>+            ++startIndexPart2;
>+        }
>+        
>+        result[0] = tmp.substring(startIndexPart2, endIndex+1);
>+        result[1] = tmp.substring(startIndex, endIndexPart1+1);
>+        
>+        return result;
>     }
>+
>+
>+
> }
> 
> }
>


RE: git commit: [flex-sdk] [refs/heads/develop] - FIX - FLEX-33865 ConstraintLayout optimization

Posted by Maurice Amsellem <ma...@systar.com>.
Actually, the values are one Number and optionally one String. So I don't think Point could be used.

Maybe a dedicated class ?

Maurice 

-----Message d'origine-----
De : Alex Harui [mailto:aharui@adobe.com] 
Envoyé : lundi 4 novembre 2013 18:58
À : dev@flex.apache.org; commits@flex.apache.org
Objet : Re: git commit: [flex-sdk] [refs/heads/develop] - FIX - FLEX-33865 ConstraintLayout optimization

Just thinking:  I know you've spent a lot of time on this (and thanks for doing so), but is Array really being used just to pass two values?  I wonder if it would be better to use Point.

On 11/4/13 12:55 AM, "mamsellem@apache.org" <ma...@apache.org> wrote:

>Updated Branches:
>  refs/heads/develop 5c9baf119 -> 7cab71bb2
>
>
>FIX - FLEX-33865 ConstraintLayout optimization
>
>
>Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo
>Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/7cab71bb
>Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/7cab71bb
>Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/7cab71bb
>
>Branch: refs/heads/develop
>Commit: 7cab71bb2192390dceaa4cc4c07eb45f49a4f5c7
>Parents: 5c9baf1
>Author: mamsellem <ma...@systar.com>
>Authored: Mon Nov 4 09:52:05 2013 +0100
>Committer: mamsellem <ma...@systar.com>
>Committed: Mon Nov 4 09:52:05 2013 +0100
>
>----------------------------------------------------------------------
> .../spark/src/spark/layouts/ConstraintLayout.as | 17 ++---
> .../supportClasses/LayoutElementHelper.as       | 78 ++++++++++++++++----
> 2 files changed, 72 insertions(+), 23 deletions(-)
>----------------------------------------------------------------------
>
>
>http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/7cab71bb/framework
>s/p rojects/spark/src/spark/layouts/ConstraintLayout.as
>----------------------------------------------------------------------
>diff --git
>a/frameworks/projects/spark/src/spark/layouts/ConstraintLayout.as
>b/frameworks/projects/spark/src/spark/layouts/ConstraintLayout.as
>index c7d47a6..60ef4cd 100644
>--- a/frameworks/projects/spark/src/spark/layouts/ConstraintLayout.as
>+++ b/frameworks/projects/spark/src/spark/layouts/ConstraintLayout.as
>@@ -605,7 +605,7 @@ public class ConstraintLayout extends LayoutBase
>         if (value == null)
>             return;
>         
>-        var constraintColumns:Vector.<ConstraintColumn> =
>this.constraintColumns;
>+        var constraintColumns:Vector.<ConstraintColumn> =
>this._constraintColumns;
>         var numCols:int = constraintColumns.length;
>         var totalWidth:Number = 0;
>         
>@@ -626,7 +626,7 @@ public class ConstraintLayout extends LayoutBase
>         if (value == null)
>             return;
>         
>-        var constraintRows:Vector.<ConstraintRow> = this.constraintRows;
>+        var constraintRows:Vector.<ConstraintRow> = 
>+ this._constraintRows;
>         var numRows:int = constraintRows.length;
>         var totalHeight:Number = 0;
>         
>@@ -1669,24 +1669,23 @@ public class ConstraintLayout extends 
>LayoutBase
>         
>         var message:String;
>         
>-        var temp:Array;
>-        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.left);
>+        var temp:Array =
>LayoutElementHelper.parseConstraintExp(layoutElement.left);
>         left = temp[0];
>         leftBoundary = temp[1];
>         
>-        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.right);
>+        temp =
>LayoutElementHelper.parseConstraintExp(layoutElement.right, temp);
>         right = temp[0];
>         rightBoundary = temp[1];
>         
>-        temp = LayoutElementHelper.parseConstraintExp(layoutElement.top);
>+        temp = 
>+ LayoutElementHelper.parseConstraintExp(layoutElement.top,
>temp);
>         top = temp[0];
>         topBoundary = temp[1];
>         
>-        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.bottom);
>+        temp =
>LayoutElementHelper.parseConstraintExp(layoutElement.bottom, temp);
>         bottom = temp[0];
>         bottomBoundary = temp[1];
>         
>-        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.baseline);
>+        temp =
>LayoutElementHelper.parseConstraintExp(layoutElement.baseline, temp);
>         baseline = temp[0];
>         baselineBoundary = temp[1];
>         
>@@ -1938,4 +1937,4 @@ import 
>mx.containers.utilityClasses.FlexChildInfo;
> class ConstraintRegionFlexChildInfo extends FlexChildInfo  {
>     public var index:int
>-}
>\ No newline at end of file
>+}
>
>http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/7cab71bb/framework
>s/p 
>rojects/spark/src/spark/layouts/supportClasses/LayoutElementHelper.as
>----------------------------------------------------------------------
>diff --git
>a/frameworks/projects/spark/src/spark/layouts/supportClasses/LayoutElem
>ent
>Helper.as
>b/frameworks/projects/spark/src/spark/layouts/supportClasses/LayoutElem
>ent
>Helper.as
>index baab217..d8eac93 100644
>---
>a/frameworks/projects/spark/src/spark/layouts/supportClasses/LayoutElem
>ent
>Helper.as
>+++ 
>b/frameworks/projects/spark/src/spark/layouts/supportClasses/LayoutElem
>ent
>Helper.as
>@@ -19,6 +19,7 @@
> 
> package spark.layouts.supportClasses
> {
>+import mx.utils.StringUtil;
> 
> [ExcludeClass]
> 
>@@ -79,28 +80,77 @@ public class LayoutElementHelper
>      *  so that an array is returned where the first value is
>      *  the offset (ie: 10) and the second value is
>      *  the boundary (ie: "col1")
>+     *  @arg result :  optional Array to save an Array memory 
>+ allocation
>      */
>-    public static function parseConstraintExp(val:Object):Array
>+    public static function parseConstraintExp(val:Object,
>result:Array=null):Array
>     {
>-        if (val is Number)
>-            return [Number(val), null];
>-        
>-        if (!val)
>-            return [NaN, null];
>-        // Replace colons with spaces
>-        var temp:String = String(val).replace(/:/g, " ");
>-        
>-        // Split the string into an array
>-        var args:Array = temp.split(/\s+/);
>+        // number
>+        if (val is Number) {
>+            if(result == null) {
>+                return [val as Number, null];
>+            }
>+            else {
>+                result[0] = val as Number;
>+                result[1] = null;
>+                return result;
>+            }
>+        }
>+       // null
>+        if (!val) {
>+            if(result == null) {
>+                return [NaN, null];
>+            }
>+            else {
>+                result[0] = NaN;
>+                result[1] = null;
>+                return result;
>+            }
>+        }
>+
>+        // String case  : 2 sub-cases, number of constraint
>+        var tmp:String = String(val);
>+        var colonPos:int = tmp.indexOf(":");
>         
>         // If the val was a String object representing a single number 
>(i.e. "100"),
>         // then we'll hit this case:
>-        if (args.length == 1)
>-            return args;
>+        if(colonPos == -1) {
>+            return [StringUtil.trim(tmp)];
>+        }
>         
>         // Return [offset, boundary]
>-        return [args[1], args[0]];
>+        if(result == null) {
>+            result =[];
>+        }
>+        
>+        //here we do not use StringUtil in order to avoid unnecessary
>memory allocations
>+        var startIndex:int = 0;
>+        while (StringUtil.isWhitespace(tmp.charAt(startIndex))) {
>+            ++startIndex;
>+        }
>+        
>+        var endIndex:int = tmp.length - 1;
>+        while (StringUtil.isWhitespace(tmp.charAt(endIndex) )) {
>+            --endIndex;
>+        }
>+        
>+        var endIndexPart1:int = colonPos-1;
>+        while (StringUtil.isWhitespace(tmp.charAt(endIndexPart1))) {
>+            --endIndexPart1;
>+        }
>+        
>+        var startIndexPart2:int = colonPos+1;
>+        while (StringUtil.isWhitespace(tmp.charAt(startIndexPart2))) {
>+            ++startIndexPart2;
>+        }
>+        
>+        result[0] = tmp.substring(startIndexPart2, endIndex+1);
>+        result[1] = tmp.substring(startIndex, endIndexPart1+1);
>+        
>+        return result;
>     }
>+
>+
>+
> }
> 
> }
>


RE: git commit: [flex-sdk] [refs/heads/develop] - FIX - FLEX-33865 ConstraintLayout optimization

Posted by Maurice Amsellem <ma...@systar.com>.
Actually, the values are one Number and optionally one String. So I don't think Point could be used.

Maybe a dedicated class ?

Maurice 

-----Message d'origine-----
De : Alex Harui [mailto:aharui@adobe.com] 
Envoyé : lundi 4 novembre 2013 18:58
À : dev@flex.apache.org; commits@flex.apache.org
Objet : Re: git commit: [flex-sdk] [refs/heads/develop] - FIX - FLEX-33865 ConstraintLayout optimization

Just thinking:  I know you've spent a lot of time on this (and thanks for doing so), but is Array really being used just to pass two values?  I wonder if it would be better to use Point.

On 11/4/13 12:55 AM, "mamsellem@apache.org" <ma...@apache.org> wrote:

>Updated Branches:
>  refs/heads/develop 5c9baf119 -> 7cab71bb2
>
>
>FIX - FLEX-33865 ConstraintLayout optimization
>
>
>Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo
>Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/7cab71bb
>Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/7cab71bb
>Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/7cab71bb
>
>Branch: refs/heads/develop
>Commit: 7cab71bb2192390dceaa4cc4c07eb45f49a4f5c7
>Parents: 5c9baf1
>Author: mamsellem <ma...@systar.com>
>Authored: Mon Nov 4 09:52:05 2013 +0100
>Committer: mamsellem <ma...@systar.com>
>Committed: Mon Nov 4 09:52:05 2013 +0100
>
>----------------------------------------------------------------------
> .../spark/src/spark/layouts/ConstraintLayout.as | 17 ++---
> .../supportClasses/LayoutElementHelper.as       | 78 ++++++++++++++++----
> 2 files changed, 72 insertions(+), 23 deletions(-)
>----------------------------------------------------------------------
>
>
>http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/7cab71bb/framework
>s/p rojects/spark/src/spark/layouts/ConstraintLayout.as
>----------------------------------------------------------------------
>diff --git
>a/frameworks/projects/spark/src/spark/layouts/ConstraintLayout.as
>b/frameworks/projects/spark/src/spark/layouts/ConstraintLayout.as
>index c7d47a6..60ef4cd 100644
>--- a/frameworks/projects/spark/src/spark/layouts/ConstraintLayout.as
>+++ b/frameworks/projects/spark/src/spark/layouts/ConstraintLayout.as
>@@ -605,7 +605,7 @@ public class ConstraintLayout extends LayoutBase
>         if (value == null)
>             return;
>         
>-        var constraintColumns:Vector.<ConstraintColumn> =
>this.constraintColumns;
>+        var constraintColumns:Vector.<ConstraintColumn> =
>this._constraintColumns;
>         var numCols:int = constraintColumns.length;
>         var totalWidth:Number = 0;
>         
>@@ -626,7 +626,7 @@ public class ConstraintLayout extends LayoutBase
>         if (value == null)
>             return;
>         
>-        var constraintRows:Vector.<ConstraintRow> = this.constraintRows;
>+        var constraintRows:Vector.<ConstraintRow> = 
>+ this._constraintRows;
>         var numRows:int = constraintRows.length;
>         var totalHeight:Number = 0;
>         
>@@ -1669,24 +1669,23 @@ public class ConstraintLayout extends 
>LayoutBase
>         
>         var message:String;
>         
>-        var temp:Array;
>-        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.left);
>+        var temp:Array =
>LayoutElementHelper.parseConstraintExp(layoutElement.left);
>         left = temp[0];
>         leftBoundary = temp[1];
>         
>-        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.right);
>+        temp =
>LayoutElementHelper.parseConstraintExp(layoutElement.right, temp);
>         right = temp[0];
>         rightBoundary = temp[1];
>         
>-        temp = LayoutElementHelper.parseConstraintExp(layoutElement.top);
>+        temp = 
>+ LayoutElementHelper.parseConstraintExp(layoutElement.top,
>temp);
>         top = temp[0];
>         topBoundary = temp[1];
>         
>-        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.bottom);
>+        temp =
>LayoutElementHelper.parseConstraintExp(layoutElement.bottom, temp);
>         bottom = temp[0];
>         bottomBoundary = temp[1];
>         
>-        temp = 
>LayoutElementHelper.parseConstraintExp(layoutElement.baseline);
>+        temp =
>LayoutElementHelper.parseConstraintExp(layoutElement.baseline, temp);
>         baseline = temp[0];
>         baselineBoundary = temp[1];
>         
>@@ -1938,4 +1937,4 @@ import 
>mx.containers.utilityClasses.FlexChildInfo;
> class ConstraintRegionFlexChildInfo extends FlexChildInfo  {
>     public var index:int
>-}
>\ No newline at end of file
>+}
>
>http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/7cab71bb/framework
>s/p 
>rojects/spark/src/spark/layouts/supportClasses/LayoutElementHelper.as
>----------------------------------------------------------------------
>diff --git
>a/frameworks/projects/spark/src/spark/layouts/supportClasses/LayoutElem
>ent
>Helper.as
>b/frameworks/projects/spark/src/spark/layouts/supportClasses/LayoutElem
>ent
>Helper.as
>index baab217..d8eac93 100644
>---
>a/frameworks/projects/spark/src/spark/layouts/supportClasses/LayoutElem
>ent
>Helper.as
>+++ 
>b/frameworks/projects/spark/src/spark/layouts/supportClasses/LayoutElem
>ent
>Helper.as
>@@ -19,6 +19,7 @@
> 
> package spark.layouts.supportClasses
> {
>+import mx.utils.StringUtil;
> 
> [ExcludeClass]
> 
>@@ -79,28 +80,77 @@ public class LayoutElementHelper
>      *  so that an array is returned where the first value is
>      *  the offset (ie: 10) and the second value is
>      *  the boundary (ie: "col1")
>+     *  @arg result :  optional Array to save an Array memory 
>+ allocation
>      */
>-    public static function parseConstraintExp(val:Object):Array
>+    public static function parseConstraintExp(val:Object,
>result:Array=null):Array
>     {
>-        if (val is Number)
>-            return [Number(val), null];
>-        
>-        if (!val)
>-            return [NaN, null];
>-        // Replace colons with spaces
>-        var temp:String = String(val).replace(/:/g, " ");
>-        
>-        // Split the string into an array
>-        var args:Array = temp.split(/\s+/);
>+        // number
>+        if (val is Number) {
>+            if(result == null) {
>+                return [val as Number, null];
>+            }
>+            else {
>+                result[0] = val as Number;
>+                result[1] = null;
>+                return result;
>+            }
>+        }
>+       // null
>+        if (!val) {
>+            if(result == null) {
>+                return [NaN, null];
>+            }
>+            else {
>+                result[0] = NaN;
>+                result[1] = null;
>+                return result;
>+            }
>+        }
>+
>+        // String case  : 2 sub-cases, number of constraint
>+        var tmp:String = String(val);
>+        var colonPos:int = tmp.indexOf(":");
>         
>         // If the val was a String object representing a single number 
>(i.e. "100"),
>         // then we'll hit this case:
>-        if (args.length == 1)
>-            return args;
>+        if(colonPos == -1) {
>+            return [StringUtil.trim(tmp)];
>+        }
>         
>         // Return [offset, boundary]
>-        return [args[1], args[0]];
>+        if(result == null) {
>+            result =[];
>+        }
>+        
>+        //here we do not use StringUtil in order to avoid unnecessary
>memory allocations
>+        var startIndex:int = 0;
>+        while (StringUtil.isWhitespace(tmp.charAt(startIndex))) {
>+            ++startIndex;
>+        }
>+        
>+        var endIndex:int = tmp.length - 1;
>+        while (StringUtil.isWhitespace(tmp.charAt(endIndex) )) {
>+            --endIndex;
>+        }
>+        
>+        var endIndexPart1:int = colonPos-1;
>+        while (StringUtil.isWhitespace(tmp.charAt(endIndexPart1))) {
>+            --endIndexPart1;
>+        }
>+        
>+        var startIndexPart2:int = colonPos+1;
>+        while (StringUtil.isWhitespace(tmp.charAt(startIndexPart2))) {
>+            ++startIndexPart2;
>+        }
>+        
>+        result[0] = tmp.substring(startIndexPart2, endIndex+1);
>+        result[1] = tmp.substring(startIndex, endIndexPart1+1);
>+        
>+        return result;
>     }
>+
>+
>+
> }
> 
> }
>