RFR: 8254078: DataOutputStream is very slow post-disabling of Biased Locking

Andrew Haley aph at openjdk.java.net
Wed Oct 7 13:40:16 UTC 2020


DataOutputStream is very slow post-disabling of Biased Locking. This
was discovered when benchmarking a transaction library, which showed
significant performance loss when moving to JDK 15. WIth some small
changes to DataOutputStream we can get the performance back. There's a
JMH benchmark at
http://cr.openjdk.java.net/~aph/JDK-8254078/jmh-tests.tar

Some Stream classes use very fine-grained locking.

In particular, writeInt is defined like this:

        out.write((v >>> 24) & 0xFF);
        out.write((v >>> 16) & 0xFF);
        out.write((v >>> 8) & 0xFF);
        out.write((v >>> 0) & 0xFF);
        incCount(4);

Unfortunately, ByteArrayOutputStream.write(byte) is defined like this:

    public synchronized void write(int b) {
        ensureCapacity(count + 1);
        buf[count] = (byte) b;
        count += 1;
    }

so we acquire and release a lock for every byte that is output.

 For example, writing 4kb of ints goes from 17.3 us/op to 53.9 us/op when biased locking is disabled:


+UseBiasedLocking DataOutputStreamTest.dataOutputStreamOverByteArray avgt 6 53.895 ± 5.126 us/op
-UseBiasedLocking DataOutputStreamTest.dataOutputStreamOverByteArray avgt 6 17.291 ± 4.430 us/op

There are refactorings of DataOutputStream we can do to mitigate this.

-------------

Commit messages:
 - JDK-8254078: DataOutputStream is very slow post-disabling of Biased Locking

Changes: https://git.openjdk.java.net/jdk/pull/542/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=542&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8254078
  Stats: 11 lines in 1 file changed: 3 ins; 0 del; 8 mod
  Patch: https://git.openjdk.java.net/jdk/pull/542.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/542/head:pull/542

PR: https://git.openjdk.java.net/jdk/pull/542


More information about the core-libs-dev mailing list