zsh-users
 help / color / mirror / code / Atom feed
From: Bart Schaefer <schaefer@brasslantern.com>
To: zsh-users@zsh.org
Subject: Re: Large LS_COLORS makes auto_cd very slow
Date: Wed, 04 Apr 2012 00:52:36 -0700	[thread overview]
Message-ID: <120404005237.ZM10249@torch.brasslantern.com> (raw)
In-Reply-To: =?iso-8859-1?Q?=3CCABZhJg-xieMZAOEmbYzSb5T-3O8aLNurvPk=3DSiXs?= =?iso-8859-1?Q?PGjTpAMg-Q=40mail=2Egmail=2Ecom=3E?= =?iso-8859-1?Q?Comments=3A_In_reply_to_Jesper_Nyg=E5rds_=3Cjesper=2Enygar?= =?iso-8859-1?Q?ds=40gmail=2Ecom=3E?= =?iso-8859-1?Q?________=22Large_LS_COLORS_makes_auto_cd_very_slow=22_=28A?= =?iso-8859-1?Q?pr__3=2C__9=3A08pm=29?=

On Apr 3,  9:08pm, Jesper Nygårds wrote:
}
} /us<tab>
} 
} whereas completion after an explicit cd is nearly instantaneous:
} 
} cd /us<tab>
} 
} It seems rather odd to me that coloring would render this so slow. I
} suppose the delay is caused by zsh trying to color some list of
} possible completions, but why would it be so very slow?

/us<tab> as the first word in the buffer is in command position, so is
completing any/all of commands, executables, builtins, functions,
aliases, suffix-aliases, reserved-words, jobs and parameters.

For each of these categories, _setup line 12 rebuilds the value of
the _comp_colors array to add new patterns such that any pattern that
started with '=' gets copied with a prefix matching the tag currently
being tested; e.g. '(commands)=...' or '(jobs)=...'

This is done even for tags that won't have any matches because the
colors array has to be ready for the internals to use when a match is
found, there's no way to "call back" to build it on demand.

The expensive bit is that _comp_colors is declared as a unique array,
so every time it gets rebuilt the resulting 1700+ entries are all
compared against one another to make sure there is no duplication.
Repeat that nine times and it takes a while.

With "cd" in front, it's restricted to directories only, so the array
is only rebuilt once.

Addenda for -workers:

Anybody want to have a stab at creating a vastly more efficient version
of Src/params.c:arrayuniq() ?  I came up with a faster way to remove the
duplicate elements, but the problem here is to efficiently determine
that there are no duplicates to remove.  Perhaps throw the elements into
a hash table and then make one pass looking up each element.


  reply	other threads:[~2012-04-04  7:53 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-04-03 19:08 Jesper Nygårds
2012-04-04  7:52 ` Bart Schaefer [this message]
2012-04-04 16:57   ` Jesper Nygårds
2012-04-05  9:30   ` Václav Zeman
2012-04-05 15:51     ` Bart Schaefer
2012-04-05 16:33       ` Bart Schaefer
2012-04-05 17:00         ` Philippe Troin
2012-04-06  9:49       ` Václav Zeman
2012-04-06 11:07         ` Mark van Dijk
2012-04-06 15:51         ` Bart Schaefer
2012-04-09  8:23         ` Václav Zeman
2012-04-09 19:28           ` Bart Schaefer
2012-04-06 18:30   ` Valodim Skywalker
2012-04-07 16:43     ` Bart Schaefer
2013-01-11 11:30 Completing all possible candidates Jesper Nygårds
2013-01-11 14:32 ` Bart Schaefer
2013-01-15  7:28   ` Jesper Nygårds
2013-01-17  3:14     ` Bart Schaefer
2013-01-17  6:28       ` Jesper Nygårds

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=120404005237.ZM10249@torch.brasslantern.com \
    --to=schaefer@brasslantern.com \
    --cc=zsh-users@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).