Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8254078

DataOutputStream is very slow post-disabling of Biased Locking

XMLWordPrintable

    • b24

      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.

      With biased locking we don't see the pain because the acquire and release operations are basically no-ops, and C2 optimizes the whole lot away. Without biased locking, things are very much worse.

      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.

            aph Andrew Haley
            aph Andrew Haley
            Votes:
            0 Vote for this issue
            Watchers:
            6 Start watching this issue

              Created:
              Updated:
              Resolved: