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

따라서 60Hz 컴퓨터 화면(즉, 각 프레임 간 약 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")from 대신 PWD를 통해 가져와야 합니다 argv. 예상대로 작동하며 매우 빠릅니다!

관련 정보