Skip to content

Slow performance and suggestions #169

@rewhile

Description

@rewhile

Generated by nvim --startuptime on neovim 0.8 (Filter catppuccin lines only)
Do note that this is done on a relatively powerful computer (and almost no cappuccin config) so the result on another computers can even go above 10ms

005.410  000.294  000.294: require('catppuccin')
005.459  000.047  000.047: require('catppuccin.config')
005.607  000.004  000.004: require('vim.F')
006.009  000.246  000.246: require('catppuccin.utils.hsluv')
006.012  000.354  000.108: require('catppuccin.utils.util')
006.014  000.394  000.040: require('catppuccin.main')
006.199  000.039  000.039: require('catppuccin.utils.colors')
006.205  000.190  000.151: require('catppuccin.core.mapper')
006.233  000.027  000.027: require('catppuccin.core.palettes.init')
006.289  000.054  000.054: require('catppuccin.core.palettes.mocha')
006.347  000.034  000.034: require('catppuccin.core.integrations.indent_blankline')
006.377  000.026  000.026: require('catppuccin.core.integrations.dashboard')
006.421  000.040  000.040: require('catppuccin.core.integrations.nvimtree')
006.502  000.050  000.050: require('catppuccin.core.integrations.cmp')
006.543  000.032  000.032: require('catppuccin.core.integrations.markdown')
006.575  000.025  000.025: require('catppuccin.core.integrations.telekasten')
006.611  000.024  000.024: require('catppuccin.core.integrations.symbols_outline')
006.715  000.074  000.074: require('catppuccin.core.integrations.native_lsp')
006.851  000.103  000.103: require('catppuccin.core.integrations.treesitter')
006.913  000.041  000.041: require('catppuccin.core.integrations.notify')
006.971  000.040  000.040: require('catppuccin.core.integrations.bufferline')
007.022  000.031  000.031: require('catppuccin.core.integrations.gitsigns')
007.068  000.029  000.029: require('catppuccin.core.integrations.telescope')
007.112  000.027  000.027: require('catppuccin.core.remaps')
008.252  002.655  001.411: sourcing /home/nullchilly/.local/share/nvim/site/pack/packer/start/theme/colors/catppuccin.vim

Using nvim_set_hl

Obviously, we can switch to the neovim 0.7 api nvim_set_hl while still keeping the old style
Do note that I intentionally didn't use vim.tbl_extend("keep", color, vim.split(color.style, ",")) cause performance issues (Can be solved with compiling)

ErrorMsg = { fg = cp.red, style = "bold,italic", styles = { "bold", "italic" } }

In lua/catppuccin/utils/util.lua

local has_nvim07 = vim.fn.has('nvim-0.7')

function util.highlight(group, color)
	if has_nvim07 then
		if color.styles then
			for _, style in ipairs(color.styles) do
				color[style] = true
			end
			color.styles = nil
			color.style = nil
		elseif color.style then
			if color.style ~= nil and color.style ~= "NONE" then
				color[color.style] = true
			end
			color.style = nil
		end
		vim.api.nvim_set_hl(0, group, color)
	else
		-- Doc: :h highlight-gui
		local style = color.style and "gui=" .. color.style or "gui=NONE"
		local fg = color.fg and "guifg=" .. color.fg or "guifg=NONE"
		local bg = color.bg and "guibg=" .. color.bg or "guibg=NONE"
		local sp = color.sp and "guisp=" .. color.sp or ""
		local blend = color.blend and "blend=" .. color.blend or ""
		local hl = "highlight " .. group .. " " .. style .. " " .. fg .. " " .. bg .. " " .. sp .. " " .. blend
		vim.cmd(hl)
		if color.link then
			vim.cmd("highlight! link " .. group .. " " .. color.link)
		end
	end
end

This brings load time require('catppuccin').load() down from 1.4ms to 0.8ms

005.515  000.286  000.286: require('catppuccin')
005.567  000.049  000.049: require('catppuccin.config')
005.707  000.006  000.006: require('vim.F')
006.090  000.232  000.232: require('catppuccin.utils.hsluv')
006.096  000.339  000.106: require('catppuccin.utils.util')
006.098  000.379  000.040: require('catppuccin.main')
006.272  000.038  000.038: require('catppuccin.utils.colors')
006.275  000.175  000.138: require('catppuccin.core.mapper')
006.299  000.024  000.024: require('catppuccin.core.palettes.init')
006.355  000.054  000.054: require('catppuccin.core.palettes.mocha')
006.408  000.030  000.030: require('catppuccin.core.integrations.gitsigns')
006.439  000.025  000.025: require('catppuccin.core.integrations.telescope')
006.493  000.035  000.035: require('catppuccin.core.integrations.indent_blankline')
006.536  000.038  000.038: require('catppuccin.core.integrations.dashboard')
006.587  000.047  000.047: require('catppuccin.core.integrations.bufferline')
006.622  000.029  000.029: require('catppuccin.core.integrations.markdown')
006.702  000.073  000.073: require('catppuccin.core.integrations.treesitter')
006.760  000.026  000.026: require('catppuccin.core.integrations.telekasten')
006.830  000.053  000.053: require('catppuccin.core.integrations.native_lsp')
006.876  000.023  000.023: require('catppuccin.core.integrations.symbols_outline')
006.922  000.036  000.036: require('catppuccin.core.integrations.nvimtree')
006.966  000.029  000.029: require('catppuccin.core.integrations.notify')
007.017  000.038  000.038: require('catppuccin.core.integrations.cmp')
007.059  000.023  000.023: require('catppuccin.core.remaps')
007.683  001.987  000.843: sourcing /home/nullchilly/.local/share/nvim/site/pack/packer/start/theme/colors/catppuccin.vim

Support compiling

However, the setup time is another 1.5ms and I used almost no configuration here (3 lines)

require("catppuccin").setup {
	transparent_background = true
}

pre-compiled cache is a solution provided by nightfox.nvim

require('nightfox').setup {
	options = {
		compile_path = vim.fn.stdpath("cache") .. "/nightfox",
		compile_file_suffix = "_compiled",
		transparent = true,
	}
}
vim.cmd "colorscheme nightfox"

Nightfox in comparison

012.257  000.018  000.018: sourcing /home/nullchilly/.local/share/nvim/site/pack/packer/opt/theme/plugin/nightfox.vim
012.371  000.044  000.044: require('nightfox')
012.528  000.075  000.075: require('nightfox.lib.collect')
012.574  000.043  000.043: require('nightfox.util')
012.593  000.216  000.098: require('nightfox.config')
012.671  000.039  000.039: require('nightfox.util.deprecation')
012.734  000.060  000.060: require('nightfox.lib.deprecation')
013.119  000.040  000.040: require('nightfox.lib.highlight')
013.122  000.099  000.059: require('nightfox.main')
013.145  000.021  000.021: require('nightfox.override')
013.651  000.643  000.523: sourcing /home/nullchilly/.local/share/nvim/site/pack/packer/opt/theme/colors/nightfox.vim

You can bring it down even more at around 0.5ms by not loading anything except lualine for example

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions