パスを評価するとzshが遅くなります。

パスを評価するとzshが遅くなります。

かなり長い間zshを使用してフォルダに対してオートコンプリートを実行すると、パフォーマンスの問題が発生しました。最後に、問題の原因と解決策を理解するのに時間を費やしました。残念ながら「何を」で止まらなければならず、「どのように直すか」は依然として疑問符です。

トレースが有効になっている(およびトレースが無効になっている.zshrc.local)デバッグでzshを実行すると、はっきりと見えます。

TABをダブルクリックして実行すると、次のような結果が$ cd ~/Documents/<TAB>表示されます。

....
+_cd:88> eval 'dir=( ~Documents/ )'
+(eval):1> dir=( '~Documents/' )
....

最新の応答時間は約3秒です。

cd a/<TAB>これは、フォルダオートコンプリート(、、、cd a/b/<TAB>…)のすべてのレベルで発生しますcd <TAB>

設定を試してみましたset -o magicequalsubst

答え1

_cd現在のバージョンの完成関数の88行目zshcdablevarsこのオプションが有効になっている場合にのみアクセスできるセクションにあります。

このオプションを有効にすると、ユーザーのホームディレクトリまたはストレージパスに移動cd usernameします(そのユーザーの/ varが存在し、cd var現在のディレクトリに/ディレクトリがない場合)。つまり、ディレクトリ(内部または内部)として存在しない場合のように動作します。cdusername$varusernamevar$cdpathcd foocd ~foofoo.$cdpath

cdこれで/の操作が完了しましたpushd_cd可能な完成リストとDocuments/これまでに入力した内容を作成するときは、フォルダのサブディレクトリのリストを提供する必要があります。Documents有効にしたので、cdablevarsユーザーのホームディレクトリまたはユーザーのホームディレクトリのサブディレクトリのリストを提供する必要があります。変数Documentsに格納されているディレクトリです$Documents(存在する場合)。

そのため、そうすることですeval 'dirs=( ~Documents )'

キャッシュ(LDAP、NIS +...)を持たない大規模なネットワークユーザーデータベースを持つシステムを使用している場合、拡張が遅くなる可能性があります。 zshはハッシュテーブルを使用してユーザーのホームディレクトリを検索するために呼び出すので、何百万もの変数があっても高速でなければならないzsh変数のリストを見ることができます。これはケース部分で遅くなることがあります。どちらが同じ電話をかける必要があるかを確認できます。Documentsgetpwnam("Documents")Documentsid Documentsgetpwnam()

私は個人的にこのオプションを避けたいと思います。cdablevarsいつかは間違いなくあなたに悪い驚きを与えてくれるからです。あなたはいつもそれcd ~userをしたりしないかもしれませんが、引数として提供されたディレクトリ以外のものに本当に入る場合は、明示的に要求する方が良いことがわかりましcd ~varた。cd

cdablevars基本的には、これを行うことにzsh触発され、1990年の最初のバージョンにすでに存在していました。私の考えでは、tcshそれは歴史的遺物と見なされるべきです~varcdablevars

速度低下の問題を解決する方法については、ネームgetpwnam()サービスデータベースの調整を検討できます。たとえば、使用する場合、設定を増やしてsssdバックエンドを再クエリする前にentry_negative_timeout存在しないユーザー情報をキャッシュする期間を決定できます。Documentsユーザーデータベースクエリの場合、3秒が長すぎるようです。これは、設定に問題があるか、プロバイダサーバーが利用できず、代替メカニズム(存在する場合)が最適に設定されていないことを示します。

関連情報