Ticket #2836 (new enhancement)
Faster directory load in certain (specific) cases
Reported by: | gotar | Owned by: | |
---|---|---|---|
Priority: | major | Milestone: | Future Releases |
Component: | mc-core | Version: | master |
Keywords: | Cc: | ||
Blocked By: | Blocking: | ||
Branch state: | no branch | Votes for changeset: |
Description
If there's a need to enter directory containing thousands of entries, calling lstat() for every one of them is very expensive ...and sometimes not necessary. My suggestion:
- make use of AC_STRUCT_DIRENT_D_TYPE to check for dirent.d_type existence for the rest to work at all,
- if:
- user has set some new option (like 'quick_cd' to be >0),
- current panel view doesn't include UID/GID/mode/*time etc. (higher levels of 'quick_cd' may further narrow it down, I think quick_cd=1 should strip on size only, 2 for size and *time, and 3 ignore all the attributes),
- then:
- handle_dirent() for d_type==DT_DIR should skip mc_lstat(), instead put some predefined values (0s) when called from do_load_dir(),
- keep it as it is for do_reload_dir(),
- alt-t for such partial directory listing should reload directory when required (if some not loaded attrs need to be displayed).
This way quick_cd=1 omits lstat() for directories, when current panel view requests type/name/size - only size is lost and this is usually useless (and fast to retrieve via ctrl-space). With higher levels one can expand this behaviour up to entirely disabling lstat() for directories. Still, ctrl-r would bring all the data back.
Note: See
TracTickets for help on using
tickets.
It could do even better in general (without any extra option) - when panel is sorted by name, mc_lstat() might be called only for visible files (unless already loaded).