Làm cách nào để điểm chuẩn bashrc / zshrc và thời gian kết xuất nhanh?


6

Vì tôi hiện đang thử nghiệm những thứ mới trong lời nhắc của mình, tôi cần một cách để biết tác động hiệu suất là gì.

Làm thế nào tôi có thể theo dõi mất bao lâu để hiển thị lời nhắc của mình và thời gian để lấy nguồn. * RC?


1
Tại sao trên Trái đất bạn có một lời nhắc mất quá nhiều thời gian để hiển thị mà bạn quan tâm đến việc mất bao lâu?! Các tập tin cấu hình chỉ có nguồn gốc khi shell được bắt đầu.
một CVn

3
hiển thị thông tin cvs, trạng thái tác nhân ssh, quyền người dùng ... mất một thời gian - tôi cần tìm một sự thỏa hiệp giữa thông tin và hiệu suất. trên thực thi hệ thống * nix của tôi thường khá nhanh nhưng tôi sử dụng lời nhắc của mình trong cygwin aswell và ở đó có thể dễ dàng mất vài giây để hiển thị lời nhắc. Đó là lý do tại sao tôi cần điểm chuẩn một số phần của lời nhắc của mình.
Nicolai Fröhlich

Câu trả lời:


4

Với các lệnh này, bạn sẽ có thể định chuẩn thời gian khởi động, bao gồm tìm nguồn của các tệp RC (+ một lệnh in, không nên thêm nhiều chi phí):

time zsh -i -c "print -n"
time bash -i -c "echo -n"

Với hơn 1000 dòng trong .zshrcquá trình này, tôi mất 0,3 giây khi cài đặt cygwin. Và không, nó thực sự không có máy cao cấp (iCore2Duo P8700).

Về thời gian kết xuất nhanh chóng:

  • trong bashđó có thể xây timedựng các lệnh. Tuy nhiên, tôi không biết khả năng hiển thị $PS1như một dấu nhắc.

  • trong zshđó là chiều ngược lại, với print -P $PS1 $RPS1bạn có thể làm cho bạn nhắc với một lệnh in. (man zshbuiltins: " [print] -P Thực hiện mở rộng nhanh chóng"). Nhưng dường như thời gian không hoạt động với các lệnh dựng sẵn. Đó là lý do tại sao tôi đã hack cái này:

    cumul=0; for i ({0..99}) {
      start=$(date +%s.%N)
      end=$(date +%s.%N)
      (( cumul+= (end-start) ))
    }
    overhead=$((cumul/100.))
    cumul=0; for i ({0..99}) {
      start=$(date +%s.%N)
      print -P $PS1 $RPS1
      end=$(date +%s.%N)
      (( cumul+= (end-start) ))
    }
    print $((cumul/100. - overhead))
    

    Đầu tiên, điều này đo lường chi phí gây ra bởi các datelệnh. Nó được thực hiện 100 lần để thống kê tốt hơn. Sau đó, print -P $PS1 $RPS1bao gồm, cũng thực hiện 100 lần và chi phí được xác định trong phần đầu tiên được trừ. Các lệnh liên tiếp cho thấy rằng bạn không thể tin tưởng vào chữ số 1ms, nhưng chữ số 10ms có vẻ đáng tin cậy. Với một giá trị dự kiến ​​theo thứ tự giây sẽ đủ.

Nhưng, như @Michael Kjorling đã được đề cập trong một bình luận, lời nhắc sẽ hiển thị ngay lập tức. Vì vậy, bạn cũng nên suy nghĩ về cách tối ưu hóa lời nhắc của mình hoặc tính đến, theo kinh nghiệm của tôi, thời gian kết xuất nhanh chóng (như trong câu hỏi của bạn) chỉ là một phần rất nhỏ của thời gian hiển thị lời nhắc . (Tôi nói ở đây chủ yếu về shell Z, nhưng tôi giả sử trong bash có các khái niệm tương tự.) Bởi vì có các hàm khác được thực thi trước khi dấu nhắc được hiển thị. Đây là những gì xuất hiện ngay trong tâm trí của tôi:

  • precmd: Được thực hiện trước mỗi dấu nhắc; sử dụng which precmdđể xem nó là gì trong trường hợp của bạn
  • nếu bạn đã sharedhistorybật tùy chọn , tệp ~/.zsh_history(hoặc bất cứ thứ gì bạn đặt tên) sẽ được đọc. Đặc biệt nếu thư mục chính của bạn nằm trên một hệ thống tập tin từ xa, có thể gây ra sự chậm trễ đáng kể. Tôi cũng quan sát thỉnh thoảng vài giây trước khi lời nhắc được hiển thị khi máy chủ NFS được tải nặng.

Một công cụ để phân tích các yêu cầu về thời gian của các chương trình bên ngoài / các chức năng bên trong một cách chi tiết là zsh/zprofmô-đun, được tải bởi

zmodload zsh/zprof

Từ man zshmodules: "Khi được tải, zsh / zprof làm cho các hàm shell được định hình. Kết quả định hình có thể thu được bằng lệnh dựng sẵn zprof được cung cấp bởi mô-đun này."

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.