Updated Branches:
  refs/heads/develop 04f085bcb -> b7aef8e1e

FLEX-33835 Speed up sortLocalesByPreference


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

Branch: refs/heads/develop
Commit: b7aef8e1ef4d30c7639f0b4553a52ceec4b5c8c0
Parents: 04f085b
Author: Justin Mclean <[email protected]>
Authored: Wed Oct 30 19:26:50 2013 +1100
Committer: Justin Mclean <[email protected]>
Committed: Wed Oct 30 19:26:50 2013 +1100

----------------------------------------------------------------------
 .../framework/src/mx/resources/LocaleSorter.as  | 68 +++++++++++++++-----
 1 file changed, 52 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/b7aef8e1/frameworks/projects/framework/src/mx/resources/LocaleSorter.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/framework/src/mx/resources/LocaleSorter.as 
b/frameworks/projects/framework/src/mx/resources/LocaleSorter.as
index fb09fca..b260b7f 100644
--- a/frameworks/projects/framework/src/mx/resources/LocaleSorter.as
+++ b/frameworks/projects/framework/src/mx/resources/LocaleSorter.as
@@ -66,17 +66,17 @@ public class LocaleSorter
                
                var i:int;
         var j:int;
-        var k:int;
-        var l:int;
-               var locale:String;
                
                var locales:Array = trimAndNormalize(appLocales);
                var preferenceLocales:Array     = 
trimAndNormalize(systemPreferences);
                
                addUltimateFallbackLocale(preferenceLocales, 
ultimateFallbackLocale);
                
+               var noLocales:int = locales.length;
+               var noPreferenceLocales:int = preferenceLocales.length;
+               
                // For better performance, save the locales in a lookup table.
-               for (j = 0; j < locales.length; j++)
+               for (j = 0; j < noLocales; j++)
         {
                        hasLocale[locales[j]] = j;
                }
@@ -90,9 +90,21 @@ public class LocaleSorter
                        }
                }
                
-               for (i = 0, l = preferenceLocales.length; i < l; i++)
+               var preferenceLocalesID:Vector.<LocaleID> = new 
Vector.<LocaleID>(noPreferenceLocales);
+               for (i = 0; i < noPreferenceLocales; i++)
+        {
+               preferenceLocalesID[i] = 
LocaleID.fromString(preferenceLocales[i]);
+        }
+               
+               var localesID:Vector.<LocaleID> = new 
Vector.<LocaleID>(noLocales);
+               for (i = 0; i < noLocales; i++)
+        {
+               localesID[i] = LocaleID.fromString(locales[i]);
+        }
+               
+               for (i = 0; i < noPreferenceLocales; i++)
         {
-                       var plocale:LocaleID = 
LocaleID.fromString(preferenceLocales[i]);
+                       var plocale:LocaleID = preferenceLocalesID[i].clone();
                        
                        // Step 1: Promote the perfect match.
                        promote(preferenceLocales[i]);
@@ -106,25 +118,23 @@ public class LocaleSorter
                        }
                        
                        // Parse it again.
-                       plocale = LocaleID.fromString(preferenceLocales[i]);
+                       plocale = preferenceLocalesID[i].clone();
                        
             // Step 3: Promote the order of siblings from preferenceLocales.
-                       for (j = 0; j < l; j++)
+                       for (j = 0; j < noPreferenceLocales; j++)
             {
-                               locale = preferenceLocales[j];
-                               if 
(plocale.isSiblingOf(LocaleID.fromString(locale)))
-                                       promote(locale);
+                               if (plocale.isSiblingOf(preferenceLocalesID[j]))
+                                       promote(preferenceLocales[j]);
                        }
                                        
                        // Step 4: Promote all remaining siblings
             // (aka not in preferenceLocales)
                        // eg. push en_UK after en_US and en if the user
             // doesn't have en_UK in the preference list
-                       for (j = 0, k = locales.length; j < k; j++)
+                       for (j = 0; j < noLocales; j++)
             {
-                               locale = locales[j];
-                               if 
(plocale.isSiblingOf(LocaleID.fromString(locale)))
-                                       promote(locale);
+                               if (plocale.isSiblingOf(localesID[j]))
+                                       promote(locales[j]);
                        }
                }
                
@@ -132,7 +142,7 @@ public class LocaleSorter
         {
                        // Check what locales are not already loaded
             // and push them preserving the order.
-                       for (j = 0, k = locales.length; j < k; j++)
+                       for (j = 0; j < noLocales; j++)
             {
                                promote(locales[j]);
                        }
@@ -444,6 +454,32 @@ class LocaleID
        //
        
//--------------------------------------------------------------------------
 
+    /**
+     *  @private
+     */
+    public function clone():LocaleID {
+
+       var copy:LocaleID = new LocaleID();
+       copy.lang = lang;
+       copy.script = script;
+       copy.region = region;
+       copy.extended_langs = extended_langs.concat();
+       copy.variants = variants.concat();
+       copy.extensions = {};
+       for (var i:String in extensions)
+       {
+           if (extensions.hasOwnProperty(i))
+           {
+                   copy.extensions[i] = extensions[i].concat();
+           }
+       }
+           
+        copy.privates = privates.concat();
+        copy.privateLangs = privateLangs;
+    
+        return copy;
+    }
+
        /**
      *  @private
      */

Reply via email to