Speed up by reusing tokio instance #6

closed
opened by danabra.mov targeting main

Claude claims this is faster

  Changes:
  1. Added rt: tokio::runtime::Runtime field to PdsFs<R> struct
  2. Initialize runtime once in new() method
  3. Replaced two instances of Runtime::new().unwrap():
    - In attr() method (line 169-171) → now uses self.rt
    - In read() method (line 388-391) → now uses self.rt

  Measured performance improvement:
  - Before: 10.981 seconds (cold cache)
  - After: 1.769 seconds (cold cache)
  - Speedup: 6.2x faster

  The optimization eliminates the massive overhead of creating ~22,000 Tokio runtimes (one per file) during directory
   listing operations. Builds cleanly with no warnings.
Changed files
+8 -4
src
+8 -4
src/fs.rs
···
pub struct PdsFs<R> {
repos: IndexMap<String, Repository<R>>,
inodes: IndexSet<PdsFsEntry>,
+
rt: tokio::runtime::Runtime,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
···
PdsFs {
repos: Default::default(),
inodes: IndexSet::from([PdsFsEntry::Zero, PdsFsEntry::Root]),
+
rt: tokio::runtime::Runtime::new().unwrap(),
}
}
···
let did = self.inodes[col.parent].unwrap_did();
let repo = &mut self.repos[did];
let key = format!("{}/{}", col.nsid, r.rkey);
-
let rt = tokio::runtime::Runtime::new().unwrap();
-
let size = rt
+
let size = self
+
.rt
.block_on(repo.get_raw::<ipld_core::ipld::Ipld>(&key))
.ok()
.flatten()
···
_lock: Option<u64>,
reply: fuser::ReplyData,
) {
-
let rt = tokio::runtime::Runtime::new().unwrap();
if let Some(PdsFsEntry::Record(r)) = self.inodes.get_index(ino as usize) {
let col = self.inodes[r.parent].unwrap_collection();
let did = self.inodes[col.parent].unwrap_did();
let repo = &mut self.repos[did];
let key = format!("{}/{}", col.nsid, r.rkey);
-
if let Ok(Some(val)) = rt.block_on(repo.get_raw::<ipld_core::ipld::Ipld>(&key)) {
+
if let Ok(Some(val)) = self
+
.rt
+
.block_on(repo.get_raw::<ipld_core::ipld::Ipld>(&key))
+
{
reply.data(&serde_json::to_string(&val).unwrap().as_bytes()[offset as usize..]);
return;
}