Hello,

I am a researcher in Java code optimization, and in my research I have
found an optimization for Batik (version 1.7) that provides a 4.8x
throughput improvement according to the Dacapo Benchmark Suite
<http://dacapobench.org/>.

The optimization is obtained by changing this line
<http://svn.apache.org/viewvc/xmlgraphics/batik/trunk/batik-codec/src/main/java/org/apache/batik/ext/awt/image/codec/png/PNGImageEncoder.java?view=markup#l451>
in
the PNGImageEncoder class:
private void writeIDAT() throws IOException {
        IDATOutputStream ios = new IDATOutputStream(dataOutput, 8192);
        // This line is the bottleneck.
        DeflaterOutputStream dos =
            new DeflaterOutputStream(ios, new Deflater(9));

By specifying a deflation/compression level of 1 instead of 9, throughput
is improved by 4.8x when run on the Dacapo benchmarking suite (on my
six-core Xeon e5-2620 v3 machine with a 15 MB L3 cache and 16 GB of RAM).
It appears that deflating a compressed image was a big bottleneck in the
system. Both my profiler, as well as Xprof and Hprof identified this
bottleneck.

I have not tried running the benchmark on the latest code release (I ran it
on 1.7), but I see that the deflation metric is still set to 9 even on the
latest branch.

I have no experience at all using Batik, but I thought you would be
interested in hearing about this potential very simple and significant
performance improvement for what seems like an important feature in the
library. Please let me know if you would like me to try re-running my
optimization on the latest codepath, and I will do so and let you know what
my results are.

Regards,

-- 
David Vernet
Master of Science in Computer Science Student
Carnegie Mellon University
Class of 2016

Reply via email to