RFR: 8265039: Adjust javadoc for ByteArray*Stream and InputStream

Yi Yang yyang at openjdk.java.net
Mon Apr 12 08:28:08 UTC 2021


On Mon, 5 Apr 2021 08:37:15 GMT, Сергей Цыпанов <github.com+10835776+stsypanov at openjdk.org> wrote:

> 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

Hi, I create the issue https://bugs.openjdk.java.net/browse/JDK-8265039 for this PR��.

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

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


More information about the core-libs-dev mailing list