> On 19 Dec 2017, at 13:43, Brian Burkhalter <brian.burkhal...@oracle.com> 
> wrote:
> 
> On Dec 19, 2017, at 12:52 PM, Paul Sandoz <paul.san...@oracle.com 
> <mailto:paul.san...@oracle.com>> wrote:
> 
>> For the case of reading 2^N bytes i believe you can avoid doing a last copy 
>> by checking if “n < 0" within the “nread > 0” block when “nread == 
>> DEAFULT_BUFFER_SIZE”. That might close the perf gap for smaller cases. You 
>> can also move "nread = 0” to the same block e.g.:
>> 
>>  var copy = (n < 0 && nread == DEAFULT_BUFFER_SIZE) ? buf : 
>> Arrays.copyOf(buf, nread);
>>  list.add(copy)
>>  nread = 0;
> 
> Definitely improves performance and memory footprint for this case.
> 
>> 262         byte[] output = new byte[total];
>> 263         int offset = 0;
>> 264         int numCached = list.size();
>> 265         for (int i = 0; i < numCached; i++) {
>> 266             byte[] b = list.get(i);
>> 267             System.arraycopy(b, 0, output, offset, b.length);
>> 268             offset += b.length;
>> 269         }
>> 
>> You can simplify to:
>> 
>> var result = new byte[total];
>> int offset = 0;
>> for (buf : list) {
>>  System.arraycopy(buf, 0, result, offset, buf.length);
>>  offset += buf.length;
>> }
> 
> Oh, yes, of course.
> 
>> s/list/bufs and then you can use var for the declarations at the start of 
>> the method.
> 
> Done. Updated: http://cr.openjdk.java.net/~bpb/8193832/webrev.01/ 
> <http://cr.openjdk.java.net/~bpb/8193832/webrev.01/>
> 

You can also simplify the “for(;;) + break" into a do while loop:

do {
  int nread = 0;
  ...
} while (n > 0);


> Good suggestions! Not sure however about line 237 as with var it has to be 
> “var n = 0;” instead of simply “int n;” with no initialization.

I was only suggesting it’s use for the byte[] and ArrayList<byte[]>. IMHO it’s 
a little subjective but there is less upside for int, although one can argue 
consistent application and explicit initialization is a good thing here.


> Also I’ve not tested the effect of the initial List capacity at line 233: the 
> current value of 128 is arbitrary - might be better to go with the default?
> 

My inclination would be to use 8 instead of 128, that allows 2^16 in size by 
default, rather than 2^20.

Paul.

Reply via email to