cap-std icon indicating copy to clipboard operation
cap-std copied to clipboard

`create_dir_all` performs a quadradic number of system calls

Open sunfishcode opened this issue 5 years ago • 3 comments

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.

sunfishcode avatar Jul 17 '20 21:07 sunfishcode

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.

sunfishcode avatar Jul 27 '20 23:07 sunfishcode