pub mod sender;
pub mod receiver;
pub mod async_impl;
pub mod batch_processor;
use std::collections::{BTreeMap, HashMap};
use std::sync::{Arc, Mutex};
use std::time::{Duration, Instant};
pub use sender::{
ZeroCopySender, ZeroCopySenderConfig, ZeroCopySenderStats,
ZeroCopyDirection,
};
pub use receiver::{
ZeroCopyReceiver, ZeroCopyReceiverConfig, ZeroCopyReceiverStats,
};
#[derive(Debug, Clone, Default)]
pub struct ZeroCopyMetrics {
pub total_bytes_transferred: u64,
pub total_operations: u64,
pub avg_transfer_speed: f64,
pub peak_transfer_speed: f64,
pub zero_copy_success_rate: f64,
pub memory_copy_saved: u64,
pub syscalls_reduced: u64,
}
#[derive(Debug)]
pub struct ZeroCopyMonitor {
metrics: Arc<Mutex<ZeroCopyMetrics>>,
start_time: Instant,
}
impl ZeroCopyMonitor {
pub fn new() -> Self {
Self {
metrics: Arc::new(Mutex::new(ZeroCopyMetrics::default())),
start_time: Instant::now(),
}
}
pub fn record_success(&self, bytes: u64, duration: Duration) {
let mut metrics = self.metrics.lock().unwrap();
metrics.total_bytes_transferred += bytes;
metrics.total_operations += 1;
if duration.as_secs_f64() > 0.0 {
let speed: _ = bytes as f64 / duration.as_secs_f64();
if metrics.total_operations == 1 {
metrics.avg_transfer_speed = speed;
} else {
metrics.avg_transfer_speed = (metrics.avg_transfer_speed
* (metrics.total_operations - 1) as f64
+ speed)
/ metrics.total_operations as f64;
}
if speed > metrics.peak_transfer_speed {
metrics.peak_transfer_speed = speed;
}
}
metrics.memory_copy_saved += bytes * 2;
metrics.syscalls_reduced += 5; }
pub fn record_failure(&self) {
let mut metrics = self.metrics.lock().unwrap();
metrics.total_operations += 1;
}
pub fn get_metrics(&self) -> ZeroCopyMetrics {
self.metrics.lock().unwrap().clone()
}
pub fn calculate_success_rate(&self, total_attempts: u64) -> f64 {
let metrics: _ = self.metrics.lock().unwrap();
if total_attempts > 0 {
(metrics.total_operations as f64 / total_attempts as f64) * 100.0
} else {
0.0
}
}
pub fn generate_report(&self) -> String {
let metrics: _ = self.metrics.lock().unwrap();
let elapsed: _ = self.start_time.elapsed();
format!(
r#"
零拷贝 I/O 性能报告
====================
运行时间: {:.2} 秒
总传输字节数: {} bytes ({:.2} MB)
总操作次数: {}
平均传输速度: {:.2} bytes/sec ({:.2} MB/sec)
峰值传输速度: {:.2} bytes/sec ({:.2} MB/sec)
内存拷贝节省量: {} bytes ({:.2} MB)
系统调用减少数量: {}
零拷贝成功率: {:.1}%
性能提升倍数: {:.2}x
"#,
elapsed.as_secs_f64(),
metrics.total_bytes_transferred,
metrics.total_bytes_transferred as f64 / 1024.0 / 1024.0,
metrics.total_operations,
metrics.avg_transfer_speed,
metrics.avg_transfer_speed / 1024.0 / 1024.0,
metrics.peak_transfer_speed,
metrics.peak_transfer_speed / 1024.0 / 1024.0,
metrics.memory_copy_saved,
metrics.memory_copy_saved as f64 / 1024.0 / 1024.0,
metrics.syscalls_reduced,
metrics.zero_copy_success_rate,
if metrics.avg_transfer_speed > 0.0 {
metrics.avg_transfer_speed / 1000000.0 } else {
0.0
}
)
}
}
impl Default for ZeroCopyMonitor {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, thiserror::Error)]
pub enum ZeroCopyError {
#[error("I/O 错误: {0}")]
Io(#[from] std::io::Error),
#[error("系统调用不支持: {0}")]
Unsupported(String),
#[error("资源不足")]
ResourceExhausted,
#[error("超时错误")]
Timeout,
#[error("配置错误: {0}")]
Config(String),
}
#[derive(Debug, Clone)]
pub struct ZeroCopyConfig {
pub buffer_size: usize,
pub max_concurrent_transfers: usize,
pub transfer_timeout: Duration,
pub enable_compression: bool,
pub compression_algorithm: String,
}
impl Default for ZeroCopyConfig {
fn default() -> Self {
Self {
buffer_size: 64 * 1024,
max_concurrent_transfers: 10,
transfer_timeout: Duration::from_secs(30),
enable_compression: false,
compression_algorithm: "lz4".to_string(),
}
}
}