On Wed, 7 Oct 2020 13:30:14 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.

This pull request has now been integrated.

Changeset: 17f04fc9
Author:    Andrew Haley <a...@openjdk.org>
URL:       https://git.openjdk.java.net/jdk/commit/17f04fc9
Stats:     143 lines in 3 files changed: 132 ins; 0 del; 11 mod

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

Reviewed-by: rriggs, shade, alanb

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

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

Reply via email to