harmony-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Sean Qiu" <sean.xx....@gmail.com>
Subject Re: svn commit: r689001 - in /harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql: Date.java Time.java Timestamp.java
Date Thu, 28 Aug 2008 01:28:35 GMT
Here is a small test from Regis:

----------
 int count = 5000;

for (int i = 0; i < count; ++i) { new Date(new
java.util.Date().getTime()).toString(); }

Date date = new Date(new java.util.Date().getTime());
long start = System.currentTimeMillis();

for (int i = 0; i < count; ++i) { date.toString(); }
long end = System.currentTimeMillis();
System.out.println("Invoke Date.toString() " + count + " times, cost:
" + (end - start));

Time time = new Time(new java.util.Date().getTime());
start = System.currentTimeMillis();
for (int i = 0; i < count; ++i) { time.toString(); }
end = System.currentTimeMillis();
System.out.println("Invoke Time.toString() " + count + " times, cost:
" + (end - start));

Timestamp timestamp = new Timestamp(new java.util.Date().getTime());
start = System.currentTimeMillis();
for (int i = 0; i < count; ++i) { timestamp.toString(); }
end = System.currentTimeMillis();
System.out.println("Invoke Timestamp.toString() " + count + " times,
cost: " + (end - start));
-------------

the first loop, give time for jvm to warm up

Below data compare the two implementations:

before the patch:
Invoke Date.toString() 5000 times, cost: 6757
Invoke Time.toString() 5000 times, cost: 7699
Invoke Timestamp.toString() 5000 times, cost: 2527

after the patch:
Invoke Date.toString() 5000 times, cost: 84
Invoke Time.toString() 5000 times, cost: 95
Invoke Timestamp.toString() 5000 times, cost: 272


We can gain obvious improvement.

2008/8/28 Nathan Beyer <ndbeyer@apache.org>:
> Are there any associated test cases with this change? On a quick
> cursory look, I didn't see any existing tests. Did I miss them? If
> not, we need to start requiring some test cases for "simple
> improvements" like this to continue functional correctness.
>
> -Nathan
>
> On Tue, Aug 26, 2008 at 3:59 AM,  <qiuxx@apache.org> wrote:
>> Author: qiuxx
>> Date: Tue Aug 26 01:59:50 2008
>> New Revision: 689001
>>
>> URL: http://svn.apache.org/viewvc?rev=689001&view=rev
>> Log:
>> Apply for HARMONY-5958,([classlib][sql][performance] - improve performance of java.sql.Date/Time/Timestamp.toString())
>>
>> Modified:
>>    harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Date.java
>>    harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Time.java
>>    harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Timestamp.java
>>
>> Modified: harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Date.java
>> URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Date.java?rev=689001&r1=689000&r2=689001&view=diff
>> ==============================================================================
>> --- harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Date.java
(original)
>> +++ harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Date.java
Tue Aug 26 01:59:50 2008
>> @@ -17,8 +17,6 @@
>>
>>  package java.sql;
>>
>> -import java.text.SimpleDateFormat;
>> -
>>  /**
>>  * A Date class which can consume and produce dates in SQL Date format.
>>  * <p>
>> @@ -175,8 +173,28 @@
>>      */
>>     @Override
>>     public String toString() {
>> -        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); //$NON-NLS-1$
>> -        return dateFormat.format(this);
>> +        StringBuilder sb = new StringBuilder(10);
>> +
>> +        format((getYear() + 1900), 4, sb);
>> +        sb.append('-');
>> +        format((getMonth() + 1), 2, sb);
>> +        sb.append('-');
>> +        format(getDate(), 2, sb);
>> +
>> +        return sb.toString();
>> +    }
>> +
>> +    private static final String PADDING = "0000";  //$NON-NLS-1$
>> +
>> +    /*
>> +    * Private method to format the time
>> +    */
>> +    private void format(int date, int digits, StringBuilder sb) {
>> +        String str = String.valueOf(date);
>> +        if (digits - str.length() > 0) {
>> +            sb.append(PADDING.substring(0, digits - str.length()));
>> +        }
>> +        sb.append(str);
>>     }
>>
>>     /**
>>
>> Modified: harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Time.java
>> URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Time.java?rev=689001&r1=689000&r2=689001&view=diff
>> ==============================================================================
>> --- harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Time.java
(original)
>> +++ harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Time.java
Tue Aug 26 01:59:50 2008
>> @@ -17,7 +17,6 @@
>>
>>  package java.sql;
>>
>> -import java.text.SimpleDateFormat;
>>  import java.util.Date;
>>
>>  /**
>> @@ -180,8 +179,28 @@
>>      */
>>     @Override
>>     public String toString() {
>> -        SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); //$NON-NLS-1$
>> -        return dateFormat.format(this);
>> +        StringBuilder sb = new StringBuilder(8);
>> +
>> +        format(getHours(), 2, sb);
>> +        sb.append(':');
>> +        format(getMinutes(), 2, sb);
>> +        sb.append(':');
>> +        format(getSeconds(), 2, sb);
>> +
>> +        return sb.toString();
>> +    }
>> +
>> +    private static final String PADDING = "00";  //$NON-NLS-1$
>> +
>> +    /*
>> +    * Private method to format the time
>> +    */
>> +    private void format(int date, int digits, StringBuilder sb) {
>> +        String str = String.valueOf(date);
>> +        if (digits - str.length() > 0) {
>> +            sb.append(PADDING.substring(0, digits - str.length()));
>> +        }
>> +        sb.append(str);
>>     }
>>
>>     /**
>>
>> Modified: harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Timestamp.java
>> URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Timestamp.java?rev=689001&r1=689000&r2=689001&view=diff
>> ==============================================================================
>> --- harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Timestamp.java
(original)
>> +++ harmony/enhanced/classlib/trunk/modules/sql/src/main/java/java/sql/Timestamp.java
Tue Aug 26 01:59:50 2008
>> @@ -309,62 +309,43 @@
>>     @SuppressWarnings("deprecation")
>>     @Override
>>     public String toString() {
>> -        /*
>> -         * Use a DecimalFormat to lay out the nanosecond value as a simple
>> -         * string of 9 integers, with leading Zeros
>> -         */
>> -        DecimalFormat decimalFormat = new DecimalFormat("0"); //$NON-NLS-1$
>> -        decimalFormat.setMinimumIntegerDigits(9);
>> -        decimalFormat.setMaximumIntegerDigits(9);
>> -        String theNanos = decimalFormat.format(nanos);
>> -        theNanos = stripTrailingZeros(theNanos);
>> -
>> -        String year = format((getYear() + 1900), 4);
>> -        String month = format((getMonth() + 1), 2);
>> -        String date = format(getDate(), 2);
>> -        String hours = format(getHours(), 2);
>> -        String minutes = format(getMinutes(), 2);
>> -        String seconds = format(getSeconds(), 2);
>> -
>> -        return year + '-' + month + '-' + date + ' ' + hours + ':' + minutes
>> -                + ':' + seconds + '.' + theNanos;
>> -    }
>> +        StringBuilder sb = new StringBuilder(29);
>>
>> -    /*
>> -     * Private method to format the time
>> -     */
>> -    private String format(int date, int digits) {
>> -        StringBuilder dateStringBuffer = new StringBuilder(String.valueOf(date));
>> -        while (dateStringBuffer.length() < digits) {
>> -            dateStringBuffer = dateStringBuffer.insert(0, '0');
>> +        format((getYear() + 1900), 4, sb);
>> +        sb.append('-');
>> +        format((getMonth() + 1), 2, sb);
>> +        sb.append('-');
>> +        format(getDate(), 2, sb);
>> +        sb.append(' ');
>> +        format(getHours(), 2, sb);
>> +        sb.append(':');
>> +        format(getMinutes(), 2, sb);
>> +        sb.append(':');
>> +        format(getSeconds(), 2, sb);
>> +        sb.append('.');
>> +        if (nanos == 0) {
>> +            sb.append('0');
>> +        } else {
>> +            format(nanos, 9, sb);
>> +            while (sb.charAt(sb.length() - 1) == '0') {
>> +                sb.setLength(sb.length() - 1);
>> +            }
>>         }
>> -        return dateStringBuffer.toString();
>> +
>> +        return sb.toString();
>>     }
>>
>> -    /*
>> -     * Private method to strip trailing '0' characters from a string. @param
>> -     * inputString the starting string @return a string with the trailing zeros
>> -     * stripped - will leave a single 0 at the beginning of the string
>> -     */
>> -    private String stripTrailingZeros(String inputString) {
>> -        String finalString;
>> +    private static final String PADDING = "000000000";  //$NON-NLS-1$
>>
>> -        int i;
>> -        for (i = inputString.length(); i > 0; i--) {
>> -            if (inputString.charAt(i - 1) != '0') {
>> -                break;
>> -            }
>> -            /*
>> -             * If the string has a 0 as its first character, return a string
>> -             * with a single '0'
>> -             */
>> -            if (i == 1) {
>> -                return "0"; //$NON-NLS-1$
>> -            }
>> +    /*
>> +    * Private method to format the time
>> +    */
>> +    private void format(int date, int digits, StringBuilder sb) {
>> +        String str = String.valueOf(date);
>> +        if (digits - str.length() > 0) {
>> +            sb.append(PADDING.substring(0, digits - str.length()));
>>         }
>> -
>> -        finalString = inputString.substring(0, i);
>> -        return finalString;
>> +        sb.append(str);
>>     }
>>
>>     /**
>>
>>
>>
>



-- 
Best Regards
Sean, Xiao Xia Qiu

China Software Development Lab, IBM

Mime
View raw message