You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by jm...@apache.org on 2013/10/22 00:37:41 UTC

[49/50] git commit: [flex-sdk] [refs/heads/master] - FLEX-33829 improve create UID performance and use New algorithm using ByteArray around 4x faster than original.

FLEX-33829 improve create UID performance and use
New algorithm using ByteArray around 4x faster than original.


Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/40d67742
Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/40d67742
Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/40d67742

Branch: refs/heads/master
Commit: 40d67742ec94bc916096f078a8738b4697c621bb
Parents: 24c1d8f
Author: mamsellem <ma...@systar.com>
Authored: Sun Oct 20 21:39:03 2013 +0200
Committer: mamsellem <ma...@systar.com>
Committed: Sun Oct 20 21:39:03 2013 +0200

----------------------------------------------------------------------
 .../projects/framework/src/mx/utils/UIDUtil.as  | 99 ++++++++------------
 1 file changed, 41 insertions(+), 58 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/40d67742/frameworks/projects/framework/src/mx/utils/UIDUtil.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/framework/src/mx/utils/UIDUtil.as b/frameworks/projects/framework/src/mx/utils/UIDUtil.as
index 36ad6fb..6ada280 100644
--- a/frameworks/projects/framework/src/mx/utils/UIDUtil.as
+++ b/frameworks/projects/framework/src/mx/utils/UIDUtil.as
@@ -65,16 +65,9 @@ public class UIDUtil
      */
 	private static const ALPHA_CHAR_CODES:Array = [48, 49, 50, 51, 52, 53, 54, 
 		55, 56, 57, 65, 66, 67, 68, 69, 70];
-	
-	private static const HEX_CHARS:String = "0123456789ABCDEF";
-	
-	private static var EMPTYUID:Array = [
-		'0','0','0','0','0','0','0','0',
-		'-','0','0','0','0',
-		'-','0','0','0','0',
-		'-','0','0','0','0',
-		'-','0','0','0','0','0','0','0','0','0','0','0','0'
-	];
+
+    private static const DASH:int = 45;       // dash ascii
+    private static const UIDBuffer:ByteArray = new ByteArray();       // static ByteArray used for UID generation to save memory allocation cost
 
     //--------------------------------------------------------------------------
     //
@@ -117,52 +110,42 @@ public class UIDUtil
      *  @productversion Flex 3
      */
 	public static function createUID():String
-	{
-		var uid:Array = EMPTYUID;
-		var index:int = 0;
-		
-		var i:int;
-		var j:int;
-		
-		for (i = 0; i < 8; i++)
-		{
-			uid[index++] = HEX_CHARS.charAt(Math.random() * 16);
-		}
-		
-		for (i = 0; i < 3; i++)
-		{
-			index++; // skip "-"
-			
-			for (j = 0; j < 4; j++)
-			{
-				uid[index++] = HEX_CHARS.charAt(Math.random() * 16);
-			}
-		}
-		
-		index++; // skip "-"
-		
-		var time:Number = new Date().getTime();
-		// Note: time is the number of milliseconds since 1970,
-		// which is currently more than one trillion.
-		// We use the low 8 hex digits of this number in the UID.
-		// Just in case the system clock has been reset to
-		// Jan 1-4, 1970 (in which case this number could have only
-		// 1-7 hex digits), we pad on the left with 7 zeros
-		// before taking the low digits.
-		var timeString:String = ("0000000" + time.toString(16).toUpperCase()).substr(-8);
-		
-		for (i = 0; i < 8; i++)
-		{
-			uid[index++] = timeString.charAt(i);
-		}
-		
-		for (i = 0; i < 4; i++)
-		{
-			uid[index++] = HEX_CHARS.charAt(Math.random() * 16);
-		}
-		
-		return uid.join("");
-	}
+    {
+        UIDBuffer.position = 0;
+
+        var i:int;
+        var j:int;
+
+        for (i = 0; i < 8; i++)
+        {
+            UIDBuffer.writeByte(ALPHA_CHAR_CODES[int(Math.random() * 16)]);
+        }
+
+        for (i = 0; i < 3; i++)
+        {
+            UIDBuffer.writeByte(DASH);
+            for (j = 0; j < 4; j++)
+            {
+                UIDBuffer.writeByte(ALPHA_CHAR_CODES[int(Math.random() * 16)]);
+            }
+        }
+
+        UIDBuffer.writeByte(DASH);
+
+        var time:uint = new Date().getTime(); // extract last 8 digits
+        var timeString:String = time.toString(16).toUpperCase();
+        // 0xFFFFFFFF milliseconds ~= 3 days, so timeString may have between 1 and 8 digits, hence we need to pad with 0s to 8 digits
+        for (i = 8; i > timeString.length; --i)
+            UIDBuffer.writeByte(48);
+        UIDBuffer.writeUTFBytes(timeString);
+
+        for (i = 0; i < 4; i++)
+        {
+            UIDBuffer.writeByte(ALPHA_CHAR_CODES[int(Math.random() * 16)]);
+        }
+
+        return UIDBuffer.toString();
+    }
 
     /**
      * Converts a 128-bit UID encoded as a ByteArray to a String representation.
@@ -188,7 +171,7 @@ public class UIDUtil
             for (var i:uint = 0; i < 16; i++)
             {
                 if (i == 4 || i == 6 || i == 8 || i == 10)
-                    chars[index++] = 45; // Hyphen char code
+                    chars[index++] = DASH; // Hyphen char code
 
                 var b:int = ba.readByte();
                 chars[index++] = ALPHA_CHAR_CODES[(b & 0xF0) >>> 4];
@@ -227,7 +210,7 @@ public class UIDUtil
                 // Check for correctly placed hyphens
                 if (i == 8 || i == 13 || i == 18 || i == 23)
                 {
-                    if (c != 45)
+                    if (c != DASH)
                     {
                         return false;
                     }