Hi Volker,

Could you give some benchmark results in the jbs bug to have an idea of the
performance gain ?

Thanks,
Laurent

Le jeu. 23 avr. 2020 à 10:20, Langer, Christoph <christoph.lan...@sap.com>
a écrit :

> Hi Volker,
>
> since it's not yet pushed, I also went over the change and I like it. +1 😊
>
> One little style nit caught my eye, which you could correct before
> pushing: The style of the if/else blocks in
> test/jdk/java/util/zip/DeflateIn_InflateOut.java in lines 48/49 and 59/60
> does not match the other if/else blocks in the file. You should probably
> have the else on the line of the closing bracket before...
>
> Thanks
> Christoph
>
>
> > -----Original Message-----
> > From: core-libs-dev <core-libs-dev-boun...@openjdk.java.net> On Behalf
> > Of Volker Simonis
> > Sent: Mittwoch, 22. April 2020 22:09
> > To: Lance Andersen <lance.ander...@oracle.com>
> > Cc: Java Core Libs <core-libs-dev@openjdk.java.net>; Vyom Tewari
> > <vyom.tew...@oracle.com>
> > Subject: Re: RFR(S): 8242848: Improve performance of
> > InflaterOutputStream.write()
> >
> > On Tue, Apr 21, 2020 at 5:23 PM Lance Andersen
> > <lance.ander...@oracle.com> wrote:
> > >
> > > Hi Volker,
> > >
> > > I think overall this looks OK.  I went through the older SCCS
> histories to see
> > if I could figure out why they were using 512 for the input length but
> could
> > not find anything that might shed some light for me.
> > >
> >
> > Hi Lance,
> >
> > thanks a lot for digging in the old sources to review my change. It's
> > great that we stil have people who can use SCCS :)
> >
> > > I am not sure you can guarantee that src.zip exists but others might
> be able
> > to weigh in here.  What we have been trying to do going forward is to
> have
> > the tests create  the zip files that it needs.  In some cases, we have
> created a
> > byte array within the test which represents the zip and just write it out
> > before the test begins.
> > >
> >
> > Yes, the dependency on an external file was not nice, so I rewrote the
> > benchmark to programmatically create a file which can be compressed by
> > a factor of ~6:
> >
> > http://cr.openjdk.java.net/~simonis/webrevs/2020/8242848.02/
> >
> > Notice that this new version only changes the microbenchmark, all the
> > other files are untouched.
> >
> > As everybody seemed to be happy with the change itself and the
> > regression test, I'm now waiting for your and Clae's final review of
> > the microbenchmark before pushing. Please let me know hat you think?
> >
> > Best regards,
> > Volker
> >
> > > I am hoping others with more history might also chime in case they are
> > aware of the history here.
> > >
> > > Thank you for helping improve the performance.
> > >
> > > Best
> > > Lance
> > >
> > > On Apr 17, 2020, at 6:49 AM, Volker Simonis <volker.simo...@gmail.com>
> > wrote:
> > >
> > > Thanks everybody for looking at this change!
> > >
> > > Please find an updated webrev (with a new test and micro-benchmark)
> > > and my answers to your comments below:
> > >
> > > http://cr.openjdk.java.net/~simonis/webrevs/2020/8242848.01/
> > >
> > > On Thu, Apr 16, 2020 at 6:40 AM Vyom Tiwari <vyomm...@gmail.com>
> > wrote:
> > >
> > > Thanks for doing this, i think the below code change is not required .
> > >
> > > Please do let me know if i am not reading it correctly.
> > >
> > > if (inf.finished() || (len == 0)/* no more input */) {
> > >
> > > If you check the native code "inf.finished() will be true only of the
> > corresponding native call inflate(strm, Z_PARTIAL_FLUSH) returns
> > "Z_STREAM_END".
> > >
> > > After your code change  write may return even if finished() is not
> true.
> > >
> > >
> > > Yes, that's true, but that's what we must do if there's no more input
> > > available. Before my change this break on "len < 1" was in the "if
> > > (inf.needsInput())" branch.
> > >
> > > On Thu, Apr 16, 2020 at 8:22 AM Thomas Stüfe
> > <thomas.stu...@gmail.com> wrote:
> > >
> > > 252                 // Check the decompressor
> > > 253                 if (inf.finished() || (len == 0)/* no more input
> */) {
> > > 254                     break;
> > > 255                 }
> > >
> > > Not sure but I think this is wrong because now you bypass the followup
> > handling of inf.needsDirectory.
> > >
> > > Inflater.inflate() returns 0 if either needsInput or needsDirectory.
> We have
> > to ignore needsInput since we have no input anymore, but needsDirectory
> > has to be handled, no?
> > >
> > >
> > > You're absolutely right Thomas. Thanks for catching this! I've moved
> > > the check for "needsDictionary" in front of the "finished() || len ==
> > > 0" check.
> > >
> > > Unfortunately there is not very good test coverage for zip with preset
> > > dictionaries (jtreg and submit repo passed without problems). So I
> > > added a new test for this use case to "
> > > test/jdk/java/util/zip/DeflateIn_InflateOut.java".
> > >
> > > On Thu, Apr 16, 2020 at 8:48 AM Thomas Stüfe
> > <thomas.stu...@gmail.com> wrote:
> > >
> > >
> > > As for increasing the buffer size, it makes sense but IMHO needs a CSR
> and
> > a release note.
> > >
> > >
> > > I don't think so. This is an internal, implementation specific setting
> > > which has never been exposed or documented before so I don't see why
> > > we should document it now. But let's discuss this separately in the
> > > corresponding JBS issue (see below).
> > >
> > > On Thu, Apr 16, 2020 at 1:18 PM Claes Redestad
> > > <claes.redes...@oracle.com> wrote:
> > >
> > >
> > > Hi Volker,
> > >
> > > On 2020-04-15 19:48, Volker Simonis wrote:
> > >
> > > While doing this change, I've also realized that all the streams in
> > > java.util.zip (i.e. DeflaterInputStream, GZIPInputStream,
> > > GZIPOutputStream, InflaterInputStream, DeflaterOutputStream) use an
> > > internal byte buffer of 512 bytes by default. Looking at the benchmark
> > > attached to JDK-8242864, I think that increasing this default to a
> > > bigger size (e.g. 4096 bytes) will considerably speed up (up to 50%)
> > > read and write operations on these streams when they are created with
> > > the default buffer size. I think the value "512" is a legacy of old
> > > times when memory was more precious:)  so  I've opened "JDK-8242864:
> > > Increase the default, internal buffer size of the Streams in
> > > java.util.zip" to track that as as separate issue. Do you think it
> > > makes sense to increase that default value?
> > >
> > >
> > > Seems reasonable. 8192 seems to be the buffer size we've been
> > converging
> > > on elsewhere (see InputStream, BufferedInputStream, Files, ..). I also
> > >
> > >
> > > That seems reasonable. Alan commented on the JBS issue so we can
> > > continue the discussion there.
> > >
> > > found an instance of 8096, which is either a typo or a clever
> > > optimization to keep the array + array object header fit snugly within
> > > 8Kb. You chose. :-)
> > >
> > >
> > > I like how you try to be positive :)
> > >
> > >
> > > Thank you and best regards,
> > > Volker
> > >
> > > PS: do you think it makes sense to contribute the benchmark attached
> > > to JDK-8242864 to the code-tools/mh-jdk-microbenchmarks [1] project?
> > >
> > > [1]http://openjdk.java.net/projects/code-tools/jmh-jdk-
> > microbenchmarks/
> > >
> > >
> > > I'd definitely welcome the micro as part of the patch under
> > > test/micro/org/openjdk/bench/java/util/zip - additionally contributing
> > >
> > >
> > > I knew that "jmh-jdk-microbenchmarks" has been copied to the jdk repo
> > > but somehow I did found "jmh-jdk-microbenchmarks" before looking in
> > > the obvious place :)
> > >
> > > So I've added the benchmark to the patch now. There's one thing I'm
> > > not sure however. The benchmark requires a "big" (several 100k) with
> > > good compression ratio (e.g. a large text file). I've decided to use a
> > > big Java source file from "src.zip" but I'm not sure if "src.zip" is
> > > always available in the jdk images which are used to run the
> > > microbenchmarks. Do you think the test it is fine this way or do you
> > > have a better idea? I saw that "ZipFind" uses "microbenchmarks.jar"
> > > (i.e. the container of the test itself) but that file is already
> > > compressed so the compression rate won't be that good.
> > >
> > > Another thing I couldn't figure out is a good way to skip the
> > > benchmark when I realize that I can't load the expected file in the
> > > "@Setup" method. Do you now anything better than just throwing an
> > > exception?
> > >
> > > Thank you and best regards,
> > > Volker
> > >
> > > to jmh-jdk-microbenchmarks could enable you to test the micro on 8 or
> > > 11.
> > >
> > > /Claes
> > >
> > >
> > >
> > > Lance Andersen| Principal Member of Technical Staff | +1.781.442.2037
> > > Oracle Java Engineering
> > > 1 Network Drive
> > > Burlington, MA 01803
> > > lance.ander...@oracle.com
> > >
> > >
> > >
>

Reply via email to