Updated Branches: refs/heads/develop 24c1d8f01 -> 40d67742e
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/develop Commit: 40d67742ec94bc916096f078a8738b4697c621bb Parents: 24c1d8f Author: mamsellem <[email protected]> Authored: Sun Oct 20 21:39:03 2013 +0200 Committer: mamsellem <[email protected]> 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; }
