Các vòng lặp Shell chậm và bash là chậm nhất. Vỏ không có nghĩa là làm công việc nặng trong các vòng lặp. Shell có nghĩa là để khởi chạy một vài quy trình bên ngoài, được tối ưu hóa trên các lô dữ liệu.
Dù sao, tôi đã tò mò làm thế nào so sánh các vòng vỏ để tôi thực hiện một điểm chuẩn nhỏ:
#!/bin/bash
export IT=$((10**6))
echo POSIX:
for sh in dash bash ksh zsh; do
TIMEFORMAT="%RR %UU %SS $sh"
time $sh -c 'i=0; while [ "$IT" -gt "$i" ]; do i=$((i+1)); done'
done
echo C-LIKE:
for sh in bash ksh zsh; do
TIMEFORMAT="%RR %UU %SS $sh"
time $sh -c 'for ((i=0;i<IT;i++)); do :; done'
done
G=$((10**9))
TIMEFORMAT="%RR %UU %SS 1000*C"
echo 'int main(){ int i,sum; for(i=0;i<IT;i++) sum+=i; printf("%d\n", sum); return 0; }' |
gcc -include stdio.h -O3 -x c -DIT=$G -
time ./a.out
(
Chi tiết:
- CPU: Intel (R) Core (TM) i5 CPU M 430 @ 2.27GHz
- ksh: phiên bản sh (Nghiên cứu AT & T) 93u + 2012-08-01
- bash: GNU bash, phiên bản 4.3.11 (1) -release (x86_64-pc-linux-gnu)
- zsh: zsh 5.2 (x86_64-unknown-linux-gnu)
- dấu gạch ngang: 0,5,7-4ubfox1
)
Các kết quả (viết tắt) (thời gian mỗi lần lặp) là:
POSIX:
5.8 µs dash
8.5 µs ksh
14.6 µs zsh
22.6 µs bash
C-LIKE:
2.7 µs ksh
5.8 µs zsh
11.7 µs bash
C:
0.4 ns C
Từ kết quả:
Nếu bạn muốn một vòng lặp shell nhanh hơn một chút, thì nếu bạn có [[
cú pháp và bạn muốn một vòng lặp shell nhanh, thì bạn đang ở trong một trình bao nâng cao và bạn cũng có vòng lặp giống như C. Sử dụng vòng lặp C like cho, sau đó. Chúng có thể nhanh gấp khoảng 2 lần so với while [
-loops trong cùng một lớp vỏ.
- ksh có
for (
vòng lặp nhanh nhất với khoảng 2,7 Lời mỗi lần lặp
- dash có
while [
vòng lặp nhanh nhất với khoảng 5,8 Cước mỗi lần lặp
C cho các vòng lặp có thể là 3-4 bậc thập phân có độ lớn nhanh hơn. (Tôi nghe nói Torvalds yêu C).
Vòng lặp C được tối ưu hóa nhanh hơn 56500 lần so với while [
vòng lặp của bash (vòng lặp shell chậm nhất) và nhanh hơn 6750 lần so với for (
vòng lặp của ksh (vòng lặp shell nhanh nhất).
Một lần nữa, sự chậm chạp của shell không quan trọng lắm, bởi vì mẫu điển hình với shell là giảm tải cho một vài quy trình của các chương trình tối ưu hóa bên ngoài.
Với mẫu này, shell thường giúp việc viết tập lệnh dễ dàng hơn nhiều so với tập lệnh python (lần trước tôi đã kiểm tra, việc tạo các đường dẫn quy trình trong python khá vụng về).
Một điều khác cần xem xét là thời gian khởi động.
time python3 -c ' '
mất 30 đến 40 ms trên PC của tôi trong khi shell mất khoảng 3ms. Nếu bạn khởi chạy rất nhiều tập lệnh, điều này sẽ nhanh chóng tăng lên và bạn có thể làm rất nhiều trong 27-37 ms mà python chỉ cần bắt đầu. Các kịch bản nhỏ có thể được hoàn thành nhiều lần trong khung thời gian đó.
(NodeJs có lẽ là thời gian chạy kịch bản tồi tệ nhất trong bộ phận này vì chỉ mất khoảng 100ms để bắt đầu (mặc dù khi nó đã bắt đầu, bạn khó có thể tìm thấy một trình diễn tốt hơn giữa các ngôn ngữ kịch bản)).