17 điểm bởi GN⁺ 2026-01-11 | 9 bình luận | Chia sẻ qua WhatsApp
  • Oh My Zsh (OMZ) vẫn được khuyên dùng rộng rãi, nhưng gây ra gánh nặng script không cần thiết làm chậm thời gian khởi động shell
  • OMZ được viết bằng shell script nên mỗi khi mở tab terminal mới đều phải thông dịch toàn bộ script, và chỉ với cấu hình mặc định cũng phát sinh khoảng 0,38 giây độ trễ
  • Nếu dùng cấu hình Zsh tối giản cùng prompt Starshiptìm kiếm lịch sử dựa trên fzf, có thể rút thời gian khởi động xuống còn 0,07 giây
  • Starship tạo prompt bằng một binary duy nhất, thay thế các plugin git, môi trường ảo, và theo ngôn ngữ của OMZ
  • So với plugin phức tạp, cấu hình shell tinh gọn chỉ tự thêm những tính năng cần thiết sẽ hiệu quả hơn

Vấn đề hiệu năng của Oh My Zsh

  • Oh My Zsh (OMZ) vẫn được dùng nhiều, nhưng làm giảm tốc độ khởi động shell do gánh nặng dư thừa (bloat)
    • OMZ được tạo thành từ các shell script, nên mỗi lần mở tab terminal mới đều phải thông dịch toàn bộ script
    • Với cấu hình gồm các plugin mặc định (git, zsh-autosuggestions, zsh-autocomplete), khi chạy /usr/bin/time -f "%e seconds" zsh -i -c exit thì mất 0,38 giây
  • Khi mở tab mới trong thư mục repo git, cảm nhận thực tế là có khoảng 1 giây độ trễ
  • OMZ định kỳ kiểm tra cập nhật, và quá trình này gây ra thêm vài giây chậm trễ
  • Việc cập nhật cấu hình shell quá thường xuyên là không cần thiết; nên dùng cấu hình đơn giản chỉ tự thêm những tính năng cần thiết

Cấu hình Zsh tối giản

  • Cấu hình Zsh tối giản được đề xuất như sau
    export HISTSIZE=1000000000
    export SAVEHIST=$HISTSIZE
    setopt EXTENDED_HISTORY
    setopt autocd
    autoload -U compinit; compinit
    
    • HISTSIZESAVEHIST dùng để chỉ định kích thước lịch sử lệnh
    • EXTENDED_HISTORY thêm dấu thời gian vào lịch sử
    • autocd cho phép chuyển thư mục mà không cần lệnh cd
    • compinit dùng để khởi tạo hệ thống tự động hoàn thành
  • Chỉ với cấu hình này cũng đã cung cấp một môi trường shell cơ bản có hỗ trợ hoàn thành

Tùy biến prompt

  • Prompt sử dụng Starship
    • Starship là một prompt nhanh và tối giản được đóng gói trong một binary duy nhất
    • Nó thay thế plugin và theme hiện có của OMZ, đồng thời hiển thị trạng thái git, môi trường ảo và theo ngôn ngữ
  • Trong ví dụ cấu hình Starship, các hiển thị liên quan đến cloud như AWS, GCP, Azure, NodeJS được tắt để giảm nhiễu thị giác
  • Trong các dự án Python và Rust, ngôn ngữ tương ứng sẽ được nhấn mạnh trên prompt, đồng thời thời gian chạy lệnh cũng được hiển thị
  • Chỉ cần thêm một dòng sau vào .zshrc để kích hoạt
    eval "$(starship init zsh)"
    

Tìm kiếm lịch sử

  • Plugin zsh-autosuggestions thường được dùng có thể hiển thị gợi ý khi đang nhập và làm phân tán sự chú ý
  • Thay vào đó, có thể bind fzf vào Ctrl+R để duyệt lịch sử bằng tìm kiếm mờ tương tác (fuzzy search)
    source <(fzf --zsh)
    

Kết quả cải thiện hiệu năng

  • Sau khi áp dụng cấu hình trên, thời gian khởi động shell như sau
    ❯ /usr/bin/time -f "%e seconds" zsh -i -c exit
    0.07 seconds
    
  • Nhanh hơn khoảng hơn 5 lần so với OMZ

Mẹo bổ sung

  • Người dùng Vim có thể bật chế độ Vim trong Zsh để tăng tốc chỉnh sửa lệnh
    set -o vi
    bindkey -v '^?' backward-delete-char
    
    • zle mặc định dùng key binding kiểu Emacs, nên cấu hình này sẽ bổ sung cách nhập kiểu Vim

Kết luận và trường hợp sử dụng

  • Sau khi chuyển từ OMZ, tác giả đã thích nghi với workflow mới chỉ sau vài ngày
  • Các plugin cần thiết vẫn có thể tự tải thủ công
  • Việc mở nhiều tab là do tác giả dùng tmux và trình soạn thảo chạy trong terminal (helix) cùng nhau
    • Trong tmux, chạy lazygit và trình quản lý file yazi dưới dạng popup
    • Dùng các khung chia tạm thời để chạy code và xem đầu ra test, mỗi khung hoạt động như một phiên shell riêng

Tóm tắt bình luận

  • Một số người dùng cho rằng thời gian khởi động của OMZ ở mức 0,03 giây là đã đủ nhanh
  • Tác giả chỉ ra rằng plugin zsh-autocomplete là nguyên nhân làm chậm
  • Trong kết quả zsh-bench, độ trễ đến prompt đầu tiên của OMZ là 603ms, còn cấu hình Zsh đơn giản là 103ms
  • Starship thay thế các chức năng liên quan đến prompt của OMZ bằng một công cụ duy nhất
  • Những người dùng khác cũng nhắc đến các lựa chọn thay thế như Zimfw, Atuin, và prompt bash tự viết

9 bình luận

 
roxie 2026-02-27

Nếu không tối ưu hóa thì đúng là rất chậm. Nhưng vì có khá nhiều tính năng đã quen tay rồi nên cũng hơi khó để rời bỏ nó,, không dễ chút nào.

 
tesha001 2026-01-12

Mình vẫn chưa cảm thấy nó bất tiện đến mức dễ nhận ra như vậy.

 
princox 2026-01-12

Đây đâu phải máy chủ web, nên nếu không gây bất tiện đến mức cảm nhận rõ thì cứ để vậy thôi..

 
zxcv123 2026-01-11

Đúng là dân dev, chỉ vì mấy ms vô nghĩa mà cũng làm quá lên haha

 
kayws426 2026-01-12

Chẳng phải công nghệ đang phát triển cũng chỉ vì vài ms thừa thãi đó sao?

 
t7vonn 2026-01-11

Nếu bạn thường xuyên dùng terminal, độ trễ tăng thêm do omz gây ra thực sự khá khó chịu.

 
devfluotin 2026-01-12

Mấy tháng trước tôi đã chuyển sang prezto, và đúng là cũng tự hỏi không biết omz vốn đã chậm thế này sao.
Chỉ cần bật vài plugin cơ bản thôi là đã chậm hẳn đi...

 
wedding 2026-01-14

Tôi đã chuyển sang starship rồi.

 
GN⁺ 2026-01-11
Ý kiến trên Hacker News
  • Tôi chỉ có đúng một lý do để dùng oh-my-zsh
    Đó là để có một môi trường shell cho năng suất tức thì mà có thể dùng ngay trên máy mới, host từ xa hay container
    Thay vì tốn hàng giờ tự chỉnh cấu hình, tôi muốn dành thời gian đó cho những việc quan trọng hơn

    • Tôi muốn khuyên bạn thử Starship
      Vẫn giữ được trải nghiệm “cài xong là dùng”, nhưng không có độ trễ prompt hơn 200ms
      Cài đặt bằng một dòng curl, và cấu hình cũng đơn giản
      Tôi nghĩ bạn sẽ không hối hận nếu thử
    • Nếu là máy cho phép cấu hình tùy chỉnh, tôi nghĩ tốt hơn nên chép bộ dotfiles tự làm của mình sang dùng
      Chỉ cần tạo file cấu hình một lần và quản lý bằng git, là có thể dùng y hệt trên các máy khác
      Tôi cũng chỉ cần mang dotfiles sang khi setup máy mới là có ngay môi trường quen thuộc
    • Chẳng phải dotfiles vốn được tạo ra cho đúng mục đích đó sao?
      Nói đùa thôi, nhưng chép .bashrc rõ ràng dễ hơn rất nhiều so với cài cả một shell mặc định
    • Tôi cũng từng dùng Oh My Zsh, nhưng bỏ vì nó quá chậm
      Mỗi lần mở tab lại phải đợi, rất bực mình
      Cuối cùng tôi chỉ tự cài vài plugin cần thiết bằng Homebrew, chưa tới một giờ là xong
      Giờ tôi dùng một shell nhanh và nhẹ hơn nhiều, nên năng suất hơn và cũng thấy dễ chịu hơn
    • Zim cũng ổn. Nó nhanh hơn Oh My Zsh và cấu hình đơn giản
      Tốc độ khởi động shell rất nhanh và việc thiết lập cũng dễ
  • Vì thế tôi chuyển sang fish
    Nó không hoàn toàn đúng gu tôi, nhưng cấu hình mặc định đủ tốt nên tôi cứ thế quen luôn
    Giờ gần như tôi không còn phải bận tâm đến cấu hình shell nữa

    • Điểm hay của cách này là chỉ cần cài fish trên bất kỳ host nào là có thể dùng cùng một môi trường mà không cần cấu hình thêm
    • fish có hiệu năng tốt và UX rất ổn ngay từ mặc định
      Tuy vậy, tôi khuyên người mới nên đọc qua key binding
      Tôi từng thấy đồng đội làm chậm hẳn chỉ vì không biết tab completion hay các tính năng như shift+arrow
    • Tôi tò mò không biết mặc định của nó còn thiếu gì
      Thỉnh thoảng tôi chỉ thêm vim binding hoặc plugin fuzzy find
      Chỉ riêng fish mặc định thôi cũng đã quá ổn rồi
  • Tôi không đồng ý với ý kiến khuyên bật Vim mode trong Zsh
    Readline mặc định cũng đã đủ tốt cho các lệnh đơn lẻ
    Lệnh dài thì chỉ cần sửa bằng C-x C-e
    Khi pair programming, việc chuyển qua lại giữa các mode của Vim trông còn làm chậm hơn

    • Hóa ra giờ tôi mới biết phím tắt C-x C-e thực sự hữu ích như vậy
    • Tôi cũng đã thêm lại các binding của readline sau khi bật Vim mode
      Phần lớn thời gian tôi ở insert mode, và chỉ dùng C-x C-e khi cần chỉnh sửa lớn
    • Chuyển mode chỉ là bấm một phím nên không có lý do gì phải chậm
      Nếu đã quen với key binding kiểu vi thì các lệnh như w, b, dw còn nhanh hơn nhờ trí nhớ cơ bắp
      Mở editor làm gián đoạn luồng làm việc và còn che mất output nên tôi không thích
      Tôi cũng ước shell có những thứ như chức năng xóa giữa các ký tự của Vim (di")
  • Tôi cũng chỉ dùng oh-my-zsh như bộ thiết lập mặc định
    Tôi chỉ dùng plugin git, còn các hàm tùy chỉnh thì tự động nạp
    Đo bằng hyperfine thì shell đăng nhập mất khoảng 54ms, shell thường khoảng 6ms
    Tôi nghĩ độ trễ 380ms có thể đến từ nguyên nhân khác

    • Nếu bạn quan tâm đến hiệu năng zsh, tôi khuyên dùng zsh4humans
      Nó có thể khởi động tức thì, và vì đang ở chế độ bảo trì nên lại giúp tránh lãng phí thời gian
    • zsh -l là shell đăng nhập nên không nạp zshrc
      Phải test bằng zsh -ic exit
      Xem thêm trong hướng dẫn zsh-bench
    • Đo chính xác hơn thì nên thêm zprof vào .zshrc
      zmodload zsh/zprof
      ...
      zprof
      
    • Tôi cũng khuyên benchmark khi đang ở trong một git repository
    • Bạn cũng nên thử các plugin như extract, z, fzf
  • Tôi đã chuyển sang dùng fish + starship
    fish mặc định đã có tự động hoàn thành và tô sáng cú pháp, nên thay được phần lớn tính năng chính của oh-my-zsh
    Xem bài viết liên quan

    • Nhưng fish lại không tương thích POSIX, nên cũng có điểm bất tiện
      Vì vậy tôi vẫn giữ zsh+starship+kịch bản init đơn giản
      Tôi rất muốn fish đạt mức “cứ thế là chạy”, nhưng hiện tại vẫn còn thiếu một chút
    • Tôi cũng dùng zsh hàng chục năm, nhưng từ năm ngoái đã đổi sang fish và vẫn đang dùng
      Việc không có HEREDOC và không chạy được khối nền thì khá bất tiện,
      nhưng dạo này tôi thích dùng các ngôn ngữ có thể build thành binary đơn lẻ hơn thay vì script phức tạp
      Khi nó ổn định hơn, tôi định chuyển sang nushell
    • Thật ra fish đã đủ tuyệt ngay ở trạng thái mặc định, nên gần như không cần tùy biến gì
  • Tôi đã chuyển sang Zim vài năm trước
    Nó có đủ mọi thứ tôi cần, lại nhanh và dễ cài
    https://zimfw.sh/

    • Zimfw có hệ thống cài đặt rất nhanh và linh hoạt
      Nó hỗ trợ nhiều nguồn và định dạng khác nhau, đồng thời tích hợp mã zsh cũng rất tốt
      vượt trội hơn hẳn về tốc độ và khả năng tương thích so với phần lớn hệ thống plugin
      Đây thực sự là một framework rất hay
  • Khoảng 15 năm trước, hồi còn học đại học, tôi đã cài oh-my-zsh,
    và từ đó hài lòng đến mức không thấy cần thử shell hay cấu hình nào khác nữa
    Mỗi lần setup máy mới, đó luôn là thứ tôi cài đầu tiên

  • Tôi đã dùng oh-my-zsh rất lâu, nhưng lần này dùng Claude để gỡ nó chỉ trong 5 phút
    Tôi thay các tính năng cần thiết bằng raw zsh
    Vì tôi dùng starship làm prompt nên gần như không cần cấu hình thêm
    Cho đến giờ thì mọi thứ có vẻ vẫn hoạt động tốt

  • Có người cho rằng việc phàn nàn về độ trễ 0,5 giây của oh-my-zsh là hơi quá
    Cứ dùng bash với KDE konsole là đủ rồi
    Shell chỉ là một lớp bọc đơn giản cho công việc, nên không cần bận tâm đến kiểu tối ưu vi mô này

    • Nhưng nếu bạn làm việc xoay quanh terminal, bạn sẽ mở hàng chục shell mỗi ngày
      Mỗi shell đều là một phần của luồng công việc, nên độ trễ dù chỉ 1 giây cũng cảm nhận rất rõ
      Vì thế tôi cho rằng shell nhanh là rất quan trọng
    • Ngược lại, cũng có người hỏi một ngày thực ra bạn mở shell bao nhiêu lần
      Cùng lắm khoảng 20 lần, và như vậy thì chẳng phải vấn đề lớn
    • Một người khác lại cho rằng đây đơn giản là sở thích cá nhân
      Hiệu năng tốt thì dĩ nhiên đáng thích, nhưng không phải là vấn đề mang tính cốt lõi
  • Cấu hình zsh của tôi dài khoảng 90 dòng và chỉ dùng 3 plugin (compinit, vcs-info, edit-command-line)
    Từ lúc khởi động đến lúc thoát mất khoảng 0,32 giây
    Trong các repository lớn sẽ có độ trễ do lấy thông tin branch
    Có thể xử lý việc này bằng tiện ích cache bkt (https://github.com/dimo414/bkt)
    Có lẽ Starship cũng dùng cách cache tương tự