perf: renderer highlights via vim.hl.range are slow on large trees

Offen Anfängerfreundlich
#3,381 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Anfängerfreundlichkeit
78/100
Issue-Typ
Refactoring
Klarheit
Klar beschrieben
Aktivitätsstatus
Aktiv
Tech-Stack
lua

Rechercherichtung

Beginne bei Renderer:render_hl und verfolge, wie es einzeilige Byte-Bereiche und Prioritäten anwendet. Vergleiche die vorhandenen Aufrufe von vim.hl.range mit nvim_buf_set_extmark unter Verwendung von vim.hl.priorities.user; überprüfe, ob die resultierenden Hervorhebungen identisch sind, und miss die Rendering-Zeit bei einem großen Baum. Fertig ist die Aufgabe, wenn die direkten Extmark-Aufrufe dieselben Bereiche, Prioritäten und dasselbe Erscheinungsbild beibehalten und gleichzeitig die Rendering-Zeit reduzieren.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

Problem

Renderer:render_hl applies every highlight of every line with vim.hl.range. That function is generic: on each call it switches buffer context with vim._with, calls col('$') twice and calls getregionpos. nvim-tree's ranges are always single-line byte ranges, so none of that work is needed.

Impact

µs per highlight
vim.hl.range 6.1
nvim_buf_set_extmark 0.74

At 16.8k visible lines, render_hl is about 50% of Renderer:draw() (620ms) and about 15% of reload_explorer.

Proposed fix

Call nvim_buf_set_extmark directly with the same ranges and the same priority (vim.hl.priorities.user). The highlights produced are identical. Happy to provide a PR for this ofc.

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).

Vorherrschende Sprache
Lua
Sterne
8.7k
Forks
642
Ø Merge
23 Std. 23 Min.
Gemergte PRs (30 T.)
11

Entwicklungsumgebung

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus nvim-tree/nvim-tree.lua

Alle Issues in nvim-tree/nvim-tree.lua

Ähnliche Issues

Weitere Issues zu Lua

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.