On Dec 19, 2017, at 12:52 PM, Paul Sandoz <[email protected]> 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/
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. 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?
Thanks,
Brian