ใน bash touch
เป็นไบนารีภายนอก แต่echo
เป็นshell builtin :
$ type echo
echo is a shell builtin
$ type touch
touch is /usr/bin/touch
เนื่องจากtouch
เป็นไบนารีภายนอกและคุณเรียกใช้touch
หนึ่งครั้งต่อไฟล์เชลล์จะต้องสร้างอินสแตนซ์ 300,000 ครั้งtouch
ซึ่งใช้เวลานาน
echo
อย่างไรก็ตามเป็นเชลล์บิลด์อินและการดำเนินการเชลล์บิวด์อินไม่จำเป็นต้องมีการฟอร์กเลย เชลล์ปัจจุบันทำการดำเนินการทั้งหมดและไม่มีกระบวนการภายนอกถูกสร้างขึ้นแทน นี่คือเหตุผลว่าทำไมมันเร็วขึ้นมาก
นี่คือสองโปรไฟล์ของการดำเนินการของเชลล์ touch
คุณจะเห็นว่าจำนวนมากของเวลาที่ใช้ในการโคลนกระบวนการใหม่เมื่อใช้ การใช้/bin/echo
แทนตัวเชลล์ในตัวควรแสดงผลลัพธ์ที่เปรียบเทียบได้มากกว่า
การใช้ระบบสัมผัส
$ strace -c -- bash -c 'for file in a{1..10000}; do touch "$file"; done'
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
56.20 0.030925 2 20000 10000 wait4
38.12 0.020972 2 10000 clone
4.67 0.002569 0 80006 rt_sigprocmask
0.71 0.000388 0 20008 rt_sigaction
0.27 0.000150 0 10000 rt_sigreturn
[...]
ใช้เสียงสะท้อน
$ strace -c -- bash -c 'for file in b{1..10000}; do echo >> "$file"; done'
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
34.32 0.000685 0 50000 fcntl
22.14 0.000442 0 10000 write
19.59 0.000391 0 10011 open
14.58 0.000291 0 20000 dup2
8.37 0.000167 0 20013 close
[...]
echo >> $file
จะเพิ่มบรรทัดใหม่ให้$file
และทำการแก้ไข ฉันคิดว่ามันจะเหมือนกันสำหรับ OS / Xecho -n >> $file
หากคุณไม่ต้องการที่จะใช้