Each shift() re-slices the remaining array, so draining a large gather of wide bindings awaiting fd 3's drain was O(n^2). Reading by a head index into the array keeps the drain linear; the finally still discards everything.
Each shift() re-slices the remaining array, so draining a large gather of wide bindings awaiting fd 3's drain was O(n^2). Reading by a head index into the array keeps the drain linear; the finally still discards everything.