Skip to content

Commit dd7ab4c

Browse files
perf(net): fallback to write if write_vectored has just 1 chunk
1 parent 35953a4 commit dd7ab4c

File tree

1 file changed

+10
-4
lines changed

1 file changed

+10
-4
lines changed

watermelon-net/src/connection/streaming.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,18 +84,24 @@ where
8484
}
8585

8686
pub fn poll_write_next(&mut self, cx: &mut Context<'_>) -> Poll<io::Result<usize>> {
87-
if !self.encoder.has_remaining() {
87+
let remaining = self.encoder.remaining();
88+
if remaining == 0 {
8889
return Poll::Ready(Ok(0));
8990
}
9091

91-
let write_outcome = if self.socket.is_write_vectored() {
92+
let chunk = self.encoder.chunk();
93+
let write_outcome = if chunk.len() < remaining && self.socket.is_write_vectored() {
9294
let mut bufs = [io::IoSlice::new(&[]); 64];
9395
let n = self.encoder.chunks_vectored(&mut bufs);
94-
debug_assert!(n > 0);
96+
debug_assert!(n >= 2, "perf: chunks_vectored yielded less than 2 chunks despite the apparently fragmented internal encoder representation");
9597

9698
Pin::new(&mut self.socket).poll_write_vectored(cx, &bufs[..n])
9799
} else {
98-
Pin::new(&mut self.socket).poll_write(cx, self.encoder.chunk())
100+
debug_assert!(
101+
!chunk.is_empty(),
102+
"perf: chunk shouldn't be empty given that `remaining > 0`"
103+
);
104+
Pin::new(&mut self.socket).poll_write(cx, chunk)
99105
};
100106

101107
match write_outcome {

0 commit comments

Comments
 (0)