cap-std
cap-std copied to clipboard
`create_dir_all` performs a quadradic number of system calls
create_dir_all uses the algorithm from libstd for recursively creating all components. However, cap-primitives' mkdir function performs a system call per path component per call, so calling it once per path component leads to a quadratic number of system calls.
We should add a create_dir_all function in cap-primitives which, for each path component, creates a directory for that component (ignoring a io::ErrorKind::AlreadyExists error), opens the newly created directory, and then uses the resulting handle as the base for handling the next component.
Similar to open_manually, it should handle .. components by keeping a stack of handles as it goes, so that it can simply pop an entry from that stack to ascend to the parent.
And then, the cap-std and cap-async-std create_dir_all routines can use it.
We should also think about adding a function which creates a directory and opens it as a new Dir, for the common case where one does create_dir_all followed by open_dir. If create_dir_all opens the intermediate directories as it goes, then the final open_dir could open just the last component instead of the full path.