On Thu, 22 Oct 2020 09:08:31 GMT, Andrew Haley <a...@openjdk.org> wrote:
>> 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. > > Andrew Haley has updated the pull request incrementally with one additional > commit since the last revision: > > 8254078: DataOutputStream is very slow post-disabling of Biased Locking Marked as reviewed by rriggs (Reviewer). ------------- PR: https://git.openjdk.java.net/jdk/pull/542