想写个简单的对象存储,折腾了两天大框写好了,结果一试,600M的稳健用了102秒,上网一查,这好像还不是个例, tokio::fs里面的东西好像普遍性能低下,而且低的不是一点半点。记得原来看的某篇文章里提过一句,说windows是有原生的异步磁盘操作的, linux下没有,不知道跟这个有没有关系。
想着用std::fs来替换,但是自己定的trait是围绕Stream来的,换的话等于推翻重写。思索在三,决定自己试着实现个Stream试一下。
先说Stream的定义:
pub trait Stream {
type Item;
fn poll_next(
self: Pin<&mut Self>,
cx: &mut Context<'_>
) -> Poll<Option<Self::Item>>;
}
跟Future差不多,只是有细微的差别,重点是对于返回值的定义,除了Ready(Some(Item))和Pending之外,还有个Ready(None)用来告诉调用者,所有内容都读取完毕了。别再poll我了。
以下是实现代码:
impl<T> MyStream<T>
where
T: std::io::Read + Send + Sync,
{
fn new(reader: T) -> Self {
Self {
inner: Arc::new(Mutex::new(reader)),
cap: 1024 * 8,
res: Arc::new(Mutex::new(None)),