perf: is_executable calls fs_access for every file on every reload
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 72/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- lua, neovim
- Domain
- devtools, performance
Research direction
Start by locating utils.is_executable and the two call sites described: new FileNode creation and Explorer:reload, where lstat is already available. Check how the stat exposes file type and execute bits, then compare behavior with the existing fs_access checks. Done when regular files without execute bits skip that syscall while directories, links, and executable files retain their current behavior.
Written by the indexing model from the issue text.
Description
Problem
utils.is_executable calls vim.uv.fs_access(path, "X") for:
- every new
FileNode, and - every existing node on every
Explorer:reload.
The node's lstat result is already available at both call sites.
Impact
fs_access costs 7.7µs per call vs 1.9µs for lstat. is_executable is about 11% of reload_explorer on a fully expanded 16.8k-node tree.
Proposed fix
Pass the existing stat into is_executable. A regular file with none of the user, group or other execute bits set can never pass access(X), even as root, so return false without the syscall. Files with execute bits, directories and links still use fs_access, happy to follow up with a PR soon.
Environment: macOS, Nvim v0.13.0-dev, LuaJIT 2.1. Test repo: 16.8k files and folders, 3.1k git status entries (modified, untracked, ignored). Measured headless with vim.uv.hrtime() and the LuaJIT profiler (jit.p).
- Dominant language
- Lua
- Stars
- 8.7k
- Forks
- 642
- Avg merge
- 1d 4m
- Merged PRs (30d)
- 11
Getting set up
- No Dockerfile or Docker Compose file
- No pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from nvim-tree/nvim-tree.lua
-
Difficulty 2/5 1-3 hours Newbie friendliness 77/100
nvim-tree/nvim-tree.lua#3382 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
nvim-tree/nvim-tree.lua#3381 ·
Maintainers usually reply within 1 day
-
Use vim.Option getters and setters instead of directly settingPossibly taken A pull request linked to this issue is open or already merged. Open
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
nvim-tree/nvim-tree.lua#3357 · 1 comment ·
Maintainers usually reply within 1 day
-
Migrate To vim.packOpendocumentation PR please
Difficulty 1/5 Under an hour Newbie friendliness 65/100
nvim-tree/nvim-tree.lua#3179 · 6 comments ·
Maintainers usually reply within 1 day
-
perf: Filters:custom calls getcwd for every file, even with no custom filtersPossibly taken @hood claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 25/100
nvim-tree/nvim-tree.lua#3386 ·
Maintainers usually reply within 1 day
All issues in nvim-tree/nvim-tree.lua
Similar issues
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 67/100
Maintainers usually reply within 1 day
-
bug confirmed discord guide:tyrs-watch locale:enUS navigation v0.3.2
Difficulty 2/5 1-3 hours Newbie friendliness 67/100
fitzforge/polestar#855 · 1 comment ·
Maintainers usually reply within 1 day
-
translation
Difficulty 2/5 1-3 hours Newbie friendliness 64/100
KristanLaimon/PanelsPlus#16 ·
-
Bug
Difficulty 1/5 Under an hour Newbie friendliness 91/100
DennisRas/WeeklyKnowledge#164 ·
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
Maintainers usually reply within 1 day