Currently we often convert BAOS to String as
String contents = new String(baos.toByteArray(), StandardCharsets.ISO_8859_1);
which can be made more simple and effective as
String contents = baos.toString(StandardCharsets.ISO_8859_1.name());
BAOS.toByteArray() creates a copy of underlying array which is later decoded inside of String constructor, while BAOS.toString() doesn't create intermediate copy making convertion more memory-effective.
For JDK 8 I've got following results: ``` Benchmark (length) Mode Score Error Units ByteArrayOutputStreamBenchmark.newString 10 avgt 97.420 ± 7.340 ns/op ByteArrayOutputStreamBenchmark.newString 100 avgt 480.689 ± 20.615 ns/op ByteArrayOutputStreamBenchmark.newString 1000 avgt 4717.681 ± 175.550 ns/op
ByteArrayOutputStreamBenchmark.toString 10 avgt 85.578 ± 5.233 ns/op ByteArrayOutputStreamBenchmark.toString 100 avgt 533.850 ± 23.902 ns/op ByteArrayOutputStreamBenchmark.toString 1000 avgt 4703.280 ± 113.713 ns/op
ByteArrayOutputStreamBenchmark.newString:·gc.alloc.rate.norm 10 avgt 134.400 ± 15.271 B/op ByteArrayOutputStreamBenchmark.newString:·gc.alloc.rate.norm 100 avgt 722.401 ± 10.494 B/op ByteArrayOutputStreamBenchmark.newString:·gc.alloc.rate.norm 1000 avgt 6380.016 ± 46.441 B/op
ByteArrayOutputStreamBenchmark.toString:·gc.alloc.rate.norm 10 avgt 109.600 ± 14.586 B/op ByteArrayOutputStreamBenchmark.toString:·gc.alloc.rate.norm 100 avgt 664.002 ± 16.986 B/op ByteArrayOutputStreamBenchmark.toString:·gc.alloc.rate.norm 1000 avgt 5433.618 ± 39.002 B/op
Comment From: sbrannen
This has been merged into master in 65aa2d03f089bb00f7d9e84d63eff7db2180d834 and revised in 6222efc54b326a0c0e27a4abd99bdbbe0fe9d7f7.
Thanks