<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: glmlm</title>
    <description>The latest articles on DEV Community by glmlm (@glmlm).</description>
    <link>https://dev.to/glmlm</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3258168%2F48d6471c-b8a2-4ae6-8577-941126ae3ced.png</url>
      <title>DEV Community: glmlm</title>
      <link>https://dev.to/glmlm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/glmlm"/>
    <language>en</language>
    <item>
      <title>Benchmarking SnaxVim's Startup Performance Against Popular Neovim Distros</title>
      <dc:creator>glmlm</dc:creator>
      <pubDate>Tue, 22 Sep 2026 00:29:00 +0000</pubDate>
      <link>https://dev.to/glmlm/benchmarking-snaxvims-startup-performance-against-popular-neovim-distros-205h</link>
      <guid>https://dev.to/glmlm/benchmarking-snaxvims-startup-performance-against-popular-neovim-distros-205h</guid>
      <description>&lt;p&gt;Fast startup is a small but important part of a pleasant Neovim experience. This benchmark examines how SnaxVim compares with several popular Neovim distros&lt;sup id="fnref1"&gt;1&lt;/sup&gt; using multiple measurement methods.&lt;/p&gt;

&lt;p&gt;For an overview of SnaxVim's design goals and philosophy, see the previous article: &lt;a href="https://dev.to/glmlm/snaxvim-a-minimal-blazingly-fast-neovim-setup-57cf"&gt;SnaxVim – A Minimal, Blazingly Fast Neovim Setup (Only 10 Plugins Included)&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  📋 1. Prerequisites
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Target Distros &amp;amp; Commit Hashes
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Distro Name&lt;/th&gt;
&lt;th&gt;Repository&lt;/th&gt;
&lt;th&gt;Pinned Commit&lt;/th&gt;
&lt;th&gt;Core Configuration Repository&lt;sup id="fnref2"&gt;2&lt;/sup&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SnaxVim&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/SnaxVim/SnaxVim" rel="noopener noreferrer"&gt;SnaxVim/SnaxVim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;81fc9f7&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AstroNvim&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/AstroNvim/template" rel="noopener noreferrer"&gt;AstroNvim/template&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;49a7161&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/AstroNvim/AstroNvim" rel="noopener noreferrer"&gt;AstroNvim/AstroNvim&lt;/a&gt; (&lt;code&gt;aa0545f&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;kickstart.nvim&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/nvim-lua/kickstart.nvim" rel="noopener noreferrer"&gt;nvim-lua/kickstart.nvim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;80743df&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LazyVim&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/LazyVim/starter" rel="noopener noreferrer"&gt;LazyVim/starter&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;803bc18&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/LazyVim/LazyVim" rel="noopener noreferrer"&gt;LazyVim/LazyVim&lt;/a&gt; (&lt;code&gt;9997009&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NvChad&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/NvChad/starter" rel="noopener noreferrer"&gt;NvChad/starter&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;e3572e1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/NvChad/NvChad" rel="noopener noreferrer"&gt;NvChad/NvChad&lt;/a&gt; (&lt;code&gt;add44b9&lt;/code&gt;), &lt;a href="https://github.com/NvChad/ui" rel="noopener noreferrer"&gt;NvChad/ui&lt;/a&gt; (&lt;code&gt;6ced113&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  System Environment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Neovim Version&lt;/strong&gt;: NVIM v0.12.5&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OS / Kernel&lt;/strong&gt;: Linux 6.18.52 x86_64 GNU/Linux&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CPU&lt;/strong&gt;: Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage&lt;/strong&gt;: Western Digital PC SN520 NVMe SSD 512GB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benchmark Tools&lt;/strong&gt;: &lt;a href="https://github.com/sharkdp/hyperfine/releases/tag/v1.20.0" rel="noopener noreferrer"&gt;hyperfine v1.20.0&lt;/a&gt;, &lt;a href="https://github.com/rhysd/vim-startuptime/releases/tag/v1.3.2" rel="noopener noreferrer"&gt;vim-startuptime v1.3.2&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 2. Methodology
&lt;/h2&gt;

&lt;p&gt;Neovim startup measurements vary by tool because each approach uses a different measurement boundary. Although they often show similar broad trends, their absolute values are not directly interchangeable. Startup time is therefore measured using multiple methods to provide a multidimensional view of each Neovim distribution's startup performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Method A: External Process Lifecycle
&lt;/h3&gt;

&lt;p&gt;Measures wall-clock time externally from process launch until the &lt;code&gt;nvim +qa&lt;/code&gt; command exits. This includes Neovim initialization and exit processing, as well as effects from the operating system and execution environment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hyperfine &lt;span class="nt"&gt;--min-runs&lt;/span&gt; 100 &lt;span class="nt"&gt;--warmup&lt;/span&gt; 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Method B: Neovim Startup Timeline
&lt;/h3&gt;

&lt;p&gt;Uses &lt;code&gt;vim-startuptime&lt;/code&gt;, which repeatedly launches Neovim with its built-in &lt;code&gt;--startuptime&lt;/code&gt; option. It focuses on initialization work recorded by Neovim and should not be interpreted as the complete wall-clock time until the editor is visibly ready.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;NVIM_APPNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"DistroName"&lt;/span&gt; vim-startuptime &lt;span class="nt"&gt;-vimpath&lt;/span&gt; nvim &lt;span class="nt"&gt;-count&lt;/span&gt; 100 &lt;span class="nt"&gt;-script&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 8 | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"Total"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Method C: Plugin Initialization to UI Readiness
&lt;/h3&gt;

&lt;p&gt;Measures lazy.nvim's reported startup time. lazy.nvim calculates &lt;code&gt;stats().startuptime&lt;/code&gt; up to the &lt;code&gt;UIEnter&lt;/code&gt; event; the script waits for the subsequent &lt;code&gt;LazyVimStarted&lt;/code&gt; user event and then records the already-calculated value. In this setup, the value is based on Neovim process CPU time rather than external wall-clock time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;1..100&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nv"&gt;NVIM_APPNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"DistroName"&lt;/span&gt; nvim &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"autocmd User LazyVimStarted lua local h, l = pcall(require, 'lazy'); local f = io.open('/tmp/lazy_runs.txt', 'a'); if f and h then f:write(tostring(l.stats().startuptime) .. '&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;'); f:close() end; vim.cmd('qa')"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{if(NR==1){min=$1;max=$1};sum+=$1;if($1&amp;gt;max)max=$1;if($1&amp;lt;min)min=$1} END {if(NR&amp;gt;0) printf "Total Average: %.6f msec\nTotal Max:     %.6f msec\nTotal Min:     %.6f msec\n", sum/NR, max, min; else print "Failed to capture."}'&lt;/span&gt; /tmp/lazy_runs.txt&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📊 3. Results
&lt;/h2&gt;

&lt;p&gt;The chart below provides an overview of the startup performance measured by each benchmark. Lower values indicate faster startup.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffwe6rl8lp8u16edlhmk0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffwe6rl8lp8u16edlhmk0.png" alt=" " width="799" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The table below includes the measured averages and ranges for each benchmark.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Distro&lt;/th&gt;
&lt;th&gt;Method A&lt;br&gt;(hyperfine)&lt;/th&gt;
&lt;th&gt;Method B&lt;br&gt;(vim-startuptime)&lt;/th&gt;
&lt;th&gt;Method C&lt;br&gt;(lazy.nvim)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vanilla Neovim&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;18.4 ± 0.2 ms&lt;br&gt;&lt;small&gt;17.7–19.0 ms&lt;/small&gt;
&lt;/td&gt;
&lt;td&gt;10.2 ms&lt;br&gt;&lt;small&gt;9.9–10.4 ms&lt;/small&gt;
&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SnaxVim&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;22.0 ± 0.7 ms&lt;/strong&gt;&lt;br&gt;&lt;small&gt;17.5–23.3 ms&lt;/small&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;11.0 ms&lt;/strong&gt;&lt;br&gt;&lt;small&gt;10.4–12.4 ms&lt;/small&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;14.2 ms&lt;/strong&gt;&lt;br&gt;&lt;small&gt;12.9–18.6 ms&lt;/small&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NvChad&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;23.6 ± 0.6 ms&lt;br&gt;&lt;small&gt;22.2–25.2 ms&lt;/small&gt;
&lt;/td&gt;
&lt;td&gt;14.1 ms&lt;br&gt;&lt;small&gt;13.3–15.6 ms&lt;/small&gt;
&lt;/td&gt;
&lt;td&gt;16.8 ms&lt;br&gt;&lt;small&gt;15.7–21.4 ms&lt;/small&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LazyVim&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;31.9 ± 1.0 ms&lt;br&gt;&lt;small&gt;30.1–37.7 ms&lt;/small&gt;
&lt;/td&gt;
&lt;td&gt;20.7 ms&lt;br&gt;&lt;small&gt;17.8–23.2 ms&lt;/small&gt;
&lt;/td&gt;
&lt;td&gt;26.6 ms&lt;br&gt;&lt;small&gt;24.6–47.6 ms&lt;/small&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AstroNvim&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;46.0 ± 2.4 ms&lt;br&gt;&lt;small&gt;43.2–67.5 ms&lt;/small&gt;
&lt;/td&gt;
&lt;td&gt;36.7 ms&lt;br&gt;&lt;small&gt;34.2–39.7 ms&lt;/small&gt;
&lt;/td&gt;
&lt;td&gt;43.3 ms&lt;br&gt;&lt;small&gt;40.7–46.4 ms&lt;/small&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;kickstart.nvim&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;82.3 ± 1.2 ms&lt;br&gt;&lt;small&gt;79.1–85.3 ms&lt;/small&gt;
&lt;/td&gt;
&lt;td&gt;59.6 ms&lt;br&gt;&lt;small&gt;55.8–65.7 ms&lt;/small&gt;
&lt;/td&gt;
&lt;td&gt;N/A&lt;sup id="fnref3"&gt;3&lt;/sup&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;
  Raw benchmark output
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;hyperfine &lt;span class="nt"&gt;--min-runs&lt;/span&gt; 100 &lt;span class="nt"&gt;--warmup&lt;/span&gt; 10 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="go"&gt;"nvim +qa" \
"NVIM_APPNAME=SnaxVim nvim +qa" \
"NVIM_APPNAME=AstroNvim nvim +qa" \
"NVIM_APPNAME=kickstart.nvim nvim +qa" \
"NVIM_APPNAME=LazyVim nvim +qa" \
"NVIM_APPNAME=NvChad nvim +qa"
Benchmark 1: nvim +qa
  Time (mean ± σ):      18.4 ms ±   0.2 ms    [User: 11.5 ms, System: 5.5 ms]
  Range (min … max):    17.7 ms …  19.0 ms    132 runs

Benchmark 2: NVIM_APPNAME=SnaxVim nvim +qa
  Time (mean ± σ):      22.0 ms ±   0.7 ms    [User: 14.1 ms, System: 6.3 ms]
  Range (min … max):    17.5 ms …  23.3 ms    137 runs

Benchmark 3: NVIM_APPNAME=AstroNvim nvim +qa
  Time (mean ± σ):      46.0 ms ±   2.4 ms    [User: 33.0 ms, System: 10.3 ms]
  Range (min … max):    43.2 ms …  67.5 ms    100 runs

Benchmark 4: NVIM_APPNAME=kickstart.nvim nvim +qa
  Time (mean ± σ):      82.3 ms ±   1.2 ms    [User: 63.2 ms, System: 17.3 ms]
  Range (min … max):    79.1 ms …  85.3 ms    100 runs

Benchmark 5: NVIM_APPNAME=LazyVim nvim +qa
  Time (mean ± σ):      31.9 ms ±   1.0 ms    [User: 21.8 ms, System: 8.4 ms]
  Range (min … max):    30.1 ms …  37.7 ms    100 runs

Benchmark 6: NVIM_APPNAME=NvChad nvim +qa
  Time (mean ± σ):      23.6 ms ±   0.6 ms    [User: 15.7 ms, System: 6.5 ms]
  Range (min … max):    22.2 ms …  25.2 ms    106 runs

Summary
  nvim +qa ran
    1.19 ± 0.04 times faster than NVIM_APPNAME=SnaxVim nvim +qa
    1.28 ± 0.04 times faster than NVIM_APPNAME=NvChad nvim +qa
    1.73 ± 0.06 times faster than NVIM_APPNAME=LazyVim nvim +qa
    2.50 ± 0.13 times faster than NVIM_APPNAME=AstroNvim nvim +qa
    4.46 ± 0.09 times faster than NVIM_APPNAME=kickstart.nvim nvim +qa
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for &lt;/span&gt;d &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; SnaxVim AstroNvim kickstart.nvim LazyVim NvChad&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="gp"&gt;  echo "=== $&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;d:-Vanilla Neovim&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="s2"&gt;"; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;  NVIM_APPNAME=$&lt;/span&gt;&lt;span class="s2"&gt;d vim-startuptime -vimpath nvim -count 100 -script | head -n 8 | grep "&lt;/span&gt;Total&lt;span class="s2"&gt;"; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;span class="go"&gt;done
=== Vanilla Neovim ===
Total Average: 10.187930 msec
Total Max:     10.385000 msec
Total Min:     9.876000 msec
=== SnaxVim ===
Total Average: 10.951630 msec
Total Max:     12.351000 msec
Total Min:     10.382000 msec
=== AstroNvim ===
Total Average: 36.675830 msec
Total Max:     39.715000 msec
Total Min:     34.211000 msec
=== kickstart.nvim ===
Total Average: 59.649840 msec
Total Max:     65.697000 msec
Total Min:     55.834000 msec
=== LazyVim ===
Total Average: 20.696580 msec
Total Max:     23.166000 msec
Total Min:     17.756000 msec
=== NvChad ===
Total Average: 14.090530 msec
Total Max:     15.648000 msec
Total Min:     13.320000 msec
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for &lt;/span&gt;d &lt;span class="k"&gt;in &lt;/span&gt;SnaxVim AstroNvim LazyVim NvChad&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="gp"&gt;  echo "=== $&lt;/span&gt;d &lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="s2"&gt;"; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;  rm -f /tmp/lazy_runs.txt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;  for i in {1..100};&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;do &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;    NVIM_APPNAME=$&lt;/span&gt;&lt;span class="s2"&gt;d nvim -c "&lt;/span&gt;autocmd User LazyVimStarted lua &lt;span class="nb"&gt;local &lt;/span&gt;h, l &lt;span class="o"&gt;=&lt;/span&gt; pcall&lt;span class="o"&gt;(&lt;/span&gt;require, &lt;span class="s1"&gt;'lazy'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;local &lt;/span&gt;f &lt;span class="o"&gt;=&lt;/span&gt; io.open&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/tmp/lazy_runs.txt'&lt;/span&gt;, &lt;span class="s1"&gt;'a'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;f and h &lt;span class="k"&gt;then &lt;/span&gt;f:write&lt;span class="o"&gt;(&lt;/span&gt;tostri
&lt;span class="gp"&gt;ng(l.stats().startuptime) .. '\n');&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;f:close&lt;span class="o"&gt;()&lt;/span&gt; end&lt;span class="p"&gt;;&lt;/span&gt; vim.cmd&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'qa'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;  done;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;  awk '{if(NR==1){min=$&lt;/span&gt;&lt;span class="s2"&gt;1;max=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;};sum+=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;;if(&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;max)max=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;;if(&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;min)min=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;} END {if(NR&amp;gt;0) printf "&lt;/span&gt;Total Average: %.6f msec&lt;span class="se"&gt;\n&lt;/span&gt;Total Max:     %.6f msec&lt;span class="se"&gt;\n&lt;/span&gt;Total Min:     %.6f msec&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;", sum/NR, max, min; else print "&lt;/span&gt;Failed to capture.&lt;span class="s2"&gt;"}' /tmp/lazy_runs.txt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;span class="go"&gt;done
=== SnaxVim ===
Total Average: 14.243575 msec
Total Max:     18.558509 msec
Total Min:     12.912106 msec
=== AstroNvim ===
Total Average: 43.304165 msec
Total Max:     46.438125 msec
Total Min:     40.733614 msec
=== LazyVim ===
Total Average: 26.630609 msec
Total Max:     47.604416 msec
Total Min:     24.621206 msec
=== NvChad ===
Total Average: 16.785274 msec
Total Max:     21.369776 msec
Total Min:     15.704555 msec
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📝 4. Summary
&lt;/h2&gt;

&lt;p&gt;SnaxVim was the fastest among the tested distributions in all three benchmarks, outperforming every other distribution in each applicable measurement.&lt;br&gt;
Its advantage over NvChad ranged from approximately 7% to 22%, depending on the measurement method.&lt;/p&gt;

&lt;p&gt;LazyVim ranked third overall, while AstroNvim and kickstart.nvim recorded the highest startup times.&lt;br&gt;
In the benchmarks that allowed a direct comparison, the distribution ranking was consistent: SnaxVim was followed by NvChad, LazyVim, AstroNvim, and kickstart.nvim.&lt;/p&gt;

&lt;p&gt;The three methods measure different parts of the startup process, so their absolute values should not be compared directly. However, the consistent results across the available measurements suggest that SnaxVim's performance was not specific to a single benchmarking approach.&lt;/p&gt;

&lt;p&gt;If fast startup is important to your Neovim workflow, consider giving SnaxVim a try.&lt;/p&gt;

&lt;p&gt;🔗 GitHub: &lt;a href="https://github.com/SnaxVim/SnaxVim" rel="noopener noreferrer"&gt;https://github.com/SnaxVim/SnaxVim&lt;/a&gt;&lt;/p&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;In this article, "Neovim distro" is used broadly to include preconfigured Neovim setups and starter templates.&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn2"&gt;
&lt;p&gt;"Core Configuration Repository" refers to the separate repository or repositories that provide the core configuration framework for a starter template. "N/A" indicates that the configuration is self-contained.&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn3"&gt;
&lt;p&gt;lazy.nvim startup statistics were not available for kickstart.nvim because it does not use lazy.nvim as its plugin manager.&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>neovim</category>
      <category>productivity</category>
      <category>performance</category>
      <category>benchmark</category>
    </item>
    <item>
      <title>🚀 SnaxVim – A Minimal, Blazingly Fast Neovim Setup (Only 10 Plugins Included)</title>
      <dc:creator>glmlm</dc:creator>
      <pubDate>Thu, 12 Jun 2025 12:00:00 +0000</pubDate>
      <link>https://dev.to/glmlm/snaxvim-a-minimal-blazingly-fast-neovim-setup-57cf</link>
      <guid>https://dev.to/glmlm/snaxvim-a-minimal-blazingly-fast-neovim-setup-57cf</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;SnaxVim is a minimal starting point for building your own Neovim setup. It’s aimed at those who want just the essentials for a fast, IDE-like experience — with a startup time that seems noticeably faster than many other distros I’ve tried.&lt;/p&gt;

&lt;p&gt;It includes only 10 well-chosen plugins and avoids layers of abstraction, making it easier to learn and customise — similar in spirit to &lt;em&gt;kickstart.nvim&lt;/em&gt;, but designed to be even more minimal and curated in its plugin selection.&lt;/p&gt;

&lt;p&gt;🔗 GitHub: &lt;a href="https://github.com/SnaxVim/SnaxVim" rel="noopener noreferrer"&gt;https://github.com/SnaxVim/SnaxVim&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Gallery
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwv7kx8odr0d7wa2l8o45.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwv7kx8odr0d7wa2l8o45.png" alt="Diagnostics and Completion" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqdhbmu1r67djpt569ojl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqdhbmu1r67djpt569ojl.png" alt="Debugging" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhoytwhrmbvos4bxzk47s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhoytwhrmbvos4bxzk47s.png" alt="Fuzzy Finder" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  My Journey to Neovim
&lt;/h2&gt;

&lt;p&gt;Before I started using Neovim, I wasn't even aware of things like LSP or DAP. In VSCode, everything just worked as soon as I installed a few extensions, so I never had to think about how it all fit together. When I tried to turn Neovim into an IDE, I struggled to gather the necessary information. Fortunately, discovering the existence of Neovim Distros helped me a lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with Most Distros
&lt;/h2&gt;

&lt;p&gt;However, when I tried to introduce Neovim to others, I ran into a different kind of problem.&lt;/p&gt;

&lt;p&gt;Many Neovim Distros deploy their configurations in locations separate from the standard configuration directory. As a result, it's often difficult for beginners to tell whether a particular behaviour comes from Neovim itself or from customisations. On the other hand, there are setups like &lt;em&gt;&lt;a href="https://github.com/nvim-lua/kickstart.nvim" rel="noopener noreferrer"&gt;kickstart.nvim&lt;/a&gt;&lt;/em&gt; that are easy to follow, but the plugins they include tend to be somewhat excessive for the goal of providing just the minimum IDE-like functionality. In addition, their focus on beginner-friendliness often comes at the cost of performance.&lt;/p&gt;

&lt;p&gt;I thought that a setup with a configuration that’s not hidden behind layers of abstraction, a minimal set of plugins to enable IDE-like functionality, and proper use of lazy-loading would be a useful starting point for people new to Neovim. But I wasn’t able to find anything like that, so I decided to create one myself — and that’s how &lt;em&gt;SnaxVim&lt;/em&gt; was born.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plugin Selection Philosophy
&lt;/h2&gt;

&lt;p&gt;SnaxVim selects plugins based on two main criteria: they must be essential for an IDE-like setup and difficult for beginners to configure correctly on their own.&lt;/p&gt;

&lt;p&gt;Some widely used plugins may meet the first criterion but not the second, and are therefore intentionally excluded. &lt;em&gt;&lt;a href="https://github.com/lewis6991/gitsigns.nvim" rel="noopener noreferrer"&gt;gitsigns.nvim&lt;/a&gt;&lt;/em&gt; is a good example: while it’s a common and practical tool for today’s development needs, it works reliably with minimal configuration — often just &lt;code&gt;opts = {}&lt;/code&gt; — and provides immediate visual feedback when active, making it unlikely to cause confusion for beginners.&lt;/p&gt;

&lt;p&gt;Currently, SnaxVim includes 10 plugins, and there are no plans to increase this number. However, I will continue to monitor the maintenance status and alternatives for each plugin and revise the lineup only if a better-maintained or more appropriate plugin emerges for the same purpose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;

&lt;p&gt;If you're interested in Neovim but unsure where to begin, or if you prefer configuring things yourself but would like to leave the selection and upkeep of essential plugins to the community, SnaxVim is intended to be a solid starting point.&lt;/p&gt;

&lt;p&gt;🔗 GitHub: &lt;a href="https://github.com/SnaxVim/SnaxVim" rel="noopener noreferrer"&gt;https://github.com/SnaxVim/SnaxVim&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you find it helpful, I’d appreciate a ⭐ on GitHub!&lt;/p&gt;

</description>
      <category>neovim</category>
      <category>vim</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
