RFC - Reduce loading of PropertiesFile

Thomas Meyer thomas at m3y3r.de
Thu Apr 19 12:14:20 PDT 2012


Am Montag, den 16.04.2012, 14:53 +0200 schrieb Jiri Vanek:

> >> Also I would like to suggest at least two tests with this patch
> >> 1) generate eg 1mb recently_used file and measure set some deadline how fast javaws  have to start.
> >>     The value should be failing without this patch, and  passing with this one applied. Also some
> >> real number how faster this is will be much appreciate!

Hi,

Attached are two patches that implement a unit test of
CacheLRUWrapper.load()

Some numbers of my previous optimisation patches:

No. of entries in the recently_used file = 1000
No. of calls to CacheLRUWrapper.load() = 1000

Before: Average = 3802485.0 ns
After:  Average = 44887.0 ns

> >>
> >> 2) second one will be little bit more difficult. It would be nice to test, that when recently_used
> >> is modified during javaws run, then it reloads it correctly. And so verify that this patch will not
> >> cause some regression.

Still on my todo list :-)

> >> Maybe unittest will be easier to prepare instead of 2)
> >> But I'm afraid those (or similar ) tests will be really necessary.
> >


>  > diff -r 17f9e4e1ac6d netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java
> --- a/netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java	Wed Apr 11 10:19:17 2012 +0200
> +++ b/netx/net/sourceforge/jnlp/cache/CacheLRUWrapper.java	Mon Apr 16 14:08:18 2012 +0200
> @@ -108,11 +108,11 @@
>        * Update map for keeping track of recently used items.
>        */
>       public synchronized void load() {
> -        cacheOrder.load();
> +        boolean loaded = cacheOrder.load();
>           /*
>            * clean up possibly corrupted entries
>            */
> -        if (checkData()) {
> +        if (loaded == true && checkData()) {
> 
>  > As already told above, Unless there is some particular reason, please avoid boolean comparsion with true/false

this is actually fixed in this patch. the attached patch file consists
actually of two diffs that needs to be applied to the icedtea-web repo
in order. mercurial doesn't let me rewrite the commit history, so I just
exported all revisions in one file. that's actually a bit confusing,
when you only look at the patch file.


> 
>               if (JNLPRuntime.isDebug()) {
>                   new LruCacheException().printStackTrace();
>               }
> @@ -125,7 +125,7 @@
>       /**
>        * check content of cacheOrder and remove invalid/corrupt entries
>        *
> -     * @return true, if cache was coruupted and affected entry removed
> +     * @return true, if cache was corrupted and affected entry removed
>        */
>       private boolean checkData () {
>           boolean modified = false;
> diff -r 17f9e4e1ac6d netx/net/sourceforge/jnlp/util/PropertiesFile.java
> --- a/netx/net/sourceforge/jnlp/util/PropertiesFile.java	Wed Apr 11 10:19:17 2012 +0200
> +++ b/netx/net/sourceforge/jnlp/util/PropertiesFile.java	Mon Apr 16 14:08:18 2012 +0200
> @@ -104,24 +107,38 @@
>        * Ensures that the file backing these properties has been
>        * loaded; call this method before calling any method defined by
>        * a superclass.
> +     *
> +     * @return true, if file was (re-)loaded
> +     *         false, if file was still current
>        */
> -    public void load() {
> +    public boolean load() {
> +
> +        if (!file.exists())
> +            return false;
> 
>  > this is really nitpick and I'm sorry for it, but current code guidelines dictate brackets after if

okay, will fix this, too.

> @@ -131,12 +148,16 @@
>           if (!loaded)
>               return; // nothing could have changed so save unnecessary load/save
> 
> -        OutputStream s = null;
> +        FileOutputStream s = null;
>           try {
>               try {
>                   file.getParentFile().mkdirs();
>                   s = new FileOutputStream(file);
>                   store(s, header);
> +
> +                // fsync()
> +                s.getChannel().force(true);
> +                lastStore = file.lastModified();
>  > Very well :) I have never seen this before, so I hope you know what you are doing:) (but looks correct from javadoc)

I'm not sure if a flush() is needed before the fsync() aka.
s.getChannel().force(true);
Internet suggest a flush() is needed. I may add this. Suggestions?

thomas

-------------- next part --------------
A non-text attachment was scrubbed...
Name: patch1.diff
Type: text/x-patch
Size: 1261 bytes
Desc: not available
Url : http://mail.openjdk.java.net/pipermail/distro-pkg-dev/attachments/20120419/cca3637c/patch1.diff 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: patch2.diff
Type: text/x-patch
Size: 4186 bytes
Desc: not available
Url : http://mail.openjdk.java.net/pipermail/distro-pkg-dev/attachments/20120419/cca3637c/patch2.diff 


More information about the distro-pkg-dev mailing list