RFR: 8265039: Adjust javadoc for ByteArray*Stream and InputStream
Сергей Цыпанов
github.com+10835776+stsypanov at openjdk.java.net
Mon Apr 12 08:28:04 UTC 2021
Hello,
to avoid cases detected in [https://github.com/openjdk/jdk/pull/2992](https://github.com/openjdk/jdk/pull/2992) I propose to modify JavaDoc of `ByteArray*Stream` to explicitly mention redundancy of wrapping with `BufferedInputStream`.
As of `InputStream` I think in notation `It is never correct to use the return value of this method to allocate a buffer intended to hold all data in this stream.` the word 'never' should be replaced with 'usually': apart from `ByteArrayInputStream` e.g. `FileInputStream.available()` often returns the count of remaining bytes (the only exclusion I'm aware of is the files located under `/proc/`) and indeed this count can be used to allocate a buffer to read all the bytes in one call.
Consider benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class ByteArrayInputStreamBenchmark {
@Benchmark
public void read(Data data, Blackhole bh) {
int value;
var in = data.bais;
while ((value = in.read()) != -1) {
bh.consume(value);
}
}
@Benchmark
public void readBuffered(Data data, Blackhole bh) throws IOException {
int value;
var in = new BufferedInputStream(data.bais);
while ((value = in.read()) != -1) {
bh.consume(value);
}
}
@Benchmark
public Object readAllBytes(Data data) {
var in = data.bais;
return in.readAllBytes();
}
@Benchmark
public Object readAllBytesBuffered(Data data) throws IOException {
var in = data.bais;
return new BufferedInputStream(in).readAllBytes();
}
@State(Scope.Thread)
public static class Data {
@Param({"8", "128", "512", "1024"})
private int length;
private byte[] bytes;
private ByteArrayInputStream bais;
@Setup(Level.Iteration)
public void setUp() {
bytes = new byte[length];
ThreadLocalRandom.current().nextBytes(bytes);
}
@Setup(Level.Invocation)
public void setUpBais() {
bais = new ByteArrayInputStream(bytes);
}
}
}
giving
(length) Score Error Units
read 8 55.737 ± 0.431 ns/op
read 128 533.172 ± 1.613 ns/op
read 512 2066.238 ± 23.989 ns/op
read 1024 4335.570 ± 20.137 ns/op
readBuffered 8 521.936 ± 2.454 ns/op
readBuffered 128 971.617 ± 100.469 ns/op
readBuffered 512 2284.472 ± 251.390 ns/op
readBuffered 1024 4168.598 ± 77.980 ns/op
readAllBytes 8 34.850 ± 0.072 ns/op
readAllBytes 128 36.751 ± 0.133 ns/op
readAllBytes 512 45.304 ± 0.699 ns/op
readAllBytes 1024 61.790 ± 0.386 ns/op
readAllBytesBuffered 8 870.454 ± 4.406 ns/op
readAllBytesBuffered 128 910.176 ± 32.258 ns/op
readAllBytesBuffered 512 896.155 ± 6.005 ns/op
readAllBytesBuffered 1024 965.596 ± 29.225 ns/op
read:·gc.alloc.rate.norm 8 32.006 ± 0.001 B/op
read:·gc.alloc.rate.norm 128 32.007 ± 0.004 B/op
read:·gc.alloc.rate.norm 512 32.010 ± 0.010 B/op
read:·gc.alloc.rate.norm 1024 32.011 ± 0.008 B/op
readBuffered:·gc.alloc.rate.norm 8 8280.354 ± 0.016 B/op
readBuffered:·gc.alloc.rate.norm 128 8240.484 ± 0.015 B/op
readBuffered:·gc.alloc.rate.norm 512 8240.599 ± 0.056 B/op
readBuffered:·gc.alloc.rate.norm 1024 8280.978 ± 0.024 B/op
readAllBytes:·gc.alloc.rate.norm 8 56.008 ± 0.001 B/op
readAllBytes:·gc.alloc.rate.norm 128 176.017 ± 0.001 B/op
readAllBytes:·gc.alloc.rate.norm 512 560.035 ± 0.002 B/op
readAllBytes:·gc.alloc.rate.norm 1024 1072.057 ± 0.002 B/op
readAllBytesBuffered:·gc.alloc.rate.norm 8 16512.660 ± 0.026 B/op
readAllBytesBuffered:·gc.alloc.rate.norm 128 16632.684 ± 0.008 B/op
readAllBytesBuffered:·gc.alloc.rate.norm 512 17016.694 ± 0.017 B/op
readAllBytesBuffered:·gc.alloc.rate.norm 1024 17528.748 ± 0.012 B/op
-------------
Commit messages:
- Adjust javadoc for ByteArray*Stream
Changes: https://git.openjdk.java.net/jdk/pull/3341/files
Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=3341&range=00
Issue: https://bugs.openjdk.java.net/browse/JDK-8265039
Stats: 20 lines in 3 files changed: 7 ins; 0 del; 13 mod
Patch: https://git.openjdk.java.net/jdk/pull/3341.diff
Fetch: git fetch https://git.openjdk.java.net/jdk pull/3341/head:pull/3341
PR: https://git.openjdk.java.net/jdk/pull/3341
More information about the core-libs-dev
mailing list