เชลล์วนรอบช้าและทุบตีช้าที่สุด Shell ไม่ได้หมายถึงการทำงานหนักเป็นลูป เชลล์มีจุดประสงค์เพื่อเปิดตัวกระบวนการภายนอกที่ได้รับการปรับแต่งให้ดีที่สุดในกลุ่มข้อมูล
อย่างไรก็ตามฉันอยากรู้ว่าการเปรียบเทียบลูปของเชลล์เป็นอย่างไรดังนั้นฉันจึงสร้างมาตรฐานเล็กน้อย:
#!/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
(
รายละเอียด:
- CPU: Intel (R) Core (TM) i5 CPU M 430 @ 2.27GHz
- ksh: version sh (การวิจัยของ AT&T) 93u + 2012-08-01
- bash: GNU bash, รุ่น 4.3.11 (1) - ปล่อย (x86_64-pc-linux-gnu)
- zsh: zsh 5.2 (x86_64-unknown-linux-gnu)
- เส้นประ: 0.5.7-4ubuntu1
)
ผลลัพธ์ (ตัวย่อ) (เวลาต่อการทำซ้ำ) คือ:
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
จากผลลัพธ์:
หากคุณต้องการเชลล์เชลล์ที่เร็วขึ้นเล็กน้อยจากนั้นถ้าคุณมี[[
ไวยากรณ์และคุณต้องการเชลล์เชลล์ที่รวดเร็วคุณอยู่ในเชลล์ขั้นสูงและคุณมี C-like สำหรับลูปด้วยเช่นกัน ใช้ C like for loop แล้ว พวกเขาสามารถเร็วประมาณ 2 ครั้งเท่ากับwhile [
-loops ในเชลล์เดียวกัน
- kshมี
for (
ลูปที่เร็วที่สุดที่ประมาณ2.7µsต่อการวนซ้ำ
- เส้นประมี
while [
วงที่เร็วที่สุดที่ประมาณ5.8 per ต่อการวนซ้ำ
C สำหรับลูปสามารถเรียงลำดับทศนิยมได้เร็วกว่า 3-4 (ฉันได้ยิน Torvalds รัก C)
C ที่ปรับให้เหมาะสมสำหรับลูปคือ 56500 เท่าเร็วกว่าwhile [
ลูปของ bash (เชลล์เชลล์ที่ช้าที่สุด) และ 6750 เท่าเร็วกว่าfor (
ลูปksh (เชลล์วงที่เร็วที่สุด)
อีกครั้งความช้าของเชลล์ไม่ควรมีความสำคัญมากนักเนื่องจากรูปแบบทั่วไปที่มีเชลล์คือการถ่ายโอนไปยังโปรเซสภายนอกภายนอก
ด้วยรูปแบบนี้เชลล์มักทำให้การเขียนสคริปต์ง่ายขึ้นด้วยประสิทธิภาพที่เหนือกว่าสคริปต์ python (ครั้งสุดท้ายที่ฉันตรวจสอบการสร้างไพพ์ไลน์ของกระบวนการในไพ ธ อนค่อนข้างเงอะงะ)
อีกสิ่งที่ควรพิจารณาคือเวลาเริ่มต้น
time python3 -c ' '
ใช้เวลา 30 ถึง 40 ms บนพีซีของฉันในขณะที่เชลล์ใช้เวลาประมาณ 3 มิลลิวินาที หากคุณเปิดใช้งานสคริปต์จำนวนมากสิ่งนี้จะเพิ่มขึ้นอย่างรวดเร็วและคุณสามารถทำได้มากใน 27-37 ms พิเศษที่ python ใช้เพื่อเริ่มต้นเท่านั้น สคริปต์ขนาดเล็กสามารถเสร็จสิ้นได้หลายครั้งในช่วงเวลานั้น
(NodeJs อาจเป็นสคริปต์รันไทม์ที่เลวร้ายที่สุดในแผนกนี้เนื่องจากใช้เวลาประมาณ 100ms ในการเริ่มต้น (แม้ว่าเมื่อเริ่มต้นแล้วคุณจะต้องพยายามอย่างหนักที่จะหานักแสดงที่ดีขึ้นในภาษาสคริปต์)