<i18n dev> <i18n> Performance patch for DateFormatSymbols.getZoneIndex(String)

Yoshito Umaoka y.umaoka at gmail.com
Tue Apr 10 13:00:39 PDT 2012


I'm wondering if caching index matched last time (per DateFormatSymbols 
instance) is sufficient, instead of keeping multiple results in a hash map.
I guess majority of use cases repeatedly refer the index of the zone 
used by SimpleDateFormat.

-Yoshito

On 4/9/2012 10:46 AM, Masayoshi Okutsu wrote:
> Hi Deven,
>
> Here are my comments on the proposed changes.
>
> - zoneIndexCache should be an instance field because WeakHashMap isn't 
> thread-safe and the order of IDs in zoneStrings differs in each 
> DateFormatSymbols.
>
> - equals shouldn't be replaced with equalsIgnoreCase because time zone 
> IDs are (supposed to be) case-sensitive.
>
> - Utilize auto-boxing/unboxing.
>
> Thanks,
> Masayoshi
>
> On 4/9/2012 12:10 PM, Deven You wrote:
>> Hi i18n-devs,
>>
>> The getZoneIndex() method is expensive and it's performance depends 
>> on which timezone you're in. This is because the code steps through a 
>> list of timezones until it finds the current one. This is happening 
>> over and over again. An idea would be to either cache it or rewrite 
>> the way we store time zone ids, such as a hashmap instead of an array.
>> This patch[1] is for the cache option.
>>
>> Applications which  format/parse dates using SimpleDateFormat 
>> repeatedly may obtain benefits from this patch, especially when run 
>> in a timezone far down the zoneStrings array the improvements will be 
>> even bigger.
>>
>> I have written a test case[2] which shows when a timezone which is in 
>> lower end of the zone strings array, the performance improvement this 
>> patch can get.
>>
>> test results:
>>
>> no patch:
>> The total time is 742 ms!
>>
>> with this patch[1] :
>> The total time is 508 ms!
>>
>> If increase the loop times to 1000000, the results are:
>>
>> no patch:
>> The total time is 4743 ms!
>>
>> with this patch[1] :
>> The total time is 2126 ms!
>>
>> The java version is:
>>
>> /home/deven/hgrps/jdk8/build/linux-i586/j2sdk-image/bin/java -version
>> openjdk version "1.8.0-internal"
>> OpenJDK Runtime Environment (build 
>> 1.8.0-internal-deven_2012_03_14_16_14-b00)
>> OpenJDK Server VM (build 24.0-b02, mixed mode)
>>
>> [1] 
>> http://cr.openjdk.java.net/~youdwei/DateFormatSymbol_perf/webrev.00/ 
>> <http://cr.openjdk.java.net/%7Eyoudwei/DateFormatSymbol_perf/webrev.00/>
>> [2] GetZoneIndexTest.java



More information about the i18n-dev mailing list