perf: 使用 2MB 内存缓冲区以减少系统调用次数,加快文件下载速度

This commit is contained in:
amtoaer
2026-06-08 19:37:27 +08:00
parent 116ae79578
commit 8dd5a0dd1d
+7 -5
View File
@@ -8,7 +8,7 @@ use async_tempfile::TempFile;
use futures::TryStreamExt; use futures::TryStreamExt;
use reqwest::{Method, StatusCode, header}; use reqwest::{Method, StatusCode, header};
use tokio::fs::{self}; use tokio::fs::{self};
use tokio::io::{AsyncSeekExt, AsyncWriteExt}; use tokio::io::{AsyncSeekExt, AsyncWriteExt, BufWriter};
use tokio::process::Command; use tokio::process::Command;
use tokio::task::JoinSet; use tokio::task::JoinSet;
use tokio_util::io::StreamReader; use tokio_util::io::StreamReader;
@@ -155,8 +155,9 @@ impl Downloader {
.error_for_status_ext()?; .error_for_status_ext()?;
let expected = resp.header_content_length(); let expected = resp.header_content_length();
let mut stream_reader = StreamReader::new(resp.bytes_stream().map_err(std::io::Error::other)); let mut stream_reader = StreamReader::new(resp.bytes_stream().map_err(std::io::Error::other));
let received = tokio::io::copy(&mut stream_reader, file).await?; let mut file_writer = BufWriter::with_capacity(2 * 1024 * 1024, file);
file.flush().await?; let received = tokio::io::copy(&mut stream_reader, &mut file_writer).await?;
file_writer.flush().await?;
if let Some(expected) = expected { if let Some(expected) = expected {
ensure!( ensure!(
received == expected, received == expected,
@@ -244,8 +245,9 @@ impl Downloader {
); );
} }
let mut stream_reader = StreamReader::new(resp.bytes_stream().map_err(std::io::Error::other)); let mut stream_reader = StreamReader::new(resp.bytes_stream().map_err(std::io::Error::other));
let received = tokio::io::copy(&mut stream_reader, &mut file_clone).await?; let mut file_writer = BufWriter::with_capacity(2 * 1024 * 1024, file_clone);
file_clone.flush().await?; let received = tokio::io::copy(&mut stream_reader, &mut file_writer).await?;
file_writer.flush().await?;
ensure!( ensure!(
received == end - start + 1, received == end - start + 1,
"downloaded bytes mismatch: expected {}, got {}", "downloaded bytes mismatch: expected {}, got {}",