So last time I benchmarked this in the before time, in the long long ago, arrays won hands down if the buffer size remained small (e.g. <4kB)

It might be worth benchmarking to see what the performance impact of this change is. When this code is used with event loop-style I/O it's in the critical path