- 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 Starship và tì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
Tùy biến prompt
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
Mẹo bổ sung
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
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.
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.
Đâ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..
Đúng là dân dev, chỉ vì mấy ms vô nghĩa mà cũng làm quá lên haha
Chẳng phải công nghệ đang phát triển cũng chỉ vì vài ms thừa thãi đó sao?
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.
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...
Tôi đã chuyển sang starship rồi.
Ý 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
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ảnTôi nghĩ bạn sẽ không hối hận nếu thử
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
Nói đùa thôi, nhưng chép
.bashrcrõ ràng dễ hơn rất nhiều so với cài cả một shell mặc địnhMỗ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
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
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
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-eKhi 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
C-x C-ethực sự hữu ích như vậyPhần lớn thời gian tôi ở insert mode, và chỉ dùng
C-x C-ekhi cần chỉnh sửa lớnNếu đã quen với key binding kiểu vi thì các lệnh như
w,b,dwcòn nhanh hơn nhờ trí nhớ cơ bắpMở 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
hyperfinethì shell đăng nhập mất khoảng 54ms, shell thường khoảng 6msTôi nghĩ độ trễ 380ms có thể đến từ nguyên nhân khác
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 -llà shell đăng nhập nên không nạpzshrcPhải test bằng
zsh -ic exitXem thêm trong hướng dẫn zsh-bench
zprofvào.zshrcextract,z,fzfTô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
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
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
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/
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
Nó 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
starshiplàm prompt nên gần như không cần cấu hình thêmCho đế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
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
Cùng lắm khoảng 20 lần, và như vậy thì chẳng phải vấn đề lớ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ự