[threeten-dev] Startup tuning for j.u.TimeZone/tzdb.jar migration

Xueming Shen xueming.shen at oracle.com
Sat Feb 23 10:51:07 PST 2013


Hi,

Here is the webrev for the changes for tzdb compiler and 
s.u.c.ZoneInfoFile that
I have been working on the past couple days. Most of the changes in tzdb 
compiler
are in the webrev I sent out last time [1], but I did  not push, so I'm 
including them
here again.

http://cr.openjdk.java.net/~sherman/jdk8_threeten/tzcompiler3

We have a startup performance regression in the j.u.TimeZone after the 
->tzdb.jar
migration, as showed below (b74 is jdk8-b74 that uses zi and the b78 is 
jdk8-b78
that uses the tzdb.jar for j.u.TimeZone) there is a 29-30 ms vs 7-8 ms 
regression
on my aged linux machine. It is measured by using the non-scientific 
test case
TestStartup.java [2]

--------------b74----------------------
getTimeZone(America/Los_Angeles)[1]=7037
getTimeZone(America/New_York)   [2]=224
getTimeZone(America/Denver)     [3]=98
getTimeZone(Europe/London)      [4]=126
getAvailableIDs()=2166
getAliasTable()=1515
TotalTZ()=59 (ms)

--------------b78----------------------
getTimeZone(America/Los_Angeles)[1]=29267
getTimeZone(America/New_York)   [2]=1322
getTimeZone(America/Denver)     [3]=1014
getTimeZone(Europe/London)      [4]=1665
getAvailableIDs()=723
getAliasTable()=47
TotalTZ()=378 (ms)


The proposed changes here are

(1) To avoid using JSR310 new classes during tzdb->zi conversion. This 
is the main
slowdown comes from. While it's "easy" and "convenient" to use the new 
JSR310
classes to do the conversion, it has the cost of looking up, loading 
those new classes
(there are lots, and they slow down the startup and generate lots 
use/throw away
objects). The assumption is that "old" apps that use j.u.TimeZone don't 
use those
threeten classes, the lookup and loadup of threeten classes will be only 
for this
tzdb->zi conversion.

(2) To lazy-initialize the zoneId->timeZone HashMap. To put 600+ entries 
into
a hashmap also slows down the startup lots, especially most of these 600 
zones
will never be used during the lifttime of the vm. We now use the 
binary-search
for the first lookup and then put the result into the hashmap for future 
lookup.

(3) Not "jar" the tzdb.dat, just put the tzdb.dat at <java_home>/lib 
directly. This
has the cost of the size (40+k vs 100k), but it speeds up about 3 ms (out of
20ms). Given we are using un-compressed jars in jdk installation for 
performance
I would assume this is something worth doing here.

Together with all these changes, now the startup on my linux is about
13-ish ms (vs the 30ms in b78 and 7ms in b74). The speed of "pure" tz
conversion (only happens once for each tz, the tz then be cached in
hashmap) is also doubled, see [2]/[3]/[4].  I would assume the chance
that the performance team will go after me for the regression has been
reduced dramatically after this change:-)

-------------this change--------------------------
getTimeZone(America/Los_Angeles)[1]=13845
getTimeZone(America/New_York)   [2]=741
getTimeZone(America/Denver)     [3]=499
getTimeZone(Europe/London)      [4]=742
getAvailableIDs()=37
getAliasTable()=174
TotalTZ()=202 (ms)


-Sherman

[1] 
http://mail.openjdk.java.net/pipermail/threeten-dev/2013-February/000828.html
[2] 
http://cr.openjdk.java.net/~sherman/jdk8_threeten/tzcompiler3/TestStartup.java


More information about the threeten-dev mailing list