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/04/22 16:55:41 UTC

Re: [1/3] git commit: [flex-sdk] - FLEX-24411 FLEX-20322 added support for .milliseconds and fix parsing of international months

Bonus optimization if you have time for this pattern:

> +            if (!("0" <= letter && letter <= "9" ||
> +                  letter == "/" || letter == ":" ||
> +                  letter == "+" || letter == "-" ||
> +                  letter == "." || letter == " "))
This many checks in an if statement usually runs faster if you do a simple
lookup.  Setup the lookup like something like this:
    public static var dateLetters:Object = initDateLetters();
    public static function initDateLetters():Object {
        var letters:Object = {};
        letters['/'] = 1;
        ...
        letters[' '] = 1;
        return letters;
    }
And then the if statement just looks like:
        if (!("0" <= letter && letter <= "9" || dateLetters[letter]) ...

Also, having the static public lookup table allows folks to muck with it.


On 4/22/13 3:25 AM, "jmclean@apache.org" <jm...@apache.org> wrote:

> Updated Branches:
>   refs/heads/develop 97a9298cc -> ec15ddde1
> 
> 
> FLEX-24411 FLEX-20322 added support for .milliseconds and fix parsing of
> international months
> 
> 
> Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo
> Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/2dd706e5
> Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/2dd706e5
> Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/2dd706e5
> 
> Branch: refs/heads/develop
> Commit: 2dd706e57f31c906003eaac4d300f7ed845c3113
> Parents: 97a9298
> Author: Justin Mclean <jm...@apache.org>
> Authored: Mon Apr 22 20:22:02 2013 +1000
> Committer: Justin Mclean <jm...@apache.org>
> Committed: Mon Apr 22 20:22:02 2013 +1000
> 
> ----------------------------------------------------------------------
>  .../framework/src/mx/formatters/DateFormatter.as   |   56 ++++++++++-----
>  1 files changed, 38 insertions(+), 18 deletions(-)
> ----------------------------------------------------------------------
> 
> 
> http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/2dd706e5/frameworks/proje
> cts/framework/src/mx/formatters/DateFormatter.as
> ----------------------------------------------------------------------
> diff --git a/frameworks/projects/framework/src/mx/formatters/DateFormatter.as
> b/frameworks/projects/framework/src/mx/formatters/DateFormatter.as
> index a28c716..e12e990 100644
> --- a/frameworks/projects/framework/src/mx/formatters/DateFormatter.as
> +++ b/frameworks/projects/framework/src/mx/formatters/DateFormatter.as
> @@ -129,6 +129,7 @@ public class DateFormatter extends Formatter
>          var hour:int = -1;
>          var min:int = -1;
>          var sec:int = -1;
> +  var milli:int = -1;
>          
>          var letter:String = "";
>          var marker:Object = 0;
> @@ -154,7 +155,8 @@ public class DateFormatter extends Formatter
>              // If the letter is a key punctuation character,
>              // cache it for the next time around.
>              if (letter == "/" || letter == ":" ||
> -                letter == "+" || letter == "-")
> +                letter == "+" || letter == "-" ||
> +    letter == ".")
>              {
>                  marker = letter;
>                  continue;
> @@ -162,23 +164,27 @@ public class DateFormatter extends Formatter
>  
>              // Scan for groups of numbers and letters
>              // and match them to Date parameters
> -            if ("a" <= letter && letter <= "z" ||
> -                "A" <= letter && letter <= "Z")
> +            if (!("0" <= letter && letter <= "9" ||
> +      letter == "/" || letter == ":" ||
> +         letter == "+" || letter == "-" ||
> +      letter == "." || letter == " "))
>              {
>                  // Scan for groups of letters
>                  var word:String = letter;
>                  while (count < len)
>                  {
>                      letter = str.charAt(count);
> -                    if (!("a" <= letter && letter <= "z" ||
> -                          "A" <= letter && letter <= "Z"))
> +     if ("0" <= letter && letter <= "9"||
> +      letter == "/" || letter == ":" ||
> +      letter == "+" || letter == "-" ||
> +      letter == "." || letter == " ")
>                      {
>                          break;
>                      }
>                      word += letter;
>                      count++;
>                  }
> -
> +    
>                  // Allow for an exact match
>                  // or a match to the first 3 letters as a prefix.
>                  var n:int = DateBase.defaultStringKey.length;
> @@ -233,7 +239,8 @@ public class DateFormatter extends Formatter
>                  var num:int = int(numbers);
>  
>                  // If num is a number greater than 70, assign num to year.
> -                if (num >= 70)
> +    // if after seconds and a dot or colon more likly milliseconds
> +                if (num >= 70 && !((marker == "." || marker == ":") && sec >=
> 0))
>                  {
>                      if (year != -1)
>                      {
> @@ -251,25 +258,29 @@ public class DateFormatter extends Formatter
>                  }
>  
>                  // If the current letter is a slash or a dash,
> -                // assign num to month or day.
> +                // assign num to month or day or sec.
>                  else if (letter == "/" || letter == "-" || letter == ".")
>                  {
>                      if (mon < 0)
>                          mon = (num - 1);
> -                    else if (day < 0)
> -                        day = num;
> +     else if (day < 0)
> +      day = num;
> +     else if (sec < 0)
> +      sec = num;
>                      else
>                          break; //error
>                  }
>  
>                  // If the current letter is a colon,
> -                // assign num to hour or minute.
> +                // assign num to hour or minute or sec.
>                  else if (letter == ":")
>                  {
>                      if (hour < 0)
>                          hour = num;
>                      else if (min < 0)
>                          min = num;
> +     else if (sec < 0)
> +      sec = num;
>                      else
>                          break; //error
>                  }
> @@ -281,12 +292,19 @@ public class DateFormatter extends Formatter
>                      min = num;
>                  }
>  
> -                // If minutes are defined and seconds are not,
> -                // assign num to seconds.
> -                else if (min >= 0 && sec < 0)
> -                {
> -                    sec = num;
> -                }
> +    // If minutes are defined and seconds are not,
> +    // assign num to seconds.
> +    else if (min >= 0 && sec < 0)
> +    {
> +     sec = num;
> +    }
> +    
> +    // If seconds are defined and millis are not,
> +    // assign num to mills.
> +    else if (sec >= 0 && milli < 0)
> +    {
> +     milli = num;
> +    }
>  
>                  // If day is not defined, assign num to day.
>                  else if (day < 0)
> @@ -315,6 +333,8 @@ public class DateFormatter extends Formatter
>              return null; // error - needs to be a date
>  
>          // Time is set to 0 if null.
> +  if (milli < 0)
> +   milli = 0;
>          if (sec < 0)
>              sec = 0;
>          if (min < 0)
> @@ -324,7 +344,7 @@ public class DateFormatter extends Formatter
>  
>          // create a date object and check the validity of the input date
>          // by comparing the result with input values.
> -        var newDate:Date = new Date(year, mon, day, hour, min, sec);
> +        var newDate:Date = new Date(year, mon, day, hour, min, sec, milli);
>          if (day != newDate.getDate() || mon != newDate.getMonth())
>              return null;
>  
> 

-- 
Alex Harui
Flex SDK Team
Adobe Systems, Inc.
http://blogs.adobe.com/aharui


Re: [1/3] git commit: [flex-sdk] - FLEX-24411 FLEX-20322 added support for .milliseconds and fix parsing of international months

Posted by Justin Mclean <ju...@classsoftware.com>.
HI,

>> True but how many dates do you need to parse in a second? Plus I was keeping
>> to existing code style.
> Not sure.  Like I said, it is optional
Raise it as a minor JIRA and I'll eventually get to it.

> , and I forgot to say thanks for plowing through all of this broken date stuff.
Rather sad state of affairs reading through all of the unloved JIRA issues. :-)

> One scenario might be: parsing dates from a SOAP response with a lot of
> rows?  What code parses the dates there?
No idea but I'd assume it's just Date.parse() which has it's own issues.

Justin

Re: [1/3] git commit: [flex-sdk] - FLEX-24411 FLEX-20322 added support for .milliseconds and fix parsing of international months

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


On 4/22/13 8:26 AM, "Justin Mclean" <ju...@classsoftware.com> wrote:

> Hi,
> 
>> This many checks in an if statement usually runs faster if you do a simple
>> lookup.
> True but how many dates do you need to parse in a second? Plus I was keeping
> to existing code style.
Not sure.  Like I said, it is optional, and I forgot to say thanks for
plowing through all of this broken date stuff.

One scenario might be: parsing dates from a SOAP response with a lot of
rows?  What code parses the dates there?

-- 
Alex Harui
Flex SDK Team
Adobe Systems, Inc.
http://blogs.adobe.com/aharui


Re: [1/3] git commit: [flex-sdk] - FLEX-24411 FLEX-20322 added support for .milliseconds and fix parsing of international months

Posted by Justin Mclean <ju...@classsoftware.com>.
Hi,

> This many checks in an if statement usually runs faster if you do a simple
> lookup.
True but how many dates do you need to parse in a second? Plus I was keeping to existing code style.

I not measured how long parseDateString takes but I assume it;s only a few ms if that.

Justin