From ee15b49845b9cbe1f8ea75372091931fa460ad0d Mon Sep 17 00:00:00 2001 From: Luca Casonato Date: Wed, 5 Apr 2023 23:13:01 +0200 Subject: perf(ext/io): remove a data copy from File write (#18601) Removes a data copy from all async `File::write` operations. --- ext/io/lib.rs | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) (limited to 'ext') diff --git a/ext/io/lib.rs b/ext/io/lib.rs index 5bb526d4a..2f2e62c11 100644 --- a/ext/io/lib.rs +++ b/ext/io/lib.rs @@ -520,18 +520,22 @@ impl StdFileResource { .await } - async fn write(self: Rc, data: &[u8]) -> Result { - let buf = data.to_owned(); + async fn write( + self: Rc, + view: BufView, + ) -> Result { self - .with_inner_blocking_task(move |inner| inner.write_and_maybe_flush(&buf)) + .with_inner_blocking_task(move |inner| { + let nwritten = inner.write_and_maybe_flush(&view)?; + Ok(deno_core::WriteOutcome::Partial { nwritten, view }) + }) .await } - async fn write_all(self: Rc, data: &[u8]) -> Result<(), AnyError> { - let buf = data.to_owned(); + async fn write_all(self: Rc, view: BufView) -> Result<(), AnyError> { self .with_inner_blocking_task(move |inner| { - inner.write_all_and_maybe_flush(&buf) + inner.write_all_and_maybe_flush(&view) }) .await } @@ -644,7 +648,15 @@ impl Resource for StdFileResource { Box::pin(self.read_byob(buf)) } - deno_core::impl_writable!(with_all); + fn write( + self: Rc, + view: deno_core::BufView, + ) -> AsyncResult { + Box::pin(self.write(view)) + } + fn write_all(self: Rc, view: deno_core::BufView) -> AsyncResult<()> { + Box::pin(self.write_all(view)) + } #[cfg(unix)] fn backing_fd(self: Rc) -> Option { -- cgit v1.2.3