stream: switch _writableState.buffer to queue
In cases where many small writes are made to a stream lacking _writev, the array data structure backing the WriteReq buffer would greatly increase GC pressure. Specifically, in the fs.WriteStream case, the clearBuffer routine would only clear a single WriteReq from the buffer before exiting, but would cause the entire backing array to be GC'd. Switching to [].shift lessened pressure, but still the bulk of the time was spent in memcpy. This replaces that structure with a linked list-backed queue so that adding and removing from the queue is O(1). In the _writev case, collecting the buffer requires an O(N) loop over the buffer, but that was already being performed to collect callbacks, so slowdown should be neglible. PR-URL: https://github.com/joyent/node/pull/8826 Reviewed-by:Timothy J Fontaine <tjfontaine@gmail.com> Reviewed-by:
Trevor Norris <trev.norris@gmail.com>
parent
93533e98