优化PS1生成

优化PS1生成

我非常喜欢计算速度快的定制 PS1 变量。因此,我的 Bash 脚本中有一行,我通过以下方式设置 PS1 变量

PROMPT_COMMAND='PS1="$(/home/username/.config/bash/ps1 ${PWD})"'

ps1是我自己的可执行文件,用于在给定当前工作目录的情况下获取 PS1 PWD

使用此设置按 Enter 键,会出现一个新行,而不会出现提示(我主要注意到这一点是因为光标位于该行的开头)。这种情况在常规情况下很少发生sh

让我们假设我总是站在同一个目录中,并且只需按住 Enter 键即可一遍又一遍地运行相同的进程。然后我仍然看到光标位于行的开头。然而,hyperfine

~/.c/bash $ hyperfine -N --warmup=1000 "/home/username/.config/bash/ps1 $PWD"
Benchmark 1: /home/username/.config/bash/ps1 /home/username/.config/bash
  Time (mean ± σ):       0.5 ms ±   0.1 ms    [User: 0.4 ms, System: 0.0 ms]
  Range (min … max):     0.4 ms …   2.1 ms    5335 runs

因此,对于 60 Hz 的计算机屏幕(即每帧之间大约 16 毫秒),提示应该几乎立即生成,并且很少应该绘制空白线。

尽管可执行文件非常快,为什么会发生这种情况?从结果中可以看出,可执行文件经过了相当优化,但它确实包含一些fopen和 一个或两个freadfclose,以及一个printf

我可以更快地生成/打印 PS1 吗?如果可以的话,怎样做?

答案1

我确实设法解决了这个问题。我下载了Bash的源代码并将其源代码/home/username/.config/bash/ps1合并到Bash源代码中。关键是static void execute_prompt_command()改变eval.c.你可能需要学习 Bash 的一些内部原理,但我在下载源代码后大约 15 分钟就完成了。例如,我必须通过pwd = get_string_value("PWD")而不是从获取 PWD argv。它按预期工作并且速度极快!

相关内容