qazcetelic
06/14/2026, 3:32 PMrs
#[tokio::test]
async fn opendal_vs_tokio_write() {
// Payload of 1024 bytes
let mut payload = String::with_capacity(1024);
for _ in 0..payload.capacity() {
payload.push('A');
}
let payload: &'static str = payload.leak();
let total_files = 1000;
let runs = 10;
let root = "/tmp/ramdisk/files";
// OpenDAL
let op = Operator::new(services::Fs::default().root(root))
.expect("Failed to create operator")
.finish();
let mut opendal_elapsed = Duration::ZERO;
let mut tokio_elapsed = Duration::ZERO;
for _ in 0..runs {
let start_opendal = tokio::time::Instant::now();
for i in 0..total_files {
op.write(&i.to_string(), payload).await.unwrap();
}
for i in 0..total_files {
op.delete(&i.to_string()).await.unwrap();
}
let end_opendal = tokio::time::Instant::now();
// Tokio
for i in 0..total_files {
fs::write(&format!("{root}/{i}"), payload).await.unwrap();
}
for i in 0..total_files {
fs::remove_file(&format!("{root}/{i}")).await.unwrap();
}
let end_tokio = tokio::time::Instant::now();
opendal_elapsed += end_opendal - start_opendal;
tokio_elapsed += end_tokio - end_opendal;
}
let opendal_throughput = (total_files * runs) as f64 / opendal_elapsed.as_secs_f64();
let tokio_throughput = (total_files * runs) as f64 / tokio_elapsed.as_secs_f64();
println!(" Total files : {}", total_files);
println!(" Throughput OpenDAL : {}", opendal_throughput); // 5505.096180388658
println!(" Duration OpenDAL : {:?}", opendal_elapsed); // 181.649869ms
println!(" Throughput Tokio : {}", tokio_throughput); // 24910.126753685377
println!(" Duration Tokio : {:?}", tokio_elapsed); // 40.144316ms
}