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;
}